【多執行緒總結(四)-三大性質總結】
前言
在併發程式設計中分析執行緒安全的問題時三條性質:原子性,有序性和可見性往往是非常重要的,本篇部落格主要來用synchronized和volatile關鍵來進行對比。首先來看看巨集觀導圖
核心
原子性
原子性是指一個操作是不可中斷的,要麼全部執行成功要麼全部執行失敗。首先來synchronized
儘管jvm沒有把lock和unlock開放給我們使用,但jvm以更高層次的指令monitorenter和monitorexit指令開放給我們使用,synchronized關鍵字滿足原子性。
volatile是不滿足原子性的.
如果讓volatile保證原子性,必須符合以下兩條規則:
- 運算結果並不依賴於變數的當前值,或者能夠確保只有一個執行緒修改變數的值;
- 變數不需要與其他的狀態變數共同參與不變約束
有序性
synchronized語義表示鎖在同一時刻只能由一個執行緒進行獲取,當鎖被佔用後,其他執行緒只能等待。因此,synchronized語義就要求執行緒在訪問讀寫共享變數時只能“序列”執行,因此synchronized具有有序性。
volatile
在java記憶體模型中說過,為了效能優化,編譯器和處理器會進行指令重排序;也就是說java程式天然的有序性可以總結為:如果在本執行緒內觀察,所有的操作都是有序的;如果在一個執行緒觀察另一個執行緒,所有的操作都是無序的。而用volatile修飾的話就操作重排序,從而避免這種情況。volatile包含禁止指令重排序的語義,其具有有序性。
可見性
可見性是指當一個執行緒修改了共享變數後,其他執行緒能夠立即得知這個修改。synchronized,當執行緒獲取鎖時會從主記憶體中獲取共享變數的最新值,釋放鎖的時候會將共享變數同步到主記憶體中。從而,synchronized具有可見性。同volatile,會通過在指令中新增lock指令,以實現記憶體可見性。因此, volatile具有可見性
總結
通過前面的總結,再次將synchronized和volatile總結:
synchronized: 具有原子性,有序性和可見性; volatile:具有有序性和可見性
相關文章
- 【多執行緒總結(一)-基礎總結】執行緒
- iOS 多執行緒總結iOS執行緒
- java多執行緒總結Java執行緒
- 多執行緒程式設計總結:一、認識多執行緒本質執行緒程式設計
- Java 多執行緒 - 總結概述Java執行緒
- JAVA 多執行緒總結(一)Java執行緒
- Android多執行緒總結Android執行緒
- Java多執行緒Queue總結Java執行緒
- 多執行緒:執行緒池理解和使用總結執行緒
- Java多執行緒詳解總結Java執行緒
- java多執行緒總結(系列一)Java執行緒
- windows多執行緒同步互斥--總結Windows執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- Java執行緒總結Java執行緒
- iOS 多執行緒:『RunLoop』詳盡總結iOS執行緒OOP
- iOS 多執行緒:『GCD』詳盡總結iOS執行緒GC
- Swift多執行緒程式設計總結Swift執行緒程式設計
- iOS多執行緒:『GCD』詳盡總結iOS執行緒GC
- 多執行緒並行執行,然後彙總結果執行緒並行
- 40 個 Java 多執行緒問題總結Java執行緒
- iOS多執行緒程式設計總結(上)iOS執行緒程式設計
- iOS多執行緒程式設計總結(中)iOS執行緒程式設計
- iOS多執行緒程式設計總結(下)iOS執行緒程式設計
- 40個Java多執行緒問題總結Java執行緒
- C++ 多執行緒程式設計總結C++執行緒程式設計
- 執行緒併發總結執行緒
- 多執行緒(三)、執行緒池 ThreadPoolExecutor 知識點總結執行緒thread
- 最全java多執行緒總結2--如何進行執行緒同步Java執行緒
- 最全java多執行緒學習總結1--執行緒基礎Java執行緒
- 多執行緒下的程式同步(執行緒同步問題總結篇)執行緒
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- python多執行緒的優缺點總結Python執行緒
- 【多執行緒】常見問題簡單總結執行緒
- MYSQL執行緒池總結(一)MySql執行緒
- MySQL執行緒池總結(二)MySql執行緒
- 總結:iOS中多執行緒的經典崩潰iOS執行緒
- 2019Android多執行緒總結Android執行緒