如果你的简历上写着「熟悉 Java 并发」,但被问到 Disruptor 的序号栅栏(SequenceBarrier)怎么防止消费者读到还没写的数据时答不上来,或者用着 Caffeine 却只会 cache.get(key, k -> load(k)),那这份资料正好补这个缺口。它不讲 JVM 内存模型基础,也不带你写 Hello World,而是直接对着两个在真实系统里扛过流量的组件,一层层剥到源码。
先确认自己是不是该看
Disruptor 和 Caffeine 有个共同点:它们解决的问题都很明确,但解法都不直观。Disruptor 用环形数组和序号代替阻塞队列,Caffeine 用 W-TinyLFU 淘汰策略代替简单 LRU。日常调用 API 不会出错,可一旦出现「队列没满却丢消息」「缓存命中率上不去」这类问题,只懂用法的人就只能靠猜。
- 写过高并发生产者—消费者代码,但说不清 ArrayBlockingQueue 的锁到底卡在哪里;
- 项目里用了 Caffeine,调过
maximumSize、expireAfterWrite,但没看过淘汰算法实现; - 准备中间件、基础架构方向的面试,需要能画出组件内部结构图;
- 接手了别人搭的高性能链路,读代码时被 Sequence、RingBuffer 这类概念挡住。
如果你还停留在「线程池参数怎么配」的阶段,建议先补并发基础再回来,否则源码部分会看得很吃力。
Disruptor 这部分要解决什么
资料里 Disruptor 的内容围绕一条主线:它凭什么比阻塞队列快。看的过程中需要盯住几个具体问题——环形数组怎么做到无锁写入,生产者如何用 CAS 抢占下一个可写槽位,消费者之间的依赖关系靠什么协调,批量消费和序号栅栏又是怎么配合的。伪共享(false sharing)在 Disruptor 里不是一句性能术语,而是直接体现在 padding 填充字段的代码上,这部分需要对着源码看才能理解为什么多写几个 long 就能提速。
还有一个容易被跳过但很关键的点:Disruptor 的等待策略(WaitStrategy)。不同策略对应不同延迟和 CPU 占用,选错了照样拖垮系统。资料里对各种策略的取舍做了展开,看的时候可以对照自己业务场景想一想该选哪个。
Caffeine 这部分要解决什么
Caffeine 的核心不是 API,而是那个叫 W-TinyLFU 的组合淘汰算法。需要弄清楚:为什么单纯 LRU 在扫描型访问下会失效,频率统计是怎么用 Count-Min Sketch 省内存的,窗口缓存(Window Cache)和主缓存(Main Cache)之间的晋升与淘汰是怎么流动的。这些概念光看文字容易糊,配合源码里的数据结构定义会清楚很多。
另外要留意 Caffeine 的异步加载和刷新机制。refreshAfterWrite 和 expireAfterWrite 的行为差异,直接决定了缓存雪崩时你的系统是平滑过渡还是集体回源。资料里对这部分有代码级说明,建议边看边写个小 demo 验证。
看完应该能回答的问题
- Disruptor 的 RingBuffer 大小为什么必须是 2 的幂,取模是怎么被位运算替代的;
- 多个消费者形成依赖链时,序号栅栏如何保证不越界读取;
- W-TinyLFU 里频率草图的空间开销大概是什么量级,为什么不用精确计数;
- Caffeine 的写入缓冲区(write buffer)在并发读写下起什么作用;
- 什么场景下该用 Disruptor 而不是 Kafka 或普通队列,边界在哪里。
这份资料偏源码向,读起来不会轻松,建议每个模块读完就动手画一遍结构图,或者把关键类的方法调用链跟一遍。能对着源码回答上面这些问题,才算真的把这两个组件装进自己的工具箱,而不是停留在「听说过」。
高性能组件 Disruptor、Caffeine 架构和源码
深入剖析高性能队列组件与缓存策略
编辑点评
全面解析Disruptor和Caffeine的架构设计与源码实现,适合对高性能组件感兴趣的读者。
⭐ 编辑推荐
本课程深入探讨高性能队列组件Disruptor和缓存策略Caffeine,从架构到源码,助你掌握核心原理。
课程亮点
课程目录
高性能核心组件之2:穿透“队列之王 Disruptor” 架构和源码(Disruptor 红宝书) v2 -release_f.pdf [10.4 MB]
适合人群
- Java开发者
- 中间件工程师
- 系统架构师
学习收获
祝您学习愉快!
学有所成,前程似锦!

