Java模拟CAS的实现

锁是一种阻塞的实现方式,而CAS是一个非阻塞算法的常见实现。

CAS全称比较并交换。在Java的底层对这个的实现是利用了底层的机器指令。CAS主要包含了3个操作数—-需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。当且仅当V位置的值与预期的原值A相同时CAS才会通过原子的方式把新值B更新到A,否则不会执行任何操作。需要注意的是,无论是否操作成功都会返回V原有的值。这其实和乐观锁的冲突检查+数据更新的原理是一样的。

CAS的模拟

package com.coderman.cas;

/**
 * 模拟CAS
 * @Author zhangyukang
 * @Date 2020/7/21 21:30
 * @Version 1.0
 **/
public class CASDemoTest {

    private volatile int value;//内存中的值

    public  synchronized int compareAndSwap(int expectedValue, int newValue){
        int oldValue = value;//获取旧值
        if(oldValue == expectedValue){//如果期望值与当前V位置的值相同就给予新值
            value = newValue;
        }else{
            String name = Thread.currentThread().getName();
            System.out.println(name+"操作未成功");
        }
        return oldValue;//返回V位置原有的值
    }

    public static void main(String[] args) {

        CASDemoTest casDemoTest = new CASDemoTest();
        new Thread(()->{
            casDemoTest.compareAndSwap(0,1);
        },"线程1").start();

        new Thread(()->{
            casDemoTest.compareAndSwap(0,2);
        },"线程2").start();

        new Thread(()->{
            casDemoTest.compareAndSwap(0,3);
        },"线程3").start();

        new Thread(()->{
            casDemoTest.compareAndSwap(0,5);
        },"线程4").start();
    }

}

线程2操作未成功
线程3操作未成功
线程4操作未成功
# Java   算法   JUC  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×