CAS操做:架構
Compare and Swap,比較並操做,CPU指令,在大多數處理器架構,包括IA3二、Space中採用的都是CAS指令,CAS的語義是「我認爲V的值應該爲A,若是是,那麼將V的值更新爲B,不然不修改並告訴V的值實際爲多少」,CAS是項樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知此次競爭中失敗,並能夠再次嘗試。CAS有3個操做數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改成B,不然什麼都不作。ide
悲觀鎖和樂觀鎖this
獨佔鎖是一種悲觀鎖,synchronized就是一種獨佔鎖,它假設最壞的狀況,而且只有在確保其它線程不會形成干擾的狀況下執行,會致使其它全部須要鎖的線程掛起,等待持有鎖的線程釋放鎖。而另外一個更加有效的鎖就是樂觀鎖。所謂樂觀鎖就是,每次不加鎖而是假設沒有衝突而去完成某項操做,若是由於衝突失敗就重試,直到成功爲止。spa
簡單來說就是,當我所認爲的A與實際上內存的V相同的時候,就把新的值B給V,不然就失敗重來。操作系統
這裏粘貼一個,模擬CAS實現的計數器:線程
public class CASCount implements Runnable { private SimilatedCAS counter = new SimilatedCAS(); @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println(this.increment()); } } public int increment() { int oldValue = counter.getValue(); int newValue = oldValue + 1; while (!counter.compareAndSwap(oldValue, newValue)) { //若是CAS失敗,就去拿新值繼續執行CAS oldValue = counter.getValue(); newValue = oldValue + 1; } return newValue; } public static void main(String[] args) { Runnable run = new CASCount(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); } } class SimilatedCAS { private int value; public int getValue() { return value; } // 這裏只能用synchronized了,畢竟沒法調用操做系統的CAS public synchronized boolean compareAndSwap(int expectedValue, int newValue) { if (value == expectedValue) { value = newValue; return true; } return false; } }