今天看到 Spring 中的 ConcurrentLruCache 实现,本文简要记录。
1 | /** |
最为核心的方法即为 get
方法,其实现思路在上方增加了注释。关键点在于读锁那部分代码是允许多线程执行的,而我们又需要维护 queue
中节点的顺序,所以选用了线程安全的队列实现:ConcurrentLinkedDeque
。唯一不理解的就是对 cache
的修改操作都被写锁保护,在当前实现中 cache
由 ConcurrentHashMap
实现,是否可以更换为 HashMap
实现呢?
关于该实现,有用户提交 issue 反馈链表中的 O(n)
扫描效率低下,建议替换为 ConcurrentLinkedHashMap,详情可参考:Revisit ConcurrentLruCache implementation · Issue #26320。
Reference
spring-framework/ConcurrentLruCache.java at v5.3.14 · spring-projects/spring-framework · GitHub
Why does ConcurrentLruCache in Spring still use thread-safe maps and queues instead of ordinary maps and queues even when read-write lock are used? - Stack Overflow