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 提供了根據版本號判斷的實現,可以解決一部分問題。