JAVA实现CAS原理

CAS原理:

CAS:Compare and Swap,比较并交换。
CAS有3个操作数,旧的预期值A,内存地址中的值V,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做,可以理解它为一种乐观锁。

Java代码实现:

public class CasTest {

    private volatile int value;

    public int getValue() {
        return this.value;
    }

    //获取修改前的值
    public int getAndAddInt(Object old, int newvalue) {

        int value;
        do {
            //这个值实际上应该是通过old对象和引用地址偏移量获取到的真实内存值,
            value = this.getValue();
        } while (!this.CompareAndSwap(old, value, newvalue));

        return value;
    }

    // 比较内存值并修改。
    public boolean CompareAndSwap(Object old, int core, int update) {
        CasTest except = (CasTest) old;
        if (except.value == core) {
            value = update + core;
            return true;
        }
        return false;

    }

    public static void main(String[] args) throws InterruptedException {
        final CasTest casTest = new CasTest();
        for (int i = 0; i < 100; i++) {

            new Thread(() -> {
                int getInt = casTest.getAndAddInt(casTest, 1);
                System.out.println("返回的是修改前的值:" + getInt);
            }).start();

        }

        Thread.sleep(1000);
        System.out.println("最终结果值: " + casTest.getValue());


    }
}
 

上述代码实现中有两个点:

1、volatile 关键字保证了多线程下变量的可见性。

2、do while 循环进行比较并修改内存值,保证修改变量的原子性。

如有理解不到位的地方还请指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值