volatile 的學習要點


第一個重點:要了解,多線程之間的通信機制有兩種,共享內存和消息傳遞。另外除了主存之外,每一個線程都有一個私有的本地內存空間(Local memory)。本地內存中存儲了該線程以讀/寫共享變量的副本。其實本地內存是JMM的一個抽象概念,並不真實存在,它涵蓋了緩存,寫緩存區,寄存器以及其他的硬件和編譯器的優化。


JAVA內存模型線程通信機制

第二個重點:重排序的問題。

在執行程序的時候,爲了提高性能,編譯器和處理器常常會對指令做重排序,重排序分爲3種。

1:編譯器優化的重排序。

2:指令集並行重排序。

3:內存系統的重排序。


最後,對volatile進行介紹,它具有以下特性。

1)可見性。對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最後的寫入。

2)原子性。對任意單個volatile變量的讀/寫具有原子性,但類似於volatile++這種複合操作不具有原子性。

3)根據之前所說的通信機制,volatile是通過清除第二個線程中已有的本地內存中的變量信息爲無效,使得線程B不得不去主線程去獲取共享變量以得完成變量的可見性。

4)volatile修飾的變量的讀、寫都會在每一次讀寫前會加入屏障,來禁止程序的重新排序。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章