详解CAS

一、CAS是什么?

CAS是Java中Unsafe类里面的一个方法,是Compare and Swap的缩写,中文翻译成比较并交换主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期值及更新值

CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性

执行CAS操作的时候,将内存位置的值与预期原值比较

  • 如果相匹配,那么处理器会自动将该位置值更新为新值;
  • 如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。

 1.1 CAS底层原理?如果知道,谈谈你对Unsafe的理解

1、 变量state用volatile修饰,保证了多线程之间的内存可见性。

2、Unsafe的特点:

  1. 不受jvm管理,也就意味着无法被GC,需要我们手动GC,稍有不慎就会出现内存泄漏。
  2. Unsafe的不少方法中必须提供原始地址(内存地址)和被替换对象的地址,偏移量要自己计算,一旦出现问题就是JVM崩溃级别的异常,会导致整个JVM实例崩溃,表现为应用程序直接crash掉。
  3. 直接操作内存,也意味着其速度更快,在高并发的条件之下能够很好地提高效率。

3、变量stateOffset,表示该变量值在内存中的偏移地址,因为Unsafe就是根据内存偏移地址获取数据的。

1.2 CAS缺点

  • 循环时间长开销很大
  • 引出来ABA问题(举例:张三账户本来有1000块,今天该发工资3000块了,财务打款3000,账户此时4000,然而张三老婆知道张三今天该发工资了,急用取出3000,等张三查余额的时候,发现是1000,以为没发工资,所以这就是ABA问题)

二、自旋锁,借鉴CAS思想

自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

自旋锁的实现基础是CAS算法机制。CAS自旋锁属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的女IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值