Java中是如何实现原子操作的?

原子(atomic)在物理上的定义是,不能被分割的最小的粒子。而在Java中,原子操作指的是不能被中断的一个或一系列操作。那么Java里面是如何实现原子操作的呢?

第一个方法是循环CAS

先简单说明一下什么是CAS。
CAS即compare and swap,比较并交换。CAS操作包含三个操作数:内存位置(V),预期原值(A),新值(B)。比较和交换就体现在这三个操作数上面,如果内存位置的值与预期原值相匹配,那么处理器会自动将新值更新到该内存位置,如果不匹配,处理器就不做操作。JVM中的CAS操作也正是利用了处理器提供的cmpxchg指令来实现的。
下面看一段循环CAS的代码来做进一步的了解:
这里写图片描述
这里写图片描述
最终结果不一致的原因是多个处理器同时从自己的缓存中读取变量i,各自加1后又放入内存,unsafeCount()方法不能保证原子性,因为多个处理器有可能同时执行i++操作,所以结果就如图所示。
这里写图片描述
从JDK 1.5开始,并发包里提供了一些类来支持原子操作,比如刚用到的AtomicInteger类。

第二个方法是锁

锁机制保证了只有获得锁的线程才可以操作锁定的内存区域。JVM中除了偏向锁,其他的锁都用了循环CAS的方式来获取锁和释放锁。

上一篇:多线程的发展历史及使用场景
下一篇:关于i++是不是原子操作的问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值