CAS
算法介紹
- CAS(比較與交換,Compare and swap) 是一種有名的無鎖算法。
- CAS具備原子性
- CAS, CPU指令,在大多數處理器架構,包括IA3二、Space中採用的都是CAS指令,CAS的語義是「我認爲V的值應該爲A,若是是,那麼將V的值更新爲B,不然不要更改該位置,只告訴我這個位置如今的值便可
- CAS是項 樂觀鎖 技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知此次競爭中失敗,並能夠再次嘗試。
- CAS有3個操做數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改成B,不然什麼都不作。
- 在JAVA中,sun.misc.Unsafe 類提供了硬件級別的原子操做來實現這個CAS。
- sun.misc.Unsafe中的value是用來存儲整數的時間變量,這裏被聲明爲volatile
- java.util.concurrent 包下的大量類都使用了這個 Unsafe.java 類的CAS操做。
使用場景
- 在Java語言中,++i和i++操做並非線程安全的,在使用的時候,不可避免的會用到synchronized關鍵字。而AtomicInteger則經過一種線程安全的加減操做接口。
class MyThread implements Runnable {
// static int i = 0;
static AtomicInteger ai=new AtomicInteger(0);
public void run() {
for (int m = 0; m < 1000000; m++) {
ai.getAndIncrement();
}
}
};
public class TestAtomicInteger {
public static void main(String[] args) throws InterruptedException {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
t1.start();
t2.start();
Thread.sleep(500);
System.out.println(MyThread.ai.get());
}
}