我最近做了类似的事情,其中CacheEntry包装了实际项目并添加了缓存逐出统计信息:过期时间,插入时间(对于FIFO / LIFO逐出),上次使用时间(对于LRU / MRU逐出),命中数(对于LFU / MFU逐出)等。实际的逐出是同步的,并使用逐出策略的相应比较器在其上创建并执行 Collections.sort()。由于这很昂贵,因此每次逐出都会从CacheEntries的底部5%中剔除。我相信性能调优会有所帮助。ConcurrentHashMap<String,CacheEntry>
ArrayList<CacheEntry>
在你的情况下,由于你正在执行FIFO,你可以保留一个单独的 ConcurrentLinkedQueue。将对象添加到 ConcurrentHashMap 时,请执行该对象的 ConcurrentLinkedQueue.add()。当您要逐出条目时,请执行 ConcurrentLinkedQueue.poll() 以删除最旧的对象,然后将其从 ConcurrentHashMap 中删除。
更新:此领域的其他可能性包括Java Collections同步包装器和Java 1.6 ConcurrentSkipListMap。