CAS ABA问题

ABA问题是CAS机制中出现的一个问题,他的描述是这样的。我们直接画一张图来演示,

什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以为是原来的那个A。这就是有名的ABA问题。ABA问题会带来什么后果呢?我们举个例子。

一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,你老婆出轨之后又回来,还是原来的老婆嘛?ABA问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的钱,在你发现之前又还了回来。但是别人却已经触犯了法律。

如何去解决这个ABA问题呢,就是使用今天所说的AtomicStampedReference。

问题解决

我们先给出一个ABA的例子,对ABA问题进行场景重现。

package cas;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;/*** cas aba问题*/
public class AtomicTest {private static AtomicInteger index = new AtomicInteger(10);public static void main(String[] args) {// 判断cas是否成功System.out.println(index.compareAndSet(100,89));new Thread(() -> {index.compareAndSet(10, 11);index.compareAndSet(11, 10);System.out.println(Thread.currentThread().getName() +":10->11->10");}, "张三").start();new Thread(() -> {try {TimeUnit.SECONDS.sleep(2);boolean isSuccess = index.compareAndSet(10, 12);System.out.println(Thread.currentThread().getName() +":index是预期的10嘛," + isSuccess+ "   设置的新值是:" + index.get());} catch (InterruptedException e) {e.printStackTrace();}}, "李四").start();}
}

在上面的代码中,我们使用张三线程,对index10->11->10的变化,然后李四线程读取index观察是否有变化,并设置新值。运行一下看看结果:

这个案例重现了ABA的问题场景,下面我们看如何使用AtomicStampedReference解决这个问题的。

package cas;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicStampedReference;/*** 使用版本号解决cas aba问题*/
public class AtomicTest2 {static AtomicStampedReference<Integer> stampRef= new AtomicStampedReference(10, 1);public static void main(String[] args) {new Thread(() -> {int stamp = stampRef.getStamp();System.out.println(Thread.currentThread().getName()+ " 第1次版本号: " + stamp);stampRef.compareAndSet(10, 11, stampRef.getStamp(), stampRef.getStamp() + 1);System.out.println(Thread.currentThread().getName()+ " 第2次版本号: " + stampRef.getStamp());stampRef.compareAndSet(11, 10, stampRef.getStamp(), stampRef.getStamp() + 1);System.out.println(Thread.currentThread().getName()+ " 第3次版本号: " + stampRef.getStamp());}, "张三").start();new Thread(() -> {try {int stamp = stampRef.getStamp();System.out.println(Thread.currentThread().getName()+ " 第1次版本号: " + stamp);TimeUnit.SECONDS.sleep(2);boolean isSuccess = stampRef.compareAndSet(10, 12,stamp, stamp + 1);System.out.println(Thread.currentThread().getName()+ " 修改是否成功: " + isSuccess + " 当前版本 :" + stampRef.getStamp());System.out.println(Thread.currentThread().getName()+ " 当前实际值: " + stampRef.getReference());} catch (InterruptedException e) {e.printStackTrace();}}, "李四").start();}
}

这使用的是AtomicStampedReference的compareAndSet函数,这里有四个参数:

compareAndSet(V   expectedReference,   V   newReference, int expectedStamp,    int newStamp)。

(1)第一个参数expectedReference:表示预期值。

(2)第二个参数newReference:表示要更新的值。

(3)第三个参数expectedStamp:表示预期的时间戳。

(4)第四个参数newStamp:表示要更新的时间戳。

当预期值和版本号均一致时才能修改成功。

CAS ABA问题及解决方案示例相关推荐

  1. 真实业务场景展现CAS原理的ABA问题及解决方案

    文章目录 阅读提示 CAS原理.ABA问题介绍 真实业务场景 如何解决ABA问题 CAS学习总结 阅读提示 本文将借助开保险柜的业务场景重点阐述误用AtomicBoolean引起的ABA问题,以及解决 ...

  2. CAS的ABA问题及解决方案

    问题说明: ABA问题是CAS的两个线程在处理某个数据的时候,当t1线程的执行时间较长,比如时间在10秒钟,t2线程的执行时间在2秒钟.在t1还没 执行完成的过程中,t2线程将值从100改成101,然 ...

  3. 打造个人云数据生活解决方案示例

    范围: 我这里说的个人云数据生活主要是最基本的几个方面: 将我日常最常用的数据信息邮件.联系人.文档.图片.视频.音频.笔记等在PC.Web.PAD.mobile之间打通,实现实时同步. 举个例子,我 ...

  4. volatile,CAS,ABA三个关键字

    1.volatile是java虚拟机提供的轻量级的同步机制,三个特点①保证可见性(JMM模型)②不保证原子性(存在往主内存写数据时覆盖)③禁止指令重排. 2.如何解决原则性:①加sync锁②使用JUC ...

  5. aba问题mysql_CAS -- ABA问题的解决方案

    CAS:Compare and Swap, 翻译成比较并交换. java.util.concurrent包中借助CAS实现了区别于synchronized同步锁的一种乐观锁. 其原理是CAS有3个操作 ...

  6. 5G LAN — 解决方案示例

    目录 文章目录 目录 中兴通讯 5G LAN 解决方案 5G LAN 网络能力开放层 数据转发层 中兴通讯 5G LAN 解决方案 5G LAN 网络能力开放层 该方案着重打造 LAN 业务能力开放 ...

  7. linux手误格式化,LINUX下误删除、格式化恢复解决方案(示例代码)

    一.总述:基于linux系统,删除数据及格式化后的数据恢复方案 1 .基于EXT2/EXT3/EXT4文件系统 2 .基于Reiserfs文件系统 3 .基于Xfs文件系统 二.解决方案 2.1 恢复 ...

  8. 基于Web的CAD一张图协同在线制图更新轻量级解决方案[示例已开源]

    背景 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 唯杰地图云端图纸管理平台),有不少朋友问,能不能实现一个协同的功能,实现不同部门不同专业间"一张图协同 ...

  9. 前端开发,用 css3 做一个求婚小动画

    首先放张效果图 然后一步步分析一下 首先是刚出现的新郎的动画 .w-m img{ margin-right: 0; float: right; margin-top: 60px; animation: ...

最新文章

  1. oracle循环语句loop,oracle循环语句loop
  2. Ubuntu下千千静听Audacious的安装步骤详解
  3. Activiti工作流入门
  4. 全球及中国矢量超导磁体行业“十四五”竞争状况及投资前景策略分析报告2021-2027年版
  5. 手机空间定位_你或许被默默定位很久了却不知情,盘点生活中各类定位技术
  6. php 上传pdf文件损坏,php – 强制下载PDF文件,损坏文件
  7. Java——UPD输出及优化再优化
  8. dojo 九 effects dojo/_base/fx 和 dojo/fx
  9. php 上传文件简单实例,php文件上传的简单实例
  10. “交通·未来”第22期:城市轨道交通管理与控制优化:相关问题及方法
  11. 玩转 ESP32 + Arduino (十九) SIM800L调试(基于TTGO T-CALL)
  12. linux化学公式软件下载,化学公式编辑器下载-Efofex FX Chem(化学公式编辑器)下载 v3.004.0 官方特别版-IT猫扑网...
  13. 网页设计css导航链接怎么做,如何用DIV+CSS制作导航条
  14. 程序员除了去上班还能怎样赚钱?
  15. html 页面换皮肤,HTML中如何实现更换网页皮肤
  16. 英语自我介绍资料及范文
  17. Riverbed SteelConnect荣获2017 Interop东京展“最佳展示奖”
  18. 深圳Go培训:Go语言适合干什么?
  19. win7快捷键_?如何用U盘安装win7系统?
  20. php实现撩妹,50个撩妹金句,充满套路又不失幽默

热门文章

  1. python生成一笔画_python求解微信小游戏——一笔画完
  2. 【 日常 】 马跳日问题 18年3月17日18:09 [ 12 ]
  3. 100集华为HCIE安全培训视频教材整理 | 流量型攻击防范技术-UDP
  4. 初一的学生学信息学计算机编程,初中信息技术课堂如何让学生爱上编程
  5. 各厂内推整理 | 第三期
  6. 【ERP】常见错误收集
  7. 三十岁——男人创业的最佳时机
  8. 聊一聊浏览器缓存机制
  9. 计算机领域中Task和Job的区别
  10. 基于proteus的51单片机仿真实例五、第一个proteus仿真实例(续)