日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解java 中的CAS與ABA

瀏覽:21日期:2022-08-13 09:13:37
1. 獨占鎖:

屬于悲觀鎖,有共享資源,需要加鎖時,會以獨占鎖的方式導致其它需要獲取鎖才能執行的線程掛起,等待持有鎖的錢程釋放鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨占鎖就是悲觀鎖的思想。

1.1 樂觀鎖的操作

多線程并發修改一個值時的實現:

public class SimulatedCAS {//加volatile的目的是利用其happens-before原則,保證線程可見性 private volatile int value; public synchronized int getValue() { return value; } public synchronized int compareAndSwap(int expectedValue, int newValue) { int oldValue = value; if (value == expectedValue) value = newValue; return oldValue; }}2. 樂觀鎖:

總是假設最好的情況,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似于write_condition機制,其實都是提供的樂觀鎖。 在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS實現的。樂觀鎖一般會使用版本號機制或CAS算法實現。

2.1 CAS操作 CAS 操作包含三個操作數 —— 內存位置(V)、預期原值(A)和新值(B)。如果內存位置的值與預期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。無論哪種情況,它都會在 CAS 指令之前返回該位置的值。(在 CAS 的一些特殊情況下將僅返回 CAS 是否成功,而不提取當前值。)CAS 有效地說明了“我認為位置 V 應該包含值 A;如果包含該值,則將 B 放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。” 通常將 CAS 用于同步的方式是從地址 V 讀取值 A,執行多步計算來獲得新值 B,然后使用 CAS 將 V 的值從 A 改為 B。如果 V 處的值尚未同時更改,則 CAS 操作成功。 類似于 CAS 的指令允許算法執行讀-修改-寫操作,而無需害怕其他線程同時修改變量,因為如果其他線程修改變量,那么 CAS 會檢測它(并失敗),算法可以對該操作重新計算。 CAS實現計數器的操作:

public class CasCounter { private SimulatedCAS value; public int getValue() {return value.getValue(); } public int increment() {int oldValue = value.getValue();while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue) oldValue = value.getValue();return oldValue + 1; }}3. 原子變量類

JDK5.0之后加入了java.util.concurrent.atomic 包,其中的AtomicInteger; AtomicLong; AtomicReference; AtomicBoolean 等都是在CAS基礎上實現的。

4. CAS的缺陷 循環時間太長,如果自旋長時間不成功,會給cpu帶來極大的開銷,有興趣的可以使用JMH測試下AtomicLong 和 LongAdder的性能。 ABA問題: CAS需要檢查待操作值有沒有發生改變,如果沒有發生改變則更新。 但是存在這樣一種情況:如果一個值原來是A,變成了B,然后又變成了A,那么在CAS檢查的時候會發現沒有改變,但是實質上它已經發生了改變,這就是所謂的ABA問題。 在運用CAS做Lock-Free操作中有一個經典的ABA問題:比如線程1從內存位置V中取出A,這時另一個線程2也從內存中取出A,并且線程2進行了操作之后變成了B,然線程2又將V位置數據變成了A,這時候線程1進行CAS操作發現內存中仍然是A,然后線程1 操作成功。看上去是成功了,實際上有隱藏的問題: 現有一個用單向鏈表實現的FIFO堆棧,棧頂為A,這時線程1已經知道A.next為B,然后希望用CAS將棧頂替換為B,在線程1執行上面這條指令之前,線程2 介入,將A、B出棧,再push D、C、A,此時A位于棧頂,B已經不在棧中;此時線程1執行CAS,發現棧頂仍為A,所以CAS成功,即將棧頂變成B,但實際上此時B與 當前棧中元素D、C沒有關系,B.next為null,這樣一來就直接把C、D丟掉了。 對于ABA問題其解決方案是加上版本號,即在每個變量都加上一個版本號,每次改變時加1,即A —> B —> A,變成A(1) —> B(2) —> A(3)。 java中AtomicStampedReference也實現了這個作用,它通過包裝[E,Integer]的元組來對對象標記版本戳stamp,從而避免ABA問題。

public class AtomicTest {private static AtomicInteger atomicInteger = new AtomicInteger(100);private static AtomicStampedReference<Integer> atomicStampedReference =new AtomicStampedReference<Integer>(99, 0);public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(() -> {atomicInteger.compareAndSet(99, 100);atomicInteger.compareAndSet(100, 99);});Thread thread2 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(1);}catch (InterruptedException e){e.printStackTrace();}boolean b = atomicInteger.compareAndSet(99, 100);System.out.println(b);});thread1.start();thread2.start();thread1.join();thread2.join();Thread refT1 = new Thread(() -> {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}atomicStampedReference.compareAndSet(99, 100,atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);atomicStampedReference.compareAndSet(100, 99,atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);});Thread refT2 = new Thread(() -> {int stamp = atomicStampedReference.getStamp();System.out.println('before sleep : stamp = ' + stamp); // stamp = 0try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}System.out.println('after sleep : stamp = ' + atomicStampedReference.getStamp());//stamp = 1boolean c3 = atomicStampedReference.compareAndSet(99, 100, stamp, stamp+1);System.out.println(c3);//false});refT1.start();refT2.start();}}

結果如下:

truebefore sleep : stamp = 0after sleep : stamp = 2false

也就是說AtomicInteger更新成功,而AtomicStampedReference更新失敗。

以上就是詳解java 中的CAS與ABA的詳細內容,更多關于java 中的CAS與ABA的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品三区四区| 日韩影片在线观看| 日本一区福利在线| 亚洲欧美不卡| 激情欧美亚洲| 岛国精品一区| 国内不卡的一区二区三区中文字幕| 青草av.久久免费一区| 亚洲精品美女91| 亚洲ab电影| 亚洲精品婷婷| 日韩激情综合| 日韩精品亚洲专区| 蜜桃一区二区三区在线| 精品中文字幕一区二区三区av| 午夜欧美巨大性欧美巨大| 欧美日韩激情在线一区二区三区| 精品久久精品| 久久久久久婷| 欧美国产不卡| 国产欧美日韩亚洲一区二区三区| 亚洲色图综合| 国产视频久久| 免费久久99精品国产| 欧美.日韩.国产.一区.二区| 亚洲深夜av| 黄色成人在线网址| 国产一区亚洲| 免费在线观看日韩欧美| 首页国产欧美日韩丝袜| 亚欧洲精品视频在线观看| 丝袜国产日韩另类美女| 亚洲aa在线| 日韩1区2区日韩1区2区| 日韩一区二区三区四区五区| 日韩影片在线观看| 日本成人中文字幕在线视频| 欧美韩一区二区| 国产精品国码视频| 欧美一区自拍| 精品久久久久中文字幕小说| 三级在线看中文字幕完整版| 国产综合欧美| 亚洲激情中文| 黑丝一区二区| 首页亚洲欧美制服丝腿| 久久亚洲精品伦理| 亚久久调教视频| 日本一区二区中文字幕| 欧美精品1区| 美女视频黄免费的久久| 精品久久影院| 亚洲电影在线一区二区三区| 国产亚洲精品v| 91精品丝袜国产高跟在线| 国产欧美一区二区三区米奇| 日韩电影二区| 在线亚洲国产精品网站| 亚洲v天堂v手机在线| 精品国产成人| 91看片一区| 综合视频一区| 国产精品一区二区99| 精品72久久久久中文字幕| 日韩成人亚洲| 欧美91精品| 国产亚洲久久| 水蜜桃精品av一区二区| 久久不射网站| 久久激情av| 国产高清不卡| 国产亚洲午夜| 日韩高清不卡一区二区| 天堂av在线| 亚洲一区二区三区高清| 久久亚洲人体| 国产精品99免费看| 国产精品成人**免费视频| 激情视频网站在线播放色| 黄色精品网站| 国产日韩精品视频一区二区三区| 精品日韩在线| 亚洲人妖在线| 久久精品福利| 亚洲欧洲av| 久久精品国产99国产| 日本а中文在线天堂| 天海翼精品一区二区三区| 精品欧美视频| 日韩av不卡在线观看| 久久久久网站| 国产精品夜夜夜| 婷婷成人在线| 免费视频一区二区三区在线观看| 成人久久一区| 宅男在线一区| 97在线精品| 午夜在线一区| 久久亚洲国产| 国产午夜精品一区在线观看| 久久国产高清| 福利一区视频| 国产精品一区二区三区av麻| 午夜欧美精品久久久久久久| 国产精品2023| 国产午夜精品一区二区三区欧美| 亚洲精一区二区三区| 亚洲午夜电影| 国产激情一区| 91亚洲无吗| 欧美.日韩.国产.一区.二区| 国产精品99在线观看| 中文字幕一区二区av| 伊人久久亚洲美女图片| 国产成人精品一区二区三区视频| 日韩国产一区二区| 国产va免费精品观看精品视频| 亚洲色图国产| 久久久成人网| 欧美国产另类| 亚洲久久在线| 婷婷激情久久| 精品久久在线| 久久精品99国产国产精| 亚洲一区国产一区| 精品国产18久久久久久二百| 免费日本视频一区| 欧美搞黄网站| 久久精品资源| 日产欧产美韩系列久久99| 免费久久精品| 毛片在线网站| 精品福利久久久| 福利欧美精品在线| 欧美欧美黄在线二区| 日本三级亚洲精品| 亚洲一区欧美二区| 久久精品 人人爱| 青草av.久久免费一区| 蜜桃久久久久久| 免费av一区| 欧洲一区二区三区精品| 欧美激情麻豆| 国产精品亚洲综合久久| 欧美日韩一区二区三区在线电影| 一区二区精品| 日韩视频在线一区二区三区| 色老板在线视频一区二区| 首页国产精品| 91嫩草亚洲精品| 国产aa精品| 精品久久97| 日韩中文在线播放| 黄毛片在线观看| 不卡在线一区| 捆绑调教日本一区二区三区| 久久久人人人| 欧美日韩水蜜桃| 国产视频欧美| 免费国产自线拍一欧美视频| 欧美午夜精彩| 久久亚洲欧洲| 久久最新视频| 国产精品亚洲综合在线观看| 国产精品夜夜夜| 国产精品二区不卡| 国产精品久久久久久久免费观看| 欧美日一区二区| 狠狠色狠狠色综合日日tαg| 亚洲综合婷婷| 一区二区三区网站| 国产探花一区二区| 国产精品亚洲综合久久| 97人人精品| 亚洲a一区二区三区| 亚洲欧洲日韩精品在线| 日韩激情精品| 久久久久久一区二区| 成人午夜网址| 麻豆精品在线| 久久在线视频免费观看| 亚洲精品电影| 国产日韩一区二区三免费高清| 国产美女视频一区二区| 日本综合字幕| 久久精品免费一区二区三区| 免费成人在线视频观看| 91精品尤物| 久久香蕉国产| 亚洲欧洲国产精品一区| 国产资源在线观看入口av| 红桃视频国产精品| 国产激情久久| 999精品色在线播放| 日韩一区免费| 国产成人精品亚洲线观看| 性一交一乱一区二区洋洋av| 国产一级成人av| 好吊一区二区三区| 日本成人在线不卡视频|