什麼是ABA問題?

時間 2021-05-05 13:00:29

1樓:Zhixuan Zhou

你點了一杯茅台(要求用普通塑料瓶裝),此時滿的A水位給你,然後你向窗外看下風景,在你看的期間,有乙個人就偷喝了一口此時水位為B,剛好,服務員也沒看到誰喝的,看到少了就給你滿上此時水位為A,然後你再回頭看你的水還是滿的A水位。心中還暗想沒有人知道我喜歡喝的是茅台吧,殊不知偷喝水的人知道了你喝的不是水,是茅台。。。

2樓:程式設計師cxuan

ABA 問題說的是,如果乙個變數第一次讀取的值是 A,準備好需要對 A 進行寫操作的時候,發現值還是 A,那麼這種情況下,能認為 A 的值沒有被改變過嗎?可以是由 A -> B -> A 的這種情況,但是 AtomicInteger 卻不會這麼認為,它只相信它看到的,它看到的是什麼就是什麼。舉個例子來說

假如現在有乙個單鏈表,如下圖所示

A.next = B ,B.next = null,此時有兩個執行緒 T1 和 T2 分別從單鏈表中取出 A ,由於一些特殊原因,T2 把 A 改為 B ,然後又改為 A ,此時 T1 執行 CAS 方法,發現單鏈表仍然是 A ,就會執行 CAS 方法,雖然結果沒錯,但是這種操作會造成一些潛在的問題。

此時還是乙個單鏈表,兩個執行緒 T1 和 T2 分別從單鏈表中取出 A ,然後 T1 把鍊錶改為 ACD 如下圖所示

此時 T2,發現記憶體值還是 A ,就會把 A 的值嘗試替換為 B ,因為 B 的引用是 null,此時就會造成 C、D 處於游離態

JDK 1.5 以後的 AtomicStampedReference類就提供了此種能力,其中的 compareAndSet 方法就是首先檢查當前值是否等於預期值,判斷的標準就是當前引用和郵戳分別和預期引用和郵戳相等,如果全部相等,則以原子方式設定為給定的更新值。

3樓:PERCENTILE

首先說結論,值的問題造不成什麼不良影響,其他答案舉的好多例子都翻車了。

我舉乙個真正能造成ABA的問題。

就是期望那裡是乙個有指標的節點時,沒有版本號的cas會造成ABA後果很嚴重的問題,完全錯亂。

你可能會問了,誰設計業務時候放指標的?我咋沒碰見過這麼設計的?

確實業務裡一般不這麼設計~

但是JDK原始碼裡juc那個包裡面鎖lock相關的,阻塞佇列實現的底層,同步器那裡,就是用原子類CAS操作指標,當然是代版本號的CAS~

是的,真他媽的去操作指標了~所以我們就有版本號的CAS了~

4樓:Justin

你和你女朋友吵架分手了。 分手後,你女朋友另外找了個物件。然後過了一段時間你女朋友和那個物件分手了,又找你復合了。但是你完全不知道你女朋友在分手的那段時間有處過物件。

5樓:satanson

看了一圈,更不明白了,看wiki第一句話,就解釋清楚了.

6樓:zmx

@朱凱 提款機的這個例子舉得比較好,不過情景應該再細節一點。如下。

小明賬戶上有100元。現在小明取錢,小強匯錢,詐騙分子盜刷三個動作同時進行。

1,小明取50元。

2,詐騙分子盜刷50元。

3,小強給小明匯款50元。

此時,銀行交易系統出問題,每筆交易無法通過簡訊告知小明。ABA問題就是:

1,小明驗證賬戶上有100元後,取出50元。——賬上有50元。

2,小強不會驗證小明賬戶的餘額,直接匯款50元。——賬上有100元。

3,詐騙分子驗證賬戶有100元後,取出50元。——賬上有50元。

小強沒有告訴小明自己匯錢,小明也沒收到簡訊,那麼小明就一直以為只有自己取款操作,最後損失了50元。

7樓:

扯cas有aba問題的說法,類似於:壓縮餅乾有感冒加重的問題。

cas的本意就是原子地完成比較和寫值。cas的比較只能比較目標值是否和期待值相等,並不能比較出目標值是否改變過!這點很難達成共識嗎?現在說cas會導致aba問題?

aba問題是cas導致的嗎?如果aba在你的場景中是乙個問題那麼請不要用cas,或者至少不要僅僅依靠cas。

壓縮餅乾的任務就是能充飢並且便攜,你非要指責壓縮餅乾會導致感冒加重,邏輯錯亂。為了解決這個偽問題,他們發明了加感冒藥版壓縮餅乾——AtomicStampedReference。

cas本身不是鎖,只是cas很容易用來封裝成鎖,樂觀鎖只是一種思想,並不是真的有一種鎖是樂觀的。有些場景是不封裝成鎖直接使用cas,例如對AtomicInteger的increase,這就是樂觀鎖思想的實踐,所以AtomicInteger.increase才能被稱為無鎖實現。

8樓:曉楚

補充乙個 ABA 問題場景,程式設計師很容易遇到:

排隊 (這個很常見,例如有 n 個執行緒,多人爭搶,當發現執行緒耗盡時就沒有搶到的人就退出,如果有空閒執行緒,則搶到執行,執行結束釋放執行緒。)

int used = 0;

int max = 4;

搶資源()

釋放資源()

上面的邏輯用 CAS 實現時,就能遇到 ABA 問題。

但是,對於這個場景來說,即使遇到了 ABA 問題,也是安全的。

9樓:XinPan

比如你要為乙個使用者充值100元,目前使用者有10元,你給他充了之後,變成110,然後使用者消費了100元,又變成了10元。這時候你要加乙個時間戳,來判斷這個使用者是否在後面被修改回原來的值。懂了嗎

10樓:尋寒

你確定你知道CAS?

CAS:對於記憶體中的某乙個值V,提供乙個舊值A和乙個新值B。如果提供的舊值V和A相等就把B寫入V。這個過程是原子性的。

CAS執行結果要麼成功要麼失敗,對於失敗的情形下一班採用不斷重試。或者放棄。

ABA:如果另乙個執行緒修改V值假設原來是A,先修改成B,再修改回成A。當前執行緒的CAS操作無法分辨當前V值是否發生過變化。

關於ABA問題我想了乙個例子:在你非常渴的情況下你發現乙個盛滿水的杯子,你一飲而盡。之後再給杯子裡重新倒滿水。

然後你離開,當杯子的真正主人回來時看到杯子還是盛滿水,他當然不知道是否被人喝完重新倒滿。解決這個問題的方案的乙個策略是每一次倒水假設有乙個自動記錄儀記錄下,這樣主人回來就可以分辨在她離開後是否發生過重新倒滿的情況。這也是解決ABA問題目前採用的策略。

為什麼我用ABA干預自閉症孩子效果很差?

優加黃老師 題主的問題過於簡單,沒有詳細的描述,這邊只能給您一些參考意見。第 一 是否強化給的不夠及時。最有效的強化應該是在行為發生後立即給予強化,在正確行為發生後沒有立刻給予強化那麼很有可能達不到理想的效果。第 二 是否強化的是正確的行為。比如家長的目標行為是讓孩子選擇綠色的積木,而孩子在選擇完綠...

什麼是真正的問題?什麼樣的問題,才真的是問題?

雲洗森嚴 剛剛上課時老師給了我們乙個隨堂作業 至少提出乙個問題,真正的問題,任何問題。19年來我第一次對問題這個詞語有了些問題。黑人問號臉 在之前的歲月裡面對家長 老師 朋友,面對著試卷上有關天文地理 物理化學的問題,有的回答錯誤了,有的回答正確。也許正是這些問題的答案讓我走到了現在這個樣子。好像也...

請問為什麼存在問題的反面是任意問題?

spdfQY 邏輯上講 反面 不同於生活中講反面,生活中你說黑的反面是白還是紅呢?好像都可以。邏輯上卻不然,將就乙個嚴謹,如何實現嚴謹?就需要用一些技術手段。一種方法是講擁有某性質的物件歸位一類,不擁有的歸為另一類,稱之為反面。題主這個問題也可以化為這種格式來研究,先把問題描述清楚 為什麼存在乙個x...