最近在看java線程的相關知識,關於java線程atomic等類cas問題的認識。

樂觀鎖被體現的機制,compare and swap。

cas:內存值v,舊的預期值a,要修改的新值b。只有當內存值v與舊的預期值a相等時纔會改成新的值b,否則則判定暫時有其他線程在做操作,不是線程安全的。內部沒有使用synchronized來實現,使用了volitile原語去直接讀內存中的值,沒有實現操作的原子性,只保證了操作的可見性,在atomic等類中被使用。 

private volatile int value;
public final int get() {
    return value;
}
public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}
public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
java.util.concurrent包中應用。
cas雖然沒有用同步就實現了線程安全,提升了併發的效率,但是容易導致aba問題。
aba問題就是當你在cas去操作數據的時候,另一個線程去操作這個數據,先將他從a改爲b,又從b改爲了a,這樣雖然他也操作了這個數據,但是數據看起來並沒有改變,cas去操作並不會認爲這個值是危險的,但是實際上這個值確實被其他的線程所操作過,這是可以用atomicStampedReference等去進行操作,stamp是帶有時間戳的操作,在進行數據更新的時候可以使用時間戳來區分數據是否是最新的,是否有可操作性,但是這種情況應該使用的場景不是很多吧,暫時沒有研究。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章