java併發:CAS

copare and swap

翻譯下來就是比較並轉換。

應用環境:

當去修改內存中某個值時,有三個參數條件。

V A B

V是代表此刻內存地址存值。 A是代表此刻內存地址應該有的值 。 B 是新值,即將要賦予的值。

原理:如下代碼。

public boolean setNew(){
    if (v.value == A){
        v.value = B
        return true;
    }
    return false;
}

如果內存存儲的是我們的期望值,那麼便修改它。否則我不動它。

作用:

在併發環境下,可以保證內存修改的原子性。

併發情況下,不是期望值,那麼直接返回,算是失敗。然後再次進入該方法,重複上面步驟,直到成功?(這是我推測的,這就是cas自旋嗎?)

JAVA:

java1.5之後才實現了cas.

該操作由sun.misc.Unsafe類裏面的compareAndSwapInt()和compareAndSwapLong()等幾個方法包裝提供,虛擬機在內部對這些方法做了特殊處理.java.uti.current.atomic原子包也都使用了Unsafe.

注意:

CAS 存在一個問題,就是一個值從 A 變爲 B ,又從 B 變回了 A,這種情況下,CAS 會認爲值沒有發生過變化.

對此,併發包下倒是有 AtomicStampedReference 提供了根據版本號判斷的實現,可以解決一部分問題。

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