CAS

自己学了CAS然后来简单讲述一下这玩意,刚接触其实觉得挺搞人的。所谓CAS就是compareAndSet;
通过英文单词可以理解为比较并修改。`

public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5,2019)+"\t current data"+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5,1024)+"\t current data"+atomicInteger.get());
    }
}

我们可以看到我们先创建一个AtomicInteger对象。然后下面掉了一个CAS方法首先第一个参数是espect就是期望值,第二个参数是Update修改值。也就是说如果我们拿到的期望值和我们给的参数期望值是一致的情况下我们就对这个数进行修改。下面我们可以看一下这个value在源码当中怎么定义的
在这里插入图片描述
我们可以看到是被volatile修饰过的,我们都知道volatile关键字修饰过的变量对于其他线程来说都具有可见性,所以在这一块如果不了解这个关键字的话可以先去了解一下再来看这个博客。可见性的意思就是当主内存里面存的值修改了,别的线程会立马得到消息知道这个值被修改成多少。
所以在上面这一段代码中第一个输出的是true 以及 2019 第二个输出的是false 1024因为值已经从5修改成2019所以当运行第二段代码时候这里拿到的期望值是2019与他需要的期望值5不符合所以就不会对他做修改。
接下来我们看一下他到底是怎么操作的,我们进入compareAndSet()这个方法里面瞅一眼。
在这里插入图片描述
这里我们看到它其实直接return了unsafe里面的一个方法叫compareAndSwapInt();
这边我给大家解释一下三个参数代表的意思。
this:这边this代表的是需要修改的对象。
valueOffset:这边代表的是对象的内存偏移量
expect:这边是期望值
update:这边是修改后的值
然后我们继续进入方法看一下unsafe这个类里面看一下。其实在这里我们可以到我们java安装目录里面看一下这个类他是在sun/misc里面的。
在这里插入图片描述
这边看到native我们其实就应该知道这是一个本地方法。
在这里插入图片描述
这边就讲到重点了。我们看到里面有compareAndSwapInt();这个方法就得知最终是走这边的。用了do while;首先我先解释一下var1对应的就是对象,var2对应的就是对象内存地址偏移量,var4就是修改后的值。首先我们先用var5来获取当前主内存里面存的值。然后通过this.compareAndSwapInt这个方法来修改如果说var5期望值与我们所获取的期望值一致,那么结果会是true再取反就是false那我们就退出循环直接return var5注意这边var5已经是var5+var4了。如果我们所需要的期望值var5与拿到的值var5不一致结果就是false 取反就是true。那么执行循环继续重新获取最新的var5然后执行方法直到我们所获取的值与我们的期望值一致的时候我们才退出循环。返回var5修改后的值。

最后还是希望大家能够指认我的错误,谢谢大家。希望能和大家一起共同进步!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值