JMM-原子操作CAS

JMM-原子操作CAS

一:概念

CAS是原子类中的compareAndSet方法,这种原子类有

AtomicInteger

AtomicLong等等

CompareAndSwapObject的缩写,底层采用Unsafe类进行的操作。

Java 并发机制实现原子操作有两种: 一种是锁,一种是CAS。

Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程去尝试更新,成功则更新,失败返回原来的值。

二:CAS的产生

在修饰共享变量的时候经常使用volatile关键字,但是volatile值有可见性和禁止指令重拍(有序性),无法保证原子性。虽然在单线程中没有问题,但是多线程就会出现各种问题,造成现场不安全的现象。所以jdk1.5后产生了CAS利用CPU原语(不可分割,连续不中断)保证现场操作原子性。

三:Unsafe类

说道CAS就不得不说Unsafe类;CAS底层就是采用的Unsafe操作内存的。

Java无法直接访问底层操作系统,而是通过本地native方法来访问,但还是留了一个后门-Unsafe类,提供了一些低层次操作,如直接内存访问等。

四:Unsafe类中使用自旋锁的方法

注意:下面方法的自旋锁是通过CAS来实现的

do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

1:getAndAddInt

首先取内存中的值,然后执行CAS操作,如果成功则返回修改前的值;如果取完内存值后执行CAS失败,比如被其他线程修改了值,则重新取内存中的值,继续CAS,直到成功,getAndAddInt正是乐观锁,用CAS代替锁,如果出现竞争,则用自旋的方式等待;

2:getAndAddLong

3:getAndSetInt

...等等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值