CAS和ABA问题
2018-10-30 14:13
120 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36899865/article/details/83541072
文章目录
一、什么是CAS (Compare And Swap) ?
在多线程环境下执行"check and act"这样的代码,如果未能保证原子性,那么程序无法按照期望的那样运行.
- 一种解决方案是: 采用同步锁的方式来保证原子性,但是性能不高.
- 第二种解决方案: 利用CPU的特性来保证原子性. 这种方式就叫做CAS
整个juc都是建立在CAS之上的,对于synchronized阻塞算法,juc在性能上有了很大提升,会出现所谓的"ABA"问题
二、JUC是如何利用CAS的?
sun.misc.Unsafe中有几个叫
compareAndSwapXXX的native方法,如
compareAndSwapXXX(object, valueOffset, expectVal, updateVal).
这些方法的作用就是比较
object的
value(
value是通过
valueOffset找到的)是否符合
expectVal(预期值),如果符合则
swap(替换)
object的
value的值为
updateVal并返回
true,如果不符合则返回
false,这些方法利用了CPU特性保证了这一操作的原子性.
JUC中的原子类和并发集合等利用Unsafe提供的native方法保证了自身的原子性,一般做法就是循环调用compareAndSwapXXX直到返回true为止
三、什么是ABA问题?
当前情况:
object.value = A, 线程1的目的是将
object.value改成
B
- 线程1: 循环调用
compareAndSwapXXX
,给定的预期值为A
,想要更新为B
. - 线程2: 在线程1还未调到
compareAndSwapXXX
前,将object.value
改成B
然后再改成A
此时的线程1是不知道
object.value中间被改过值的,所以我们并不知道程序是否应该在
object.value在中间被改过值的情况下是否还要将
object.value改成
B
相关文章推荐
- Java并发编程笔记 Native方法,CAS操作与ABA问题
- CAS操作ABA问题发生的场景
- Java 并发与多线程规范(4) 自旋锁是可重入的吗?CAS与自旋锁的关系,CAS的ABA问题,以及乐观锁,悲观锁,互斥锁,读写锁的整理
- CAS-什么是ABA问题
- Java CAS 和ABA问题
- 无锁编程(四) - CAS与ABA问题
- Java CAS 和ABA问题
- 无锁编程(四) - CAS与ABA问题
- 聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题
- CAS 机制 & ABA 问题的理解
- 线程安全性(一) 原子性 AtomicStampReference解决CAS的ABA问题
- CAS与ABA问题
- 多线程(十二)CAS 和ABA问题
- Java并发学习(十)-CAS中ABA问题解决方法
- CAS下ABA问题及优化方案
- Java并发的CAS原理与ABA问题的讲解
- 【Java并发编程】2、无锁编程:lock-free原理;CAS;ABA问题
- CAS与ABA问题
- 并发与多线程知识点大纲梳理,含线程池、CAS与ABA等10个问题详解
- CAS下ABA问题及优化方案