CAS是什么?(思想)

英文:CompareAndSwap
判断内存某个位置的值是否为预期值,如果是则更改为新值
说白了就是比较和交换

三行代码解释其作用:
首先我们创建AtomicInteger原子类,给他赋值为5,不了解原子类的可以暂时把他看成一个普通的Int类型。
然后调用compareAndSet(5, 6)方法,这个参数 5 跟atomicInteger 的值(5)进行对比,如果相等,则将参数值6赋值给atomicInteger ,结果返回true,如果不相等,不做任何处理,返回false

 AtomicInteger atomicInteger = new AtomicInteger(5;
 System.out.println(atomicInteger.compareAndSet(5,6)+
 ",atomicInteger :"+atomicInteger);
  System.out.println(atomicInteger.compareAndSet(5,9)+
 "atomicInteger :"+atomicInteger);

所以上述结果为:
true, atomicInteger :6
false, atomicInteger :6

思考:为什么要这样子的?有什么用?
根据JMM内存模型,内存在读取主内存变量时,会在本地变量拷贝一份,在后对拷贝的副本进行操作。
假设主内存有共享变量X=1,线程A和线程B,同时读到A并在直接的本地内存拷贝了副本X=1
假设线程A对数据X进行操作X=10,并提交给主内存,此时主内存X=10。
而此时线程B的本地内存X还是等于1,然后线程B对X进行操作,X++ (即X=2)并提交给主内存,此时主内存X变为X=2,而此前A的操作被冲走了,这就造成很大的安全问题。

CAS就是为了确保在本地内存数据向主内存提交时,主内存中的数据没有被其他线程改变,即主内存中的数据和本地内存中操作的数据一致

图来自网络,侵删

这里暂时讲到思想,如果你想了解其底层或者缺点可以搜索unsafe方法,自旋锁,ABA问题。

如果你觉得有一点点帮助给个赞哟~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值