CAS和ABA问题

@[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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 无锁的概念 在谈论无锁概念时,总会关联起乐观派与悲观派,对于乐观派而言,他们认为事情总会往好的方向发展,总是认为坏...
    架构师springboot阅读 4,695评论 0 4
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 13,879评论 4 56
  • 定义 无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避...
    匆匆岁月阅读 5,553评论 0 0
  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 11,400评论 1 5
  • 少时家贫,北方人士,常以面条为食,两把青菜,一个鸡蛋,三两滴香油,笑逐颜开把碗净。一周一次,土豆炖鸡腿,一...
    无右阅读 5,218评论 0 0