我已经使用LinkedHashMap与accessOrder true,并允许最多500个条目在任何时候作为数据的LRU缓存.但是由于可扩展性问题,我想转到一些线程安全的替代方案. ConcurrentHashMap在这方面似乎很好,但缺少在LinkedHashMap中找到的accessOrder和removeEldestEntry(Map.Entry e)的功能.任何人都可以指出一些链接或帮助我缓解实施.
解决方法
我最近用ConcurrentHashMap< String,CacheEntry>做了类似的事情,其中CacheEntry包装了实际的项目,并添加了缓存驱逐统计:到期时间,插入时间(FIFO / LIFO驱逐),最后使用时间(LRU / MRU驱逐),数字的命中(对于LFU / MFU驱逐)等.实际驱逐是同步的,并创建一个ArrayList< CacheEntry>并使用适当的比较器来执行Collections.sort()来执行驱逐策略.由于这是昂贵的,所以每次驱逐然后摆脱了CacheEntries的底部5%.我确定性能调整将有所帮助.
在您的情况下,由于您正在执行FIFO,您可以单独保留一个ConcurrentLinkedQueue.将对象添加到ConcurrentHashMap时,请执行该对象的ConcurrentLinkedQueue.add().当您要逐出某个条目时,请执行ConcurrentLinkedQueue.poll()以删除最旧的对象,然后将其从ConcurrentHashMap中删除.
更新:此领域的其他可能性包括Java Collections synchronization wrapper和Java 1.6 ConcurrentSkipListMap.