天天看點

Java 模拟 CAS 算法

Java 模拟 CAS 算法

CAS 簡介

  • CAS(Compare-And-Swap)是一種硬體對并發的支援,針對多處理器操作而設計的處理器中的一種特殊指令,用于管理對共享資料的并發通路。
  • CAS 是一種無鎖的非阻塞算法的實作。
  • CAS 包含了3個操作數

需要讀寫的記憶體值:V

進行比較的值即期望的舊值:A

拟寫入的新值:B

  • 當且僅當 V 的值等于 A 的值是,CAS 通過原子方式用新值 B 來更新 V 的值,否則不會執行任何操作。

CAS 算法 Java 實作

package top.simba1949;
public class TestCompareAndSwap {
    public static void main(String[] args) {
        final CompareAndSwap cas = new CompareAndSwap();
        for (int i = 0; i < 100; i++){
            new Thread(new Runnable() {
                public void run() {
                    int expectedValue = cas.get();
                    boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 100));
                    System.out.println(b);
                }
            }).start();
        }
    }
}
class CompareAndSwap{
    private int value;
    /**
     * 擷取記憶體值
     * @return
     */
    public synchronized int get(){
        return this.value;
    }
    /**
     * 比較,如果記憶體的舊值和期望的舊值相等,将更新舊值
     * @param expectedValue
     * @param newValue
     * @return
     */
    public synchronized int compareAndSwap(int expectedValue, int newValue){
        // 取舊值
        int oldValue = value;
        System.out.println("記憶體值:" + oldValue + ",預估值:" + expectedValue + ",新值:" + newValue);
        if (expectedValue == oldValue){
            this.value = newValue;
        }
        return oldValue;
    }
    /**
     * 無論指派成功與否,傳回舊值和期望值是否相等的結果,true 為成功,false 為失敗
     * @param expectedValue
     * @param newValue
     * @return
     */
    public synchronized boolean compareAndSet(int expectedValue, int newValue){
        return expectedValue == compareAndSwap(expectedValue, newValue);
    }
}