千家信息网

Java并发的CAS原理与ABA问题的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下Java并发的CAS原理与ABA问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!CAS原理在
千家信息网最后更新 2026年11月02日Java并发的CAS原理与ABA问题的示例分析

小编给大家分享一下Java并发的CAS原理与ABA问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

CAS原理

在计算机科学中,比较和交换(Compare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科)

CAS流程

以AtomicInteger.addAndGet()为例讲解CAS

javadoc

public final int addAndGet(int delta)
Atomically adds the given value to the current value, with memory effects as specified by VarHandle.getAndAdd(java.lang.Object…).
Parameters:
delta - the value to add
Returns:
the updated value

在Java的源码中

public final int addAndGet(int delta) {  return U.getAndAddInt(this, VALUE, delta) + delta;}

这里的VALUE是在该类初始化的时候获取到的,理解一下就是这时候我们调用unsafe的objectFieldOffset从Atomic类文件中获取value的偏移量,那么VALUE其实就是记录value的偏移量的。

VALUE准确的是value这个字段相对与AtomicInteger这个对象内存起始地址的偏移量,由于这个方法的最底层是JNI调用native的方法,所以需要传入这个值。

private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");

继续往下执行:

/** * Atomically adds the given value to the current value of a field * or array element within the given object {@code o} * at the given {@code offset}. * @param o object/array to update the field/element in * @param offset field/element offset * @param delta the value to add * @return the previous value * @since 1.8 **/@HotSpotIntrinsicCandidatepublic final int getAndAddInt(Object o, long offset, int delta) {  int v;  do {    v = getIntVolatile(o, offset);  } while (!weakCompareAndSetInt(o, offset, v, v + delta));  return v;}
@HotSpotIntrinsicCandidatepublic final boolean weakCompareAndSetInt(Object o, long offset,                     int expected,                     int x) {  return compareAndSetInt(o, offset, expected, x);}

如果obj内的value和expect相等,就证明没有其他线程改变过这个变量,那么就更新它为update,如果这一步的CAS没有成功,那就采用自旋的方式继续进行CAS操作。从代码中看着也是两个步骤,但其实在JNI里是借助于一个CPU指令完成的,实际还是原子操作。

ABA问题

产生ABA问题的原因

CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。这就是CAS的ABA问题。

如何规避ABA问题

常用的办法是在更新数据的时候加入版本号,以版本号来控制更新。

以上是"Java并发的CAS原理与ABA问题的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

问题 更新 内存 内容 原子 变化 原理 位置 就是 时候 篇文章 线程 偏移 示例 分析 实际 指令 方法 是在 版本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 西安纸贵互联网科技有限公司 互联网的科技 深圳互联网络科技有限公司 中国最先进互联网科技公司 科技与互联网的利与弊 江苏南京365互联网科技 银川新华互联网科技职业技术培训学校图片 汽车互联网创新科技园 重庆威客帮互联网科技 茂名市互联网科技产业园 彤创互联网科技有限公司 哈尔滨屹滨互联网科技有限公司 广州新华互联网科技学校电竞方面 广东工业互联网大赛深圳学泰科技 美国互联网科技公司 九思连强互联网电子科技有限公司 万物互联网智能科技 同城互联网络科技 承德科技产业互联网平台 广州全民伙伴互联网科技有限公司 成都互联网科技公司 撒么互联网科技公司 互联网科技公司做什么 科技大学互联网专业好不好 银川新华互联网科技学校地址 互联网经济与金融科技 米聚互联网科技南京有限公司排面 东莞新华互联网科技学校 工业互联网等科技实现智能化赋能 如何强化互联网金融科技
0