JAVA線程併發性之CAS算法,模擬實現代碼

在瞭解算法之前,我們先對回顧基本概念:

原子性:具有不可分割性。比如 a=0;(a非long和double類型) 這個操作是不可分割的,那麼我們說這個操作時原子操作。再比如:a++; 這個操作實際是a = a + 1;是可分割的,所以他不是一個原子操作。非原子操作都會存在線程安全問題。

volatile 關鍵字:當多個線程進行操作共享數據時,可以保證內存中的數據可見,使得對臨界區資源的修改可以馬上被其他線程看到,它是通過添加內存屏障實現的。(底層調用JVM的內存柵欄,對數據實時向主存中進行更新)

CAS:Compare and Swap,是比較並交換的意思。是一種非阻塞算法 (nonblocking algorithms)

CAS有3個操作數,內存值V,預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改爲B,否則什麼都不做。

模擬CAS算法實現


/**
 * 模擬CAS算法 本案例中 synchronized所修飾方法 JVM底層通過硬件實現,本案例僅模擬
 * 
 * @author xiaoqiang
 * @Time 2017-7-4
 */
public class CompareAndSwap {
    private int value;

    /**
     * 獲取當前內存值
     * 
     * @return
     */
    public synchronized int get() {
        return value;
    }

    /**
     * 若不成功可繼續操作直到成功
     * 
     * @param expectedValue
     *            預期值
     * @param newValue
     *            新值
     * @return 是否成功
     */
    public synchronized boolean compareAndSwap(int expectedValue, int newValue) {
        int oldValue = value;

        if (oldValue == expectedValue) {
            this.value = newValue;
        }

        return oldValue == expectedValue;
    }

    public static void main(String[] args) {
        CompareAndSwap cas = new CompareAndSwap();

        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                // Lambda表達式書寫代碼 (JDK1.8新特性)
                int value = cas.get();
                System.out.println(cas.compareAndSwap(value, (int) (Math.random() * 100)));
            }).start();
        }
    }

}

JAVA 8 Lambda表達式使用-> click me

CAS算法詳解 ->大家可以看看兩位大神寫的

理解CAS算法在JAVA中的作用

java高併發:CAS無鎖原理及廣泛應用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章