问题说明:

ABA问题是CAS的两个线程在处理某个数据的时候,当t1线程的执行时间较长,比如时间在10秒钟,t2线程的执行时间在2秒钟。在t1还没
执行完成的过程中,t2线程将值从100改成101,然后t2再次将值101改成了100,此时,t1线程并不知道t2线程干了什么猫腻。t1线程再次
去将100修改成2020是可以成功的,但是数值本身是被修改过的,不应该修改成功,所以这里就是出现了ABA问题

解决方案:

使用原子引用的带版本号的工具:AtomicStampReference类来解决,比如:t1的修改时间较长,t2每做一次修改,就给版本号加1,这样子
在CAS的时候,不仅仅需要比对值的是否相等,还需要比对版本号是否相等,这样即使t2修改了两次,t1在去修改的时候,仍然能够感知到
版本号不同,也就会引起修改失败,这样子就解决了ABA问题。

示例代码:

import java.util.concurrent.atomic.AtomicStampedReference;public class Test {static AtomicStampedReference atomicStampedReference = new AtomicStampedReference(100, 1);public static void main(String[] args) {//ABA问题的解决new Thread(() -> {int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName() + "\t 线程第一次的版本号:" + stamp);//执行ABA操作atomicStampedReference.compareAndSet(100,101,atomicStampedReference.getStamp(),atomicStampedReference.getStamp() + 1);System.out.println(Thread.currentThread().getName() + "\t 线程第二次的版本号:" + atomicStampedReference.getStamp());atomicStampedReference.compareAndSet(101,100,atomicStampedReference.getStamp(),atomicStampedReference.getStamp() + 1);System.out.println(Thread.currentThread().getName() + "\t 线程第三次的版本号:" + atomicStampedReference.getStamp());},"t1").start();new Thread(() -> {int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName() + "\t 线程第一次的版本号:" + stamp);try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}boolean b = atomicStampedReference.compareAndSet(100, 2019, stamp, stamp + 1);System.out.println(Thread.currentThread().getName() + "\t 线程修改成功与否:" + b + "当前最新实际版本号:" + atomicStampedReference.getStamp());System.out.println(Thread.currentThread().getName() + "当前最新实际值:" + atomicStampedReference.getReference());},"t2").start();}
}

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

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

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

  2. AtomicStampedReference解决CAS的ABA问题

    AtomicStampReference 解决CAS的ABA问题 什么是ABA ABA问题:指CAS操作的时候,线程将某个变量值由A修改为B,但是又改回了A,其他线程发现A并未改变,于是CAS将进行值 ...

  3. mysql解决aba问题_AtomicStampedReference解决CAS的ABA问题

    AtomicStampReference > 解决CAS的ABA问题 什么是ABA > ABA问题:指CAS操作的时候,线程将某个变量值由A修改为B,但是又改回了A,其他线程发现A并未改变 ...

  4. CAS的ABA问题描述 AtomicStampReference

    CAS的ABA问题描述 在CAS操作的时候,其他线程将当前变量的值从A改成B,又改回A: CAS线程用期望值A与当前变量比较的时候,发现当前变量没有变,于是CAS就将当前变量进行了交换操作,但其实当前 ...

  5. atomic原子类实现机制_并发编程:并发操作原子类Atomic以及CAS的ABA问题

    本文基于JDK1.8 Atomic原子类 原子类是具有原子操作特征的类. 原子类存在于java.util.concurrent.atmic包下. 根据操作的数据类型,原子类可以分为以下几类. 基本类型 ...

  6. java购买同一件商品时加锁_java中CAS的ABA问题思考和整理(不看后悔系列)

    前言 听说经常面试被问到~今天同事说了这个问题,就查了一下这问题,觉得挺有意思的,就整理出来跟大家分享下.主要思考下面几个问题: 1.什么是CAS? 2.什么是CAS的ABA问题? 3.怎么解决这个问 ...

  7. cas内外网同时访问_科普:CAS 和 ABA

    CAS简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制. CAS 它是一条CPU并发原语.操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...

  8. CAS ABA问题及解决方案示例

    CAS ABA问题 ABA问题是CAS机制中出现的一个问题,他的描述是这样的.我们直接画一张图来演示, 什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A.此时另外一个线程读取的时候,发现 ...

  9. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

最新文章

  1. 影像组学视频学习笔记(32)-使用SimpleITK进行N4偏置场校正、Li‘s have a solution and plan.
  2. 在叠堆及虚拟化的今天生成树存在的理由
  3. Ubuntu台式机如何用usb无线网卡共享网络
  4. BeanUtils包的使用
  5. uint8 转换为 float
  6. 08-mysql-条件查询-常见函数与小结
  7. 谷歌补丁Android官网,谷歌已发布 19年12月 Android 安全补丁
  8. 能力提升综合题单 Part 8.4 生成树Part 8.5 拓扑排序Part 8.6 差分约束
  9. WCF学习记录【一】
  10. QComboBox下拉框给选项增加删除按钮
  11. NBA比赛数据table表格
  12. px、%、em、vw、vh、vmax、vmin、rem区别
  13. JavaScript知识点全面概括与总结(上)
  14. laya龙骨换装_Laya的骨骼换装
  15. IOS 自定义 滑动返回 手势
  16. 程序员创业必读的几本书
  17. 万用表和示波器测量的区别?简单看完,让你少走弯路
  18. 桂电 计算机排名 评分,桂林电子科技大学学科评估结果及排名情况怎样
  19. CSAPP-处理器体系架构
  20. MYSQL DATA_FORMAT函数

热门文章

  1. Jenkins 学习总结(8)—— Jenkins X 入门实践
  2. 敏捷开发系列学习总结(11)——Scrum敏捷开发流程的三个角色、四个会议和三个物件
  3. Java Web学习总结(27)——JavaEE中Web服务器、Web容器、Application服务器区别及联系
  4. plc的指针和c语言指针,关于STEP7 Pointer指针的问题
  5. 机器学习pdf_2020年新书-《机器学习算法入门》免费pdf分享
  6. java读取文件buffered_关于Java中使用BufferedReader读取文件的疑惑
  7. php fetch mode,odbc_fetch_into
  8. java怎么传入参数到方法当中_java中方法传入参数时:值传递还是址传递?
  9. centos6.4安装apache php mysql_CentOS 6.4配置Apache+PHP5+MySQL(lamp)环境以及报错处理思路...
  10. azkaban的部署过程中遇到的一些坑(部署篇)