CAS操作是怎么实现的

    CAS是compare and swap,翻译过来就是比较并交换。维护三个变量值,一个是内存值V,一个是期望的旧的值A,一个是要更新的值B。更新一个变量的时候,只有当预期值A与内存V中的值相等的时候,才会执行更新操作,把内存V的值改为B。

    从思想上来说,synchronized属于悲观锁,悲观的认为程序中的并发情况严重,所以严防死守,CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去重试更新。在java中,除了Atomic系列类,以及Lock系列类的底层实现,甚至在java1.6以上版本,synchronized在变为重量级锁之前,也会采用CAS机制。

缺点:

  1. CPU开销过大,因为如果有很多线程一直在反复尝试更新一个变量,却又更新不成功时,就会一直自旋消耗CPU;
  2. 不能保证代码块的原子性,它只能保证一个变量的原子性;
  3. ABA问题。(一个值从A变成B,又更新回A,普通CAS会误判通过检测。利用版本号机制可以解决ABA问题。)

 

unsafe类:

    java不能直接访问操作系统底层,而是通过本地方法来访问。unsafe类提供了硬件级别的原子操作,用来获取内存地址的值并进行修改,他的修改逻辑是对比内存地址的值和预期值是否一样,如果一样进行修改。利用的CAS原理。

 

参考:https://blog.csdn.net/qq_32998153/article/details/79529704

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值