在讲解 JAVA 内存模型以前,先了解 CPU 内存模型,由于JAVA内存模型跟它是十分类似的。 java
class XXX {
private static int a = 0;
Thread threadA = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " a = " + a);
a = 1;
System.out.println(Thread.currentThread().getName() + " a = " + a);
}, "ThreadA");
Thread threadB = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " a = " + a);
a = 1;
System.out.println(Thread.currentThread().getName() + " a = " + a);
}, "ThreadB");
}
复制代码
当 new 多个线程去修改 a 这个变量时,就会出现可见性问题。也就是 : thread-A :a ->1 。可是 thread-B 不必定读到 a 就是1,可能仍是 0 ;缓存
java 在执行程序时,可能会对指令进行重排。也就是按照代码顺序:app
b = 1;
x = a;
复制代码
可是执行时可能会变成:spa
x = a;
b = 1;
复制代码
源代码到真正执行通常会通过: 源代码 -> 编译器重排序 -> 处理器重排序 -> 最终执行顺序线程
可是呢!!! 重排序也不是无条件去重排序的。他必须遵循一个 happen-before 规则。3d