上一题下一题

多线程本地缓存使用 LinkedHashMap 实现 LRU,压测时出现数据错乱和淘汰不稳定,如何评估同步方案、并发容器替代方案及锁粒度?

旗舰版
来源:tencent中级工程师锁粒度优化LinkedHashMap LRU并发安全缓存一致性高并发缓存方案设计
草稿该题目为草稿状态,前台公开题库中不可见。
答案解析

我会先区分两个问题:一是 LinkedHashMap 本身的线程安全,二是并发场景下 LRU 淘汰语义是否满足要求。

问题定位

如果使用 accessOrder=true,get 不是真正的只读操作,它会调整双向链表,把访问节点移动到队尾。因此 get、put、remove、淘汰最老节点等操作都会同时修改哈希表或链表结构。

多个线程直接操作 LinkedHashMap,可能出现更新丢失、链表顺序错误、size 不准确、淘汰对象不符合预期,甚至在结构修改过程中产生数据异常。压测时不能只看有没有异常,还要验证:

任意时刻 size 是否不超过容量; 同一个 key 是否出现与操作顺序不一致的 value; get 后该 key 是否确实变成最近访问节点; put 后是否在同一个原子操作中完成更新和淘汰; 并发删除、更新、淘汰时是否会误删新数据; p99 延迟、吞吐量、CPU、锁竞争和 GC 是否可接受。

同步方案评估

最简单、语义最准确的是给整个缓存加一把互斥锁,例如使用 `ReentrantLoc

登录后查看完整内容