面试官问我:如何解决ABA问题?我给出接近满分的回答
生活随笔
收集整理的這篇文章主要介紹了
面试官问我:如何解决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问题?我给出接近满分的回答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【三种解法实现】剑指 Offer 03.
- 下一篇: 【加权并查集】bzoj 4602 齿轮