原子性是指「不會有中間狀態存在,要麼什麼都沒改變,要麼全都改變」,「對資料操作的原子性」.
在併發程式設計中, 原子性存在的根本原因是, 多個執行緒操作共享變數, 由於執行緒間切換排程, 導致乙個執行緒操作了另乙個執行緒 "半成品" 的資料, 這是導致多執行緒環境下結果不可**的乙個原因.
synchronized 的原子性保證
synchronized 提供的特性是互斥, 可重入, 不可中斷, 要用 synchronized 保證共享變數操作的原子性, 則需要對共享變數的讀寫加鎖訪問.
atomic包的原子性保證, 本質是 cas操作, 處理器保證原子性
可見性是指, 乙個執行緒的操作結果能夠立刻被其他執行緒觀察到
多核心多快取, 導致可見性問題.
synchronized的可見性保證
依賴於synchronized實現的兩條語義
加鎖時, 將工作記憶體置無效, 共享變數從主記憶體讀取
解鎖前, 將工作記憶體變數重新整理到主記憶體
volatile的可見性保證
volatile實現中的lock字首指令, 強制重新整理到記憶體 && 置其他快取行 資料無效
final 變數的可見性保證 (todo)
volatile的有序性保證
volatile相關變數, 禁止指令重排序. 如雙檢鎖實現中, 確保instance引用在物件未初始化成功前, 不能被其他執行緒觀測到.
synchronized的有序性保證
看下面的雙檢鎖實現
public
class
singleton}}
return instance;
}}
看到這裡我是懵逼的狀態, 檢視一些介紹都說synchronized 能夠保證有序性, 那麼為什麼還要volatile ?
b乎上找到了乙個很好的解釋,"synchronized的有序性和volatile的有序性是從不同的角度來看待的"
執行緒與執行緒間, 每乙個synchronized塊可以看成是乙個原子操作, 它解決了塊與塊之間同步延遲引發的無序
原子性,可見性,有序性
1.原子性 read,load,assign,use,store write 基本型別的訪問,讀寫 long,double 非原子性協定 monitorenter,monitorexit jvm lock,unlock,synchronized 2.可見性 volatile synchronized...
volatile,可見性,有序性
1.可見性的實現基於volatile的讀取,寫入兩個操作的記憶體語義。2.有序性的實現基於jmm針對編譯器制定的volatile重排序表 能否重排序 第二個操作 第乙個操作 普通讀 寫 volatile讀 volatile寫 普通讀 寫 novolatile讀 nono novolatile寫 no...
可見性 原子性和有序性問題
核心矛盾 這些年,我們的 cpu 記憶體 i o 裝置都在不斷迭代,不斷朝著更快的方向努力。但是,在這個快速發展的過程中,有乙個核心矛盾一直存在,就是這三者的速度差異。我形象的描述了一下這三者的速度上的差異 所謂天上一天地上一年 愛因斯坦的相對論是有合理解釋的 cpu和記憶體之間的速度差異就是cpu...