1. 程式人生 > >CAS(Compare and Swap)理解

CAS(Compare and Swap)理解

轉自: https://www.cnblogs.com/longshiyVip/p/5205689.html

什麼叫CAS(Compare and Swap)? 

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

    有啥用處?

    對於常用多執行緒程式設計的人估計知道,對於一般人估計都不曾聽說。在jdk5之前,我們知道,在多執行緒程式設計的時候,為了保證多個執行緒對一個物件同時進行訪問時,我們需要加同步鎖synchronized,

保證物件的在使用時的正確性,但是加鎖的機制會導致如下幾個問題

    1.加多執行緒競爭下,加鎖和釋放鎖會導致較多的上下文切換,引起效能問題。

    2.多執行緒可以導致死鎖的問題。

    3.多執行緒持有的鎖會導致其他需要此鎖的執行緒掛起。

    4......

    有更好的辦法麼?

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

    獨佔鎖: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);
    }