Java中的伪共享问题与解决
请解释CPU缓存行(Cache Line)导致的伪共享(False Sharing)问题以及解决办法。
回答
专业代码师
伪共享(False Sharing):
- CPU缓存以缓存行(Cache Line,通常64字节)为单位加载数据。
- 如果两个线程操作不同的变量,但这两个变量在同一个缓存行中,修改一个变量会使得整个缓存行失效。
- 线程A修改变量X → 缓存行失效 → 线程B重新从内存读取包含变量Y的缓存行。
- 实际是操作不同变量,但缓存行导致的同步开销等同于共享变量竞争。
解决办法:
- 缓存行填充:在变量间插入无用字节,使变量隔离到独立缓存行。
- @Contended注解(JDK8+):
@sun.misc.Contended
class Counter { volatile long value; }
注意:需开启-XX:-RestrictContended。
3. 使用LongAdder:内部通过Cell数组实现伪共享隔离。
应用场景:并发计数器、Disruptor框架、AQS的CLH队列。