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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试官问我:如何解决ABA问题?我给出接近满分的回答

發布時間:2024/2/28 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官问我:如何解决ABA问题?我给出接近满分的回答 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先來看一下什么是ABA問題:
若線程1第一次讀取的值為A,線程1準備對A執行寫操作,但這段時間,線程2完成了A->B->A的更改,當線程1準備寫時,A已經不是原來的A了。

舉例

一個單鏈表,T1和T2分別取出A

T1把A改成了ACD,此時A->next=C。

但T2不知道,當T2嘗試把A換為B時,由于B->next是null(T1以為A->next也是null呢)替換后就會造成C、D處于游離狀態。


那么,如何解決ABA問題呢?

JDK1.5以后,推出了兩種辦法解決或改善ABA問題。分別是:AtomicStampedRefence和AtomicMarkableReference

1、AtomicStampedRefence

觀察其源碼發現:其內部的value被pair代替,即:

private volatile Pair<V> pair;

pair源碼:

private static class Pair<T> {final T reference;final int stamp;private Pair(T reference, int stamp) {this.reference = reference;this.stamp = stamp;}static <T> Pair<T> of(T reference, int stamp) {return new Pair<T>(reference, stamp);} }

可以看到,其內部不僅有T引用模板,還有一個int類型的stamp作為版本號,等到修改的時候,比較當前版本號與當前線程持有的版本號是否一致,若一直,則修改,并stamp+1


2、AtomicMarkableReference

觀察其源碼發現:其內部的value被pair代替,即:

private volatile AtomicMarkableReference.Pair<V> pair;

pair源碼:

static <T> AtomicMarkableReference.Pair<T> of(T var0, boolean var1) {return new AtomicMarkableReference.Pair(var0, var1); }

可以看到,其內部不僅有T引用模板,還有一個boolean類型的var1.

var1的值有兩個,true & false,修改的時候在這兩個版本號之間來回切換,這樣做并不能解決ABA問題,但可以降低其發生的幾率


??????——朝著一個目標不斷做精深練習,不斷犯錯,不斷挑戰自己的極限,這種你給你帶來的收獲絕對超出你的想象。

總結

以上是生活随笔為你收集整理的面试官问我:如何解决ABA问题?我给出接近满分的回答的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。