日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

volatile,CAS,ABA三个关键字

發(fā)布時間:2024/3/12 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 volatile,CAS,ABA三个关键字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.volatile是java虛擬機提供的輕量級的同步機制,三個特點①保證可見性(JMM模型)②不保證原子性(存在往主內(nèi)存寫數(shù)據(jù)時覆蓋)③禁止指令重排。

2.如何解決原則性:①加sync鎖②使用JUC包下AtomicInteger類(CAS原理)

3.CAS(compareAndSwap)底層原理unsafe類:比較當(dāng)前工作內(nèi)存中的值和主內(nèi)存中的值,如果相同則指定規(guī)定操作,否則繼續(xù)比較直到主內(nèi)存和工作內(nèi)存中的值一致性。

4.CAS有3個操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的更新值B,當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時,將內(nèi)存值修改為B否則什么也不做。CAS缺點①循環(huán)時間長開銷大,②只能保證一個共享變量的原子操作③引出ABA問題。

5.CAS會導(dǎo)致ABA問題:

CAS算法實現(xiàn)一個重要前提時需要去除內(nèi)存中某時刻的數(shù)據(jù)并在當(dāng)下時刻比較并替換,那么在這個時間差里會導(dǎo)致數(shù)據(jù)變化。

比如說一個線程one從內(nèi)存位置V取出A,這時候另一個線程two也從內(nèi)存中取出A,并且線程two進行了一些操作將值變成了B,然后線程two又將V位置的數(shù)據(jù)變成A,這時候線程one進行CAS操作發(fā)現(xiàn)內(nèi)存中仍然是A,然后線程one操作成功,盡管線程One的CAS操作成功,但是并不代表這個過程就是沒有問題的。

/*** 描述: CAS導(dǎo)致的ABA問題的解決 AtomicStampReference類** @author xinjiao.yu@marketin.cn* @create 2020/2/21 11:55* @since 2.16.3*/ public class ABADemo {static AtomicReference<Integer> atomicReference = new AtomicReference<>(100);// 解決ABA問題的類AtomicStampedReference類(初始值,初始版本號)static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(100,1);public static void main(String[] args) {System.out.println("----------------以下是ABA問題的產(chǎn)生-------------");new Thread(()->{atomicReference.compareAndSet(100, 101);atomicReference.compareAndSet(101,100);}, "t1").start();new Thread(()-> {// 暫停1秒鐘t2線程,保證上面的t1線程完成了一次ABA操作try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(atomicReference.compareAndSet(100,2019)+"\t"+atomicReference.get());}, "t2").start();System.out.println("----------------以下是ABA問題的解決-------------");new Thread(()-> {// 版本號int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName()+"\t第一次版本號"+stamp);// 暫停1秒鐘t3線程try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}atomicStampedReference.compareAndSet(100, 101, atomicStampedReference.getStamp(), atomicStampedReference.getStamp()+1);System.out.println(Thread.currentThread().getName()+"\t第2次版本號"+atomicStampedReference.getStamp());atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp()+1);System.out.println(Thread.currentThread().getName()+"\t第3次版本號"+atomicStampedReference.getStamp());}, "t3").start();new Thread(()-> {// 版本號int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName()+"\t第一次版本號"+stamp);// 暫停3秒鐘t4線程,保證上面的t3線程完成了一次ABA操作try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}boolean result = atomicStampedReference.compareAndSet(100, 2019, stamp, stamp+1);System.out.println(Thread.currentThread().getName()+"\t是否成功修改結(jié)果"+result+"\t當(dāng)前版本號"+atomicStampedReference.getStamp());System.out.println(Thread.currentThread().getName()+"\t當(dāng)前實際最新值"+atomicStampedReference.getReference());}, "t4").start();} }

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的volatile,CAS,ABA三个关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。