加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长资讯 > 动态 > 正文

CAS与ABA问题

发布时间:2021-04-03 12:43:42 所属栏目:动态 来源:互联网
导读:解ABA问题,我们得先知道什么是CAS,CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制。CAS的出现主要是为了解决多线程并发情况下,数据的不一致问题。 CAS底层原理 CAS 的思想很简单:三个参数,一个当前内存值 V、旧的预期值 A、

解ABA问题,我们得先知道什么是CAS,CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制。CAS的出现主要是为了解决多线程并发情况下,数据的不一致问题。

CAS底层原理

CAS 的思想很简单:三个参数,一个当前内存值 V、旧的预期值 A、即将更新的值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值修改为 B 并返回 true,否则什么都不做,并返回 false

Unsafe类

Unsafe类是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,基于该类可以直接操作特定内存的数据。Unsafe类存在与sum.misc包中,其内部实现是C++写的,我从JDK1.8源码中截取了关键代码
 

从上面代码可以看出最后调用的是Atomic:comxchg这个方法,这个方法的实现放在hotspot下的os_cpu包中,说明这个方法的实现和操作系统、CPU都有关系,以多核CPU为例:

  • 首先会判断CPU是否为多核,如果是多核加一个lock内存屏障,这样就可以防止多线程并发情况竞争发生
  • 进行对比交换,调用汇编指令cmpxchg获取新值并设值。

CAS问题

cas实现

从JDK1.5开始,java.util.concurrent包为我们提供了许多cas操作类诸如:AtomicInteger,

AtomicLong,AtomicReference,它提供了轻量级的锁机制有着更好的性能,但同时也会出现一些问题,我们通过一张图来说明:

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读