CAS(Compare and Swap)理解

什麼叫CAS(Compare and Swap)? java

    硬件同步原語!! 什麼蛋疼的名字,通常人很難理解。根據英文全稱翻譯==比較與交換,這個名字大體還能理解一點,目前先暫且這麼理解吧.算法

    有啥用處?
編程

    對於經常使用多線程編程的人估計知道,對於通常人估計都未曾據說。在jdk5以前,咱們知道,在多線程編程的時候,爲了保證多個線程對一個對象同時進行訪問時,咱們須要加同步鎖synchronized,保證對象的在使用時的正確性,可是加鎖的機制會致使以下幾個問題多線程

    1.加多線程競爭下,加鎖和釋放鎖會致使較多的上下文切換,引發性能問題。
性能

    2.多線程能夠致使死鎖的問題。
this

    3.多線程持有的鎖會致使其餘須要此鎖的線程掛起。atom

    4......
spa

    有更好的辦法麼?
線程

    鎖的分類:獨佔鎖(悲觀鎖),樂觀鎖
翻譯

    獨佔鎖:synchronized就是一種獨佔鎖,它會致使全部須要此鎖的線程掛起,等待鎖的釋放。

    樂觀鎖:每次不加鎖去完成操做,若是由於衝突失敗就重試,直到成功。

    CAS的機制就至關於這種(非阻塞算法),CAS是由CPU硬件實現,因此執行至關快.CAS有三個操做參數:內存地址,指望值,要修改的新值,當指望值和內存當中的值進行比較不相等的時候,表示內存中的值已經被別線程改動過,這時候失敗返回,當相等的時候,將內存中的值改成新的值,並返回成功。

    java 中代碼實現

   在 java.util.concurrent.atomic包中能夠查看源代碼的實現,這裏參java.util.concurrent.atomic.AtomicLong源代碼,貼出核心代碼:

//+1操做
    public final long getAndIncrement() {
        while (true) {
            long current = get();
            long next = current + 1;
            //當+1操做成功的時候直接返回,退出此循環
            if (compareAndSet(current, next))
                return current;
        }
    }
    //調用JNI實現CAS
    public final boolean compareAndSet(long expect, long update) {
    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
    }
相關文章
相關標籤/搜索