天天看點

7.網際網路大廠高頻面試題-ABA問題

文章目錄

  • ​​ABA問題​​
  • ​​AtomicReference原子引用​​
  • ​​AtomicStampedRerference版本号原子引用​​
  • ​​ABA問題的解決​​

ABA問題

ABA問題是cas的缺點之一,由cas引出。

7.網際網路大廠高頻面試題-ABA問題

ABA問題:狸貓換太子

7.網際網路大廠高頻面試題-ABA問題

多個線程有處理的時間差,會導緻ABA問題,中間可以有很多個B(或者是C),隻不過首位是一樣的,那個慢的線程就認為沒改過,會繼續修改,傳回true,這個過程并不是沒有問題的,這就是aba問題。

AtomicReference原子引用

cas是隻管開頭和尾巴,對的上就ok,在一些環境下是沒問題的(如果你不介意的話,隻管結果不管過程),但是如果在一些環境裡,要求中間不能變就出現問題了。

JUC隻提供了原子基礎類型,如果我們想用atomicUser這種,JUC就不提供了。但是JUC提供了自己造的方法!

7.網際網路大廠高頻面試題-ABA問題

這是一個原子包裝的泛型類,丢一個User進去就變成了atomicUser了。

代碼示例:

7.網際網路大廠高頻面試題-ABA問題

如果你想對某個類進行原子包裝,可以參考這個類的寫法。

AtomicStampedRerference版本号原子引用

cas存在aba問題,想要解決,最直接的思路就是在剛開始擷取的時候,帶上時間,這樣最後比對的時候也比對時間,哪怕值一樣,時間不一樣,也對不上,不會修改。

7.網際網路大廠高頻面試題-ABA問題
7.網際網路大廠高頻面試題-ABA問題

上面是2個線程的執行個體,T2做了中間修改,T1想比對的時候值對的上,但是版本号明顯低于最新的,就得去重新擷取最新的。

加時間戳的cas類:

7.網際網路大廠高頻面試題-ABA問題

ABA問題的解決

7.網際網路大廠高頻面試題-ABA問題

這個對象維護了一個整形對象的時間戳,他們能夠被原子的更新,也就是版本号。

案例複現ABA問題:

7.網際網路大廠高頻面試題-ABA問題

結果:

7.網際網路大廠高頻面試題-ABA問題

修改成功了,但是發生了ABA問題,中間有存在某種問題或陰謀。

ABA問題解決:

7.網際網路大廠高頻面試題-ABA問題
7.網際網路大廠高頻面試題-ABA問題

繼續閱讀