今天重掃了corejava 14 併發的一章,在談到volatile域代替synchronized 應用於併發更新時,看到以下內容,併發更新可用內部鎖的方式但會帶來阻塞問題,可用volatile域替代。我的發覺好像有哪裏欠了點邏輯,彷佛volatile域爲何能替代內部鎖並無講明緣由。秉承着疑惑對了一下原版。java
果真在原版中多了這麼一句解釋:緩存
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.多線程
編譯器會插入相應的代碼以保證一個線程的值完成的改變狀況對其它線程是可見的。併發
這對應着上文的一下兩點的問題的解決(以下圖):app
1、計算機多線程高速緩存同步的問題spa
2、java編譯器指令重排問題線程
兩者都會致使在多線程環境下變量值不一樣步。code
在使用volatile後,可以使變量變化後的狀態即時可見,可代替原子操做的鎖blog