java – 如何使用LinkedHashMap中的功能实现ConcurrentHashMap?

前端之家收集整理的这篇文章主要介绍了java – 如何使用LinkedHashMap中的功能实现ConcurrentHashMap?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经使用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.

原文链接:https://www.f2er.com/java/125118.html

猜你在找的Java相关文章