在講解 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