1. 程式人生 > >【多執行緒總結(四)-三大性質總結】

【多執行緒總結(四)-三大性質總結】

前言

在併發程式設計中分析執行緒安全的問題時三條性質:原子性,有序性和可見性往往是非常重要的,本篇部落格主要來用synchronized和volatile關鍵來進行對比。首先來看看巨集觀導圖

核心

原子性

原子性是指一個操作是不可中斷的,要麼全部執行成功要麼全部執行失敗。首先來synchronized

儘管jvm沒有把lock和unlock開放給我們使用,但jvm以更高層次的指令monitorenter和monitorexit指令開放給我們使用,synchronized關鍵字滿足原子性

volatile是不滿足原子性的.

如果讓volatile保證原子性,必須符合以下兩條規則:

  1. 運算結果並不依賴於變數的當前值,或者能夠確保只有一個執行緒修改變數的值;
  2. 變數不需要與其他的狀態變數共同參與不變約束

有序性

synchronized語義表示鎖在同一時刻只能由一個執行緒進行獲取,當鎖被佔用後,其他執行緒只能等待。因此,synchronized語義就要求執行緒在訪問讀寫共享變數時只能“序列”執行,因此synchronized具有有序性

volatile

在java記憶體模型中說過,為了效能優化,編譯器和處理器會進行指令重排序;也就是說java程式天然的有序性可以總結為:如果在本執行緒內觀察,所有的操作都是有序的;如果在一個執行緒觀察另一個執行緒,所有的操作都是無序的

。而用volatile修飾的話就操作重排序,從而避免這種情況。volatile包含禁止指令重排序的語義,其具有有序性

可見性

可見性是指當一個執行緒修改了共享變數後,其他執行緒能夠立即得知這個修改。synchronized,當執行緒獲取鎖時會從主記憶體中獲取共享變數的最新值,釋放鎖的時候會將共享變數同步到主記憶體中。從而,synchronized具有可見性。同volatile,會通過在指令中新增lock指令,以實現記憶體可見性。因此, volatile具有可見性

總結

通過前面的總結,再次將synchronized和volatile總結:

synchronized: 具有原子性,有序性和可見性

volatile:具有有序性和可見性