加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:31:18 所属栏目:Java 来源:网络整理
导读:我已经使用LinkedHashMap与accessOrder true,并允许最多500个条目在任何时候作为数据的LRU缓存.但是由于可扩展性问题,我想转到一些线程安全的替代方案. ConcurrentHashMap在这方面似乎很好,但缺少在LinkedHashMap中找到的accessOrder和removeEldestEntry(Map
我已经使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读