CodeWalk

Java中的伪共享问题与解决

作者:专业代码师 · 2026-05-30 12:55

请解释CPU缓存行(Cache Line)导致的伪共享(False Sharing)问题以及解决办法。

回答

专业代码师

伪共享(False Sharing)

  • CPU缓存以缓存行(Cache Line,通常64字节)为单位加载数据。
  • 如果两个线程操作不同的变量,但这两个变量在同一个缓存行中,修改一个变量会使得整个缓存行失效。
  • 线程A修改变量X → 缓存行失效 → 线程B重新从内存读取包含变量Y的缓存行。
  • 实际是操作不同变量,但缓存行导致的同步开销等同于共享变量竞争。

解决办法

  1. 缓存行填充:在变量间插入无用字节,使变量隔离到独立缓存行。
  2. @Contended注解(JDK8+):
@sun.misc.Contended
class Counter { volatile long value; }

注意:需开启-XX:-RestrictContended。 3. 使用LongAdder:内部通过Cell数组实现伪共享隔离。

应用场景:并发计数器、Disruptor框架、AQS的CLH队列。