【多執行緒總結(四)-三大性質總結】
阿新 • • 發佈:2018-12-10
前言
在併發程式設計中分析執行緒安全的問題時三條性質:原子性,有序性和可見性往往是非常重要的,本篇部落格主要來用synchronized和volatile關鍵來進行對比。首先來看看巨集觀導圖
核心
原子性
原子性是指一個操作是不可中斷的,要麼全部執行成功要麼全部執行失敗。首先來synchronized
儘管jvm沒有把lock和unlock開放給我們使用,但jvm以更高層次的指令monitorenter和monitorexit指令開放給我們使用,synchronized關鍵字滿足原子性。
volatile是不滿足原子性的.
如果讓volatile保證原子性,必須符合以下兩條規則:
- 運算結果並不依賴於變數的當前值,或者能夠確保只有一個執行緒修改變數的值;
- 變數不需要與其他的狀態變數共同參與不變約束
有序性
synchronized語義表示鎖在同一時刻只能由一個執行緒進行獲取,當鎖被佔用後,其他執行緒只能等待。因此,synchronized語義就要求執行緒在訪問讀寫共享變數時只能“序列”執行,因此synchronized具有有序性。
volatile
在java記憶體模型中說過,為了效能優化,編譯器和處理器會進行指令重排序;也就是說java程式天然的有序性可以總結為:如果在本執行緒內觀察,所有的操作都是有序的;如果在一個執行緒觀察另一個執行緒,所有的操作都是無序的
可見性
可見性是指當一個執行緒修改了共享變數後,其他執行緒能夠立即得知這個修改。synchronized,當執行緒獲取鎖時會從主記憶體中獲取共享變數的最新值,釋放鎖的時候會將共享變數同步到主記憶體中。從而,synchronized具有可見性。同volatile,會通過在指令中新增lock指令,以實現記憶體可見性。因此, volatile具有可見性
總結
通過前面的總結,再次將synchronized和volatile總結:
synchronized: 具有原子性,有序性和可見性
; volatile:具有有序性和可見性