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);
    }
}

你可能感兴趣的:(数据结构与算法)