使用CAS引發(fā)ABA問(wèn)題

由于CAS原子操作性能高,因此其在JUC包中被廣泛引用,只不過(guò)如果使用得不合理,CAS原子操作就會(huì)存在ABA問(wèn)題。

1、了解ABA問(wèn)題

什么是ABA問(wèn)題?比如一個(gè)線程A從內(nèi)存位置M中取出V1,另一個(gè)線程B也取出V1?,F(xiàn)在假設(shè)線程B進(jìn)行了一些操作之后將M位置的數(shù)據(jù)V1變成了V2,然后又在一些操作之后將V2變成了V1。之后,線程A進(jìn)行CAS操作,但是線程A發(fā)現(xiàn)M位置的數(shù)據(jù)仍然是V1,然后線程A操作成功。盡管線程A的CAS操作成功,但是不代表這個(gè)過(guò)程是沒(méi)有問(wèn)題的,線程A操作的數(shù)據(jù)V1可能已經(jīng)不是之前的V1,而是被線程B替換過(guò)的V1,這就是ABA問(wèn)題。

2、ABA問(wèn)題解決方案

很多樂(lè)觀鎖的實(shí)現(xiàn)版本都是使用版本號(hào)(Version)方式來(lái)解決ABA問(wèn)題。樂(lè)觀鎖每次在執(zhí)行數(shù)據(jù)的修改操作時(shí)都會(huì)帶上一個(gè)版本號(hào),版本號(hào)和數(shù)據(jù)的版本號(hào)一致就可以執(zhí)行修改操作并對(duì)版本號(hào)執(zhí)行加1操作,否則執(zhí)行失敗。因?yàn)槊看尾僮鞯陌姹咎?hào)都會(huì)隨之增加,所以不會(huì)出現(xiàn)ABA問(wèn)題,因?yàn)榘姹咎?hào)只會(huì)增加,不會(huì)減少。

3、使用AtomicStampedReference解決ABA問(wèn)題

參考樂(lè)觀鎖的版本號(hào),JDK提供了一個(gè)AtomicStampedReference類(lèi)來(lái)解決ABA問(wèn)題。AtomicStampReference在CAS的基礎(chǔ)上增加了一個(gè)Stamp(印戳或標(biāo)記),使用這個(gè)印戳可以用來(lái)覺(jué)察數(shù)據(jù)是否發(fā)生變化,給數(shù)據(jù)帶上了一種實(shí)效性的檢驗(yàn)。

AtomicStampReference的compareAndSet()方法首先檢查當(dāng)前的對(duì)象引用值是否等于預(yù)期引用,并且當(dāng)前印戳(Stamp)標(biāo)志是否等于預(yù)期標(biāo)志,如果全部相等,就以原子方式將引用值和印戳(Stamp)標(biāo)志的值更新為給定的更新值。

AtomicStampReference的構(gòu)造器有兩個(gè)參數(shù),具體如下:

AtomicStampReference常用的幾個(gè)方法如下:

AtomicStampedReference的CAS操作的定義如下:

compareAndSet()方法的第一個(gè)參數(shù)是原來(lái)的CAS中的參數(shù),第二個(gè)參數(shù)是替換后的新參數(shù),第三個(gè)參數(shù)是原來(lái)CAS數(shù)據(jù)舊的版本號(hào),第四個(gè)參數(shù)表示替換后的新參數(shù)版本號(hào)。

進(jìn)行CAS操作時(shí),若當(dāng)前引用值等于預(yù)期引用值,并且當(dāng)前印戳值等于預(yù)期印戳值,則以原子方式將引用值和印戳值更新為給定的更新值。

4、使用AtomicMarkableReference解決ABA問(wèn)題

AtomicMarkableReference是AtomicStampedReference的簡(jiǎn)化版,不關(guān)心修改過(guò)幾次,只關(guān)心是否修改過(guò)。因此,其標(biāo)記屬性mark是boolean類(lèi)型,而不是數(shù)字類(lèi)型,標(biāo)記屬性mark僅記錄值是否修改過(guò)。

AtomicMarkableReference適用于只要知道對(duì)象是否被修改過(guò),而不適用于對(duì)象被反復(fù)修改的場(chǎng)景。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容