前言
volatile关键字能够保证可见性和有序性,但是volatile为什么能够保证可见性和有序性?为什么volatile又不能保证原子性?
今天,我们从CPU多核缓存架构出发,结合MESI缓存一致性协议来深入剖析一下,volatile的原理。
问题的出现
我们先通过一个例子来看看,可见性导致的线程安全问题:
public class Main {
static int a = 0;
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (a == 0) {
}
System.out.println("T1得知a = 1");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
a = 1;
System.out.println("T2修改a = 1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
线程T2再休眠1秒之后,修改了a的值为1,此时T1应该退出while循环并打印,但是结果并非如此:
T1没有退出循环,程序也就不会结束。但是如果对a使用volatile关键字修饰就会解决该问