第一個重點:要了解,多線程之間的通信機制有兩種,共享內存和消息傳遞。另外除了主存之外,每一個線程都有一個私有的本地內存空間(Local memory)。本地內存中存儲了該線程以讀/寫共享變量的副本。其實本地內存是JMM的一個抽象概念,並不真實存在,它涵蓋了緩存,寫緩存區,寄存器以及其他的硬件和編譯器的優化。
第二個重點:重排序的問題。
在執行程序的時候,爲了提高性能,編譯器和處理器常常會對指令做重排序,重排序分爲3種。
1:編譯器優化的重排序。
2:指令集並行重排序。
3:內存系統的重排序。
最後,對volatile進行介紹,它具有以下特性。
1)可見性。對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最後的寫入。
2)原子性。對任意單個volatile變量的讀/寫具有原子性,但類似於volatile++這種複合操作不具有原子性。
3)根據之前所說的通信機制,volatile是通過清除第二個線程中已有的本地內存中的變量信息爲無效,使得線程B不得不去主線程去獲取共享變量以得完成變量的可見性。
4)volatile修飾的變量的讀、寫都會在每一次讀寫前會加入屏障,來禁止程序的重新排序。