本文主要內(nèi)容
1驯嘱、原子操作定義
2彻消、原子操作的方式(同步鎖機制、cas機制宙拉、原子操作類)
3、總結(jié)
一丙笋、原子操作定義
??? 1谢澈、定義:
???? 原子操作可以是一個步驟,也可以是多個操作步驟御板,但是其順序不可以被打亂锥忿,也不可以被切割而執(zhí)行其中的一部分,原子操作具有不可中斷性怠肋。它的核心特征是將整個操作視為一個整體敬鬓。
??? 2、實例: ???????
???? 上面的截圖中i++操作存在多個操作笙各,在多線程環(huán)境下會出現(xiàn)競態(tài)條件钉答,線程不安全,需要轉(zhuǎn)變?yōu)樵硬僮鞑拍馨踩厩馈O旅鎸⒔榻B操作操作的方式数尿。
二、原子操作方式
????? 1惶楼、同步鎖機制:
?? 2右蹦、cas機制
???? 定義:cas機制:cas操作需要輸入兩個數(shù)值,一個舊值A(chǔ)和一個新值B,在操作期間先比較下舊值有沒有發(fā)生變化歼捐,如果沒有發(fā)生變化何陆,才交換成新值,發(fā)生了變化則不交換豹储。
? java中sun贷盲。misc。Unsafe類提供了一些方法實現(xiàn)cas颂翼。
??? 實例:
?????
?? 3晃洒、原子操作封裝類
??? (1)基礎(chǔ)版: Java中提供了一些原子操作封裝類,封裝了cas機制的底層代碼朦乏,使得用戶使用起來更加方便球及。
???? 例如:
????? AtomicBoolean:原子更新布爾類型;AtomicInteger:原子更新整型呻疹;AtomicLong:原子更新長長整型吃引。
???? AtomicIntegerArray:原子更新整型數(shù)組里的元素。 AtomicLongArray:原子更新長整型數(shù)組里的元? 素。???????? AtomicReferenceArray:原子更新引用數(shù)組里的元素镊尺。
??? AtomicIntegerFieldUpdater:原子更新整型字段里的更新器朦佩。 ?? AtomicLongFieldUpdater:原子更新長整型字段里的更新器。 ?? AtomicReferenceFieldUpdater:原子更新引用類型里的字段庐氮。
??? AtomicReference:原子更新引用類型语稠。??? AtomicStampedReference:原子更新帶有版本號的引用類型。??? AtomicMarkableReference:原子更新帶有標記位的引用類型弄砍。
?? 實例:下面介紹AtomicInteger類的實例
????
??? (2)更新版: 1.8版本的jdk還更新了四個原子操作的封裝類仙畦。
????? 更新器:DoubleAccumulator、LongAccumulator
????? 計數(shù)器:DoubleAdder音婶、LongAdder
????? 實例1:介紹LongAccumulator類使用代碼????
實例2:下面是LongAdder類的使用代碼
計數(shù)器增強版慨畸,高并發(fā)下性能更好,頻繁更新但不太頻繁讀取的匯總統(tǒng)計信息時使用衣式,分成多個操作單元寸士,不同線程更新不同的單元,只有需要匯總的時候才計算所有單元的操作
三碴卧、總結(jié)
cas的弊端:
1弱卡、cpu開銷大,在高并發(fā)下住册,許多線程谐宙,更新一變量,多次更新不成功界弧,循環(huán)反復(fù)凡蜻,給cpu帶來大量壓力。
2垢箕、只是一個變量的原子性操作划栓,不能保證代碼塊的原子性。
3条获、ABA問題
ABA問題:內(nèi)存值V=100;
threadA 將100忠荞,改為50;
threadB 將100帅掘,改為50委煤;
threadC 將50,改為100修档;
場景:小牛取款碧绞,由于機器不太好使,多點了幾次全款操作吱窝。后臺threadA和threadB工作讥邻,
此時threadA操作成功(100->50)迫靖,threadB阻塞。正好牛媽打款50元給小牛(50->100)兴使,
threadC執(zhí)行成功系宜,之后threadB運行了,又改為(100->50)发魄。
牛氣沖天盹牧,lz錢哪去了?励幼?欢策?
如何解決aba問題:
對內(nèi)存中的值加個版本號,在比較的時候除了比較值還的比較版本號赏淌。
java:AtomicStampedReference就是用版本號實現(xiàn)cas機制。
????