关于Java内存模型自己的理解:
JVM运行程序的实体是线程,而每个线程在运行时都会为其创建一个独立的内存空间(Java栈,线程私有的),而成员变量是存储在堆空间(线程共享的),JMM规定所有变量都存储在主内存,所有线程都可访问,但是不能直接操作主内存中的变量,对变量的操作(读取赋值等)必须在工作内存中进行,因此要将变量从主内存拷贝到自己的工作空间,然后对变量进行操作,操作完成再将变量写回主内存,因此不同的线程无法访问对方的工作内存,线程间的通讯(传值) 必须通过主内存来完成。
volatile可见性代码演示:
public class TestVolatile {
private static volatile int a = 0;
public static void main(String[] args) {
new Thread(() -> {
try {
//保证所有线程都能读到a的值,a的值更新操作需要1S
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
a = 22;
}).start();
//因为加了volatile关键字,main线程可以感知到a的变化
while (a == 0) {
}
//因此这里很快就打出了a的值,如果不加此关键字,会一直在while循环,不会走到这里
System.out.println(a);
}
}