volatile不保證原子性
我的理解是,在volatile單獨的讀和寫,都是直接從主記憶體中讀,寫入主記憶體,但是,在volatile i++的時候,另外一個執行緒假設已經改變了i的值,並寫入主記憶體,並告訴其他執行緒你們快取的資料已經失效了,但是本執行緒已經完成i++,並且不需要再讀取i的值,我現在要做的事情是寫i。所以我不會再去讀取i的最新值。volatile保證的是,在讀的時候會從主存中讀,在寫的時候寫入主存。
在生成彙編程式碼時會在volatile修飾的共享變數進行寫操作的時候會多出Lock字首的指令
- Lock字首的指令會引起處理器快取寫回記憶體;
- 一個處理器的快取回寫到記憶體會導致其他處理器的快取失效;
- 當處理器發現本地快取失效後,就會從記憶體中重讀該變數資料,即可以獲取當前最新值。
記憶體屏障(memory barrier)是一個CPU指令。基本上,它是這樣一條指令: a) 確保一些特定操作執行的順序; b) 影響一些資料的可見性(可能是某些指令執行後的結果)。編譯器和CPU可以在保證輸出結果一樣的情況下對指令重排序,使效能得到優化。插入一個記憶體屏障,相當於告訴CPU和編譯器先於這個命令的必須先執行,後於這個命令的必須後執行。記憶體屏障另一個作用是強制更新一次不同CPU的快取。例如,一個寫屏障會把這個屏障前寫入的資料重新整理到快取,這樣任何試圖讀取該資料的執行緒將得到最新值,而不用考慮到底是被哪個cpu核心或者哪個CPU執行的。
如果讓volatile滿足原子性:
1.運算結果並不依賴於變數當前的值,,或者確保只有一個執行緒改變數的值;
2.變數不需要與其他變數共同參與不變約束;
synchronized 是原子的,lock 和unlock指令是原子的,雖然jvm沒有開放給程式設計師使用,但是更高層指令monitorenter和monitorexit指令開放給程式設計師使用,反映到java程式碼中就是synchronized關鍵字。synchronized具有有序性,要求執行緒訪問共享變數時只能“序列“執行
volatile具有有序性,包含禁止指令重排序的語義,其具有有序性;
synchronized具有可見性,獲得鎖時會從主存中獲取最新值,釋放鎖時會將共享變數同步到主存中。
總結:synchronized具有有序性、原子性、可見性,volatile具體有序性、可見性。
相關文章
- Volatile不保證原子性(二)
- Volatile不保證原子性及解決方案
- volatile 可見性與原子性
- 走進volatile的世界,探索它與可見性,有序性,原子性之間的愛恨情仇!
- Redis中的原子操作(2)-redis中使用Lua指令碼保證命令原子性Redis指令碼
- java編碼:保證方法呼叫鏈的原子性Java
- Unsafe原子性
- Redis 使用 Lua 指令碼替代 SETNX / DECR 保證原子性Redis指令碼
- 併發程式設計的原子性 != 事務ACID的原子性程式設計
- volatile,可見性,有序性
- 從JDK原始碼角度看併發的原子性如何保證JDK原始碼
- 從原子性挖到CAS
- Redis 中的原子操作(1)-Redis 中命令的原子性Redis
- Volatile可見性分析(一)
- 面試官:volatile如何保證可見性的,具體如何實現?面試
- volatile的特性程式碼驗證
- 關於IOS 屬性atomic(原子性)的理解iOS
- 你還不懂可見性、有序性和原子性?
- Java併發之原子性、有序性、可見性Java
- 使用 volatile 關鍵字保證變數可見性和禁止指令重排序變數排序
- 執行緒安全性-原子性、可見性、有序性執行緒
- 三大性質總結:原子性、可見性以及有序性
- java多執行緒3:原子性,可見性,有序性Java執行緒
- java安全編碼指南之:可見性和原子性Java
- Volatile如何保證執行緒可見性之匯流排鎖、快取一致性協議執行緒快取協議
- 知其所以然~redis的原子性Redis
- [深入理解Java虛擬機器]原子性/可見性/有序性Java虛擬機
- 高階java必須清楚的概念:原子性、可見性、有序性Java
- 資料庫事務,原子性、一致性、隔離性、永續性資料庫
- 日常Bug排查-讀從庫沒有原子性?
- volatile記憶體可見性和指令重排記憶體
- 原子操作與原子型別型別
- 你說一下對Java中的volatile的理解吧,以及它是怎麼保證可見性的。Java
- 面試官:Redis的事務滿足原子性嗎?面試Redis
- Java併發程式設計Bug源頭:可見性、原子性和有序性問題Java程式設計
- volatile
- 「跬步千里」詳解 Java 記憶體模型與原子性、可見性、有序性Java記憶體模型
- 不支援原子性的 Redis 事務也叫事務嗎?Redis