天天看點

【多線程總結(四)-三大性質總結】

前言

在并發程式設計中分析線程安全的問題時三條性質:原子性,有序性和可見性往往是非常重要的,本篇部落客要來用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具有可見性

總結

繼續閱讀