一、为什么你的多线程程序总是出错?从CPU缓存说起
在现代计算机体系中,CPU的运算速度与内存访问速度之间存在巨大的鸿沟。为解决这个问题,CPU设计了多级缓存结构(L1/L2/L3 Cache),但这带来了一个新的挑战——缓存一致性。
典型场景示例:
// 看似简单的代码却暗藏玄机
public class VisibilityDemo {
private static boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while (flag) {
// 空循环
}
System.out.println("线程退出");
}).start();
Thread.sleep(1000);
flag = false;
System.out.println("主线程修改flag");
}
}
运行这段代码你会发现:子线程永远不会退出!这就是经典的可见性问题,其根源正是CPU缓存一致性机制。
二、深入CPU缓存一致性协议(MESI)
现代CPU通过MESI协议保证缓存一致性,该协议定义了四种缓存行状态:
状态 | 描述 | 特性 |
---|---|---|
Modified | 缓存行已被修改 |