多线程并发访问时Caffeine缓存值无法读取问题求助
多线程并发访问时Caffeine缓存值无法读取
快速复现
运行CacheTest::threadedTest()即可复现问题
需求背景
一个耗时IO方法会被多线程频繁并发访问,计划通过L1缓存缓解压力。
当前实现
现有多个职责明确的类:
- CaffeineConfig:缓存TTL为300秒
- CacheHelper:获取缓存的AtomicInteger,若从缓存取值则不递增该整数
- Worker:负责获取AtomicInteger
- Manager:通过ScheduledExecutorService启动A、B、C三个线程Worker执行任务
- CacheTest:模拟Manager类的行为
预期结果
Manager启动后,第一个Worker获取值0并缓存,后续第二个、第三个Worker应从缓存读取值0。
实际结果
Manager启动后,第一个Worker获取值0并缓存,但第二个、第三个Worker获取到的是递增后的值,而非缓存值。
排查发现
- 在运行过程中新增Worker,能正常读取缓存值;
- 该异常仅在多线程同时访问缓存时出现;
- 曾推测可能是ThreadLocal导致缓存未在Worker间共享,但无法理解其关联逻辑。
求助问题
是否有遇到相同问题的开发者?恳请分享解决方案。
内容的提问来源于stack exchange,提问作者EthanAlef
相关产品推荐
相关产品推荐

