如何使用LinkedHashMap中的类似功能实现ConcurrentHashMap?

DKS*_*ore 14 java performance multithreading concurrenthashmap linkedhashmap

我使用LinkedHashMapaccessOrdertrue,随时允许最多500个条目作为数据的LRU缓存.但由于可扩展性问题,我想转向一些线程安全的替代方案.ConcurrentHashMap在这方面似乎很好,但缺乏的特点accessOrderremoveEldestEntry(Map.Entry e)发现LinkedHashMap.任何人都可以指向某些链接或帮助我简化实施.

Jim*_*ans 11

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

在您的情况下,由于您正在执行FIFO,因此可以保留单独的ConcurrentLinkedQueue.将对象添加到ConcurrentHashMap时,请执行该对象的ConcurrentLinkedQueue.add().如果要逐出条目,请执行ConcurrentLinkedQueue.poll()以删除最旧的对象,然后将其从ConcurrentHashMap中删除.

更新:此领域的其他可能性包括Java Collections 同步包装器和Java 1.6 ConcurrentSkipListMap.