您的位置:首页 > 其它

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: