美文网首页
CAS和ABA问题

CAS和ABA问题

作者: tangyu_tyty | 来源:发表于2018-10-31 09:31 被阅读0次

@[toc]

一、什么是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).

这些方法的作用就是比较objectvalue(value是通过valueOffset找到的)是否符合expectVal(预期值),如果符合则swap(替换)objectvalue的值为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

相关文章

  • CAS和ABA问题

    @[toc] 一、什么是CAS (Compare And Swap) ? 在多线程环境下执行"check and ...

  • 原子操作 CAS CompareAndSwap

    参考 Java CAS ABA问题发生的场景分析 提到了ABA问题 Unsafe$compareAndSwapIn...

  • CAS中的ABA问题

    补档CAS中的ABA问题。 要特别注意,常见的ABA问题有两种,要求能分别举例解释。 CAS的使用可参考:源码|并...

  • CAS ABA问题

    java.util.concurrent包的最底层基础CAS技术,原理很简单。 CAS有3个操作数,内存值V,旧的...

  • CAS机制和ABA问题

    CAS无锁机制实现线程安全原理https://www.cnblogs.com/myopensource/p/817...

  • CAS算法和ABA问题

    CAS算法 CAS(Compare And Swap)比较并交换,它是一种算法,体现的是乐观锁的思想,总是认为自己...

  • JUC之ABA问题

    什么是ABA问题? ABA问题是由CAS而导致的一个问题 CAS算法实现一个重要前提需要取出内存中某时刻的数据并在...

  • 1.2.3JAVA锁相关

    ABA问题 在两个线程同时对一个资源进行CAS的时候,会导致ABA问题,就是在线程A进行了一次CAS,这个时候线程...

  • CAS和ABA

    CAS:对于内存中的某一个值V,提供一个旧值A和一个新值B。如果提供的旧值V和A相等就把B写入V。这个过程是原子性...

  • CAS和ABA

    独占锁(悲观锁)与乐观锁 在多线程编程的时候,为了保证多个线程对一个对象可以安全进行访问时,我们需要加同步锁syn...

网友评论

      本文标题:CAS和ABA问题

      本文链接:https://www.haomeiwen.com/subject/eouotqtx.html