面试官问我:如何解决ABA问题?我给出接近满分的回答
先來(lái)看一下什么是ABA問(wèn)題:
若線程1第一次讀取的值為A,線程1準(zhǔn)備對(duì)A執(zhí)行寫(xiě)操作,但這段時(shí)間,線程2完成了A->B->A的更改,當(dāng)線程1準(zhǔn)備寫(xiě)時(shí),A已經(jīng)不是原來(lái)的A了。
舉例
一個(gè)單鏈表,T1和T2分別取出A
T1把A改成了ACD,此時(shí)A->next=C。
但T2不知道,當(dāng)T2嘗試把A換為B時(shí),由于B->next是null(T1以為A->next也是null呢)替換后就會(huì)造成C、D處于游離狀態(tài)。
那么,如何解決ABA問(wèn)題呢?
JDK1.5以后,推出了兩種辦法解決或改善ABA問(wèn)題。分別是:AtomicStampedRefence和AtomicMarkableReference
1、AtomicStampedRefence
觀察其源碼發(fā)現(xiàn):其內(nèi)部的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);} }可以看到,其內(nèi)部不僅有T引用模板,還有一個(gè)int類(lèi)型的stamp作為版本號(hào),等到修改的時(shí)候,比較當(dāng)前版本號(hào)與當(dāng)前線程持有的版本號(hào)是否一致,若一直,則修改,并stamp+1
2、AtomicMarkableReference
觀察其源碼發(fā)現(xiàn):其內(nèi)部的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); }可以看到,其內(nèi)部不僅有T引用模板,還有一個(gè)boolean類(lèi)型的var1.
var1的值有兩個(gè),true & false,修改的時(shí)候在這兩個(gè)版本號(hào)之間來(lái)回切換,這樣做并不能解決ABA問(wèn)題,但可以降低其發(fā)生的幾率
??????——朝著一個(gè)目標(biāo)不斷做精深練習(xí),不斷犯錯(cuò),不斷挑戰(zhàn)自己的極限,這種你給你帶來(lái)的收獲絕對(duì)超出你的想象。
總結(jié)
以上是生活随笔為你收集整理的面试官问我:如何解决ABA问题?我给出接近满分的回答的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【三种解法实现】剑指 Offer 03.
- 下一篇: 【加权并查集】bzoj 4602 齿轮