Exchanger的高性能源于无锁算法与内存屏障协同,通过CAS、原子字段和精确屏障实现轻量级线程配对,避免锁竞争与阻塞队列,交换耗时纳秒级,吞吐量较synchronized高2–3倍。

Exchanger 的高性能并非来自传统锁,而是依靠无锁算法 + 内存屏障协同实现的轻量级线程配对机制。
底层不依赖synchronized或ReentrantLock
Exchanger 内部完全避免了重量级锁。它基于CAS(Compare-and-Swap)操作和自旋等待构建核心逻辑,所有状态变更都通过原子字段(如AtomicReference、Unsafe.compareAndSwapObject)完成。这意味着:
- 没有锁竞争开销,无阻塞队列维护成本
- 线程在未配对时处于自旋+park组合等待,比纯忙等更省CPU
- 配对成功瞬间的数据交换是原子操作,无需额外同步
内存屏障确保数据可见性与顺序性
Exchanger 在关键节点插入了精确的内存屏障(JVM层面的LoadStore、StoreLoad等),保障跨线程数据交换的正确性:
- 调用 exchange() 前,写入本地变量的数据会通过StoreStore屏障刷出到主内存
- 配对成功后,读取对方数据前插入LoadLoad屏障,防止指令重排序导致读到旧值
- 交换完成时的volatile写操作,触发StoreLoad屏障,确保后续逻辑看到一致状态
性能优势体现在典型场景中
相比用BlockingQueue或手动加锁实现双向交换,Exchanger在成对协作场景下有明显优势:
- 双缓冲切换:两个线程交替填充/消费缓冲区,Exchanger切换耗时稳定在纳秒级
- 状态对齐:如游戏回合交接,线程A提交当前帧状态、接收B上一帧结果,全程无共享变量争用
- 测试模拟:高频握手场景中,吞吐量比synchronized方案高2–3倍,GC压力更低
注意边界:超时与中断的代价
带超时的 exchange(V, timeout, unit) 会引入定时调度开销;而 InterruptedException 处理需恢复中断状态,但不会破坏内存屏障语义。这些属于可控的附加成本,并未动摇其无锁根基。


















