gpt4 book ai didi

java - 如何实现与LinkedHashMap类似的ConcurrentHashMap?

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:42 28 4
gpt4 key购买 nike

我使用了 LinkedHashMapaccessOrder 为 true,并且在任何时候都允许最多 500 个条目作为数据的 LRU 缓存。但由于可伸缩性问题,我想转向一些线程安全的替代方案。 ConcurrentHashMap 在这方面似乎不错,但缺少 accessOrderremoveEldestEntry(Map.Entry e) 的功能,可在 LinkedHashMap 。谁能指出一些链接或帮助我简化实现。

最佳答案

我最近用 ConcurrentHashMap<String,CacheEntry> 做了类似的事情,其中 CacheEntry 包装实际项目并添加缓存逐出统计信息:过期时间、插入时间(用于 FIFO/LIFO 逐出)、最后使用时间(用于 LRU/MRU 逐出)、命中次数(用于 LFU/MFU 逐出)等。实际驱逐是同步的并创建一个 ArrayList<CacheEntry>并使用适当的 Comparator 对它执行 Collections.sort() 以用于驱逐策略。由于这是昂贵的,因此每次逐出都会删除 CacheEntries 底部的 5%。不过,我确信性能调整会有所帮助。

在你的例子中,因为你在做 FIFO,你可以保留一个单独的 ConcurrentLinkedQueue .将对象添加到 ConcurrentHashMap 时,对该对象执行 ConcurrentLinkedQueue.add()。当你想驱逐一个条目时,执行一个 ConcurrentLinkedQueue.poll() 来移除最旧的对象,然后将它也从 ConcurrentHashMap 中移除。

更新:该领域的其他可能性包括 Java 集合 synchronization wrapper和 Java 1.6 ConcurrentSkipListMap .

关于java - 如何实现与LinkedHashMap类似的ConcurrentHashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1815646/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com