本文目錄
1 Compare And Swap(CAS)
2 Atomic
1 Compare And Swap(CAS)
CAS是一種無鎖的非阻塞算法。
CAS是一種樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,隻有其中一個可以更新變量的值,其它線程都将失敗,并繼續嘗試更新。
在CAS中有3個操作數:記憶體值V,預期舊值A,新值B。
當且僅當預期舊值A與記憶體值V相等時,才将記憶體值V修改為B,否則,失敗。
簡單示例:
(1) 獲得舊的值A:int a =get();
(2) 計算新的值B:int b = a +1;
(3) 寫入新的值B:set(a, b);
說明:
在設定新值的時候,給出預期舊值A;
若此時,記憶體值與預期舊值A相同,則說明期間未有其它線程修改過該值,無沖突,可寫入新值B;
若此時,記憶體值與預期舊值A不同,則說明期間有其它線程修改過該值,有沖突,基于舊值a計算得到的新值b已經無效。
2 Atomic
為了避免使用synchronized關鍵字(會降低性能),Java提供了實作CAS技術的類,可以在非激烈競争的情況下,以更小的開銷及更高的性能,使一些操作具備線程安全性。
java.util.concurrent.atomic中的常用類:
AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference<V>等。
2.1 AtomicInteger類
import java.util.concurrent.atomic.AtomicInteger;
public classCounter {
public volatile static AtomicInteger atoInt = new AtomicInteger(0);
public static void increase() {
atoInt.incrementAndGet();
}
public static void decrease() {
atoInt.decrementAndGet();
}
public static int get() {
return atoInt.get();
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Counter.increase();
}
}).start();
}
Thread.sleep(1000);
// 由于線程安全, 每次結果都為1000.
System.out.println("Result = "+ Counter.get());
}
}