久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當(dāng)前位置:首頁(yè)>職場(chǎng)>ca和cap有什么不同(什么是CAS怎樣工作的)

ca和cap有什么不同(什么是CAS怎樣工作的)

發(fā)布時(shí)間:2024-01-24閱讀(13)

導(dǎo)讀在計(jì)算機(jī)科學(xué)中,比較和交換(ConmpareAndSwap)是用于實(shí)現(xiàn)多線程同步的原子指令它將內(nèi)存位置的內(nèi)容與給定值進(jìn)行比較,只有在相同的情況下,將該內(nèi)存位....

在計(jì)算機(jī)科學(xué)中,比較和交換(Conmpare And Swap)是用于實(shí)現(xiàn)多線程同步的原子指令 它將內(nèi)存位置的內(nèi)容與給定值進(jìn)行比較,只有在相同的情況下,將該內(nèi)存位置的內(nèi)容修改為新的給定值 這是作為單個(gè)原子操作完成的 原子性保證新值基于最新信息計(jì)算; 如果該值在同一時(shí)間被另一個(gè)線程更新,則寫入將失敗 操作結(jié)果必須說(shuō)明是否進(jìn)行替換; 這可以通過(guò)一個(gè)簡(jiǎn)單的布爾響應(yīng)(這個(gè)變體通常稱為比較和設(shè)置),或通過(guò)返回從內(nèi)存位置讀取的值來(lái)完成(摘自維基本科),我來(lái)為大家講解一下關(guān)于ca和cap有什么不同?跟著小編一起來(lái)看一看吧!

ca和cap有什么不同(什么是CAS怎樣工作的)

ca和cap有什么不同

在計(jì)算機(jī)科學(xué)中,比較和交換(Conmpare And Swap)是用于實(shí)現(xiàn)多線程同步的原子指令。 它將內(nèi)存位置的內(nèi)容與給定值進(jìn)行比較,只有在相同的情況下,將該內(nèi)存位置的內(nèi)容修改為新的給定值。 這是作為單個(gè)原子操作完成的。 原子性保證新值基于最新信息計(jì)算; 如果該值在同一時(shí)間被另一個(gè)線程更新,則寫入將失敗。 操作結(jié)果必須說(shuō)明是否進(jìn)行替換; 這可以通過(guò)一個(gè)簡(jiǎn)單的布爾響應(yīng)(這個(gè)變體通常稱為比較和設(shè)置),或通過(guò)返回從內(nèi)存位置讀取的值來(lái)完成(摘自維基本科)

CAS可以有效的提升并發(fā)的效率,但同時(shí)也會(huì)引入ABA問(wèn)題。

CAS其實(shí)就是實(shí)現(xiàn)一種樂(lè)觀的自旋鎖,相較于synchronize的悲觀鎖,沒(méi)有阻塞狀態(tài),自然也就沒(méi)有上下文的切換了,而線程狀態(tài)的切換,耗時(shí)比CAS的自旋比較操作耗時(shí)大得多。

原子性是什么?原子性就是最小單位,原子性操作就是最小的操作,無(wú)法再進(jìn)一步分割,這操作的結(jié)果只有2種,完成或者未完成。例如 int a = 1,這種就是原子性操作。而a ,這個(gè)就不是原子性操作,因?yàn)閍 ,會(huì)拆解為3步,讀取a的值,a增加1,再把a(bǔ)的值刷新。

還是那個(gè)例子,2個(gè)線程,同時(shí)對(duì)一個(gè)變量a進(jìn)行遞增,每次 1,遞增100次。當(dāng)2個(gè)線程都執(zhí)行完畢,a的結(jié)果不會(huì)是200,會(huì)小于200。

解決辦法?第一時(shí)間就會(huì)想到加個(gè)鎖,因?yàn)殒i能保證一段代碼塊執(zhí)行完畢,從而保證原子性。但是,如果要執(zhí)行的代碼足夠簡(jiǎn)單的時(shí)候,例如上面的只有個(gè)a ,使用鎖的話,會(huì)十分浪費(fèi),性能也不高,因?yàn)橐粋€(gè)線程獲得了鎖,其他線程都無(wú)法進(jìn)行了。所以,就需要用到了CAS

怎樣工作的:初始AtomicInteger的值為0線程A執(zhí)行:var5 = this.getIntVolatile(var1,var2);獲取的結(jié)果為:0線程A被暫停線程B執(zhí)行:var5 = this.getIntVolatile(var1,var2);獲取的結(jié)果為:0線程B執(zhí)行:this.compareAndSwapInt(var1,var2,var5,var5 var4)線程B成功將AtomicInteger中的值改為1線程A恢復(fù)運(yùn)行,執(zhí)行:this.compareAndSwapInt(var1,var2,var5,var5 var4),此時(shí)線程A使用var1和var2從AtomicInteger中獲取的值為:1,而傳入的var5為0,比較失敗,返回false,繼續(xù)循環(huán)。線程A執(zhí)行:var5 = this.getIntVolatile(var1,var2);獲取的結(jié)果為:1線程A執(zhí)行:this.compareAndSwapInt(var1,var2,var5,var5 var4),此時(shí)線程A使用var1和var2從AtomicInteger中獲取的值為:1,而傳入的var5為1,比較成功,將其修改為var5 var4,也就是2,將AtomicInteger中的值改為2,結(jié)束。

歡迎分享轉(zhuǎn)載→http://m.avcorse.com/read-216380.html

相關(guān)文章

    Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號(hào)-5 TXT地圖HTML地圖XML地圖