1. 程式人生 > >Core.Java.Volume.I.Fundamentals.10th.Edition 14.5.8 Volatile域 中文版 章節勘誤

Core.Java.Volume.I.Fundamentals.10th.Edition 14.5.8 Volatile域 中文版 章節勘誤

今天重掃了corejava 14 併發的一章,在談到volatile域代替synchronized 應用於併發更新時,看到如下內容,併發更新可用內部鎖的方式但會帶來阻塞問題,可用volatile域替代。個人發覺好像有哪裡欠了點邏輯,似乎volatile域為什麼能替代內部鎖並沒有講明原因。秉承著疑惑對了一下原版。

 

果然在原版中多了這麼一句解釋:

The compiler will insert the appropriate code to ensure that a change to the done
variable in one thread is visible from any other thread that reads the variable.

編譯器會插入相應的程式碼以保證一個執行緒的值完成的改變情況對其它執行緒是可見的。

這對應著上文的一下兩點的問題的解決(如下圖):

一、計算機多執行緒快取記憶體同步的問題

二、java編譯器指令重排問題

二者都會導致在多執行緒環境下變數值不同步。

在使用volatile後,可使變數變化後的狀態即時可見,可代替原子操作的鎖