一.ABA问题的产生

二.AtomicReference原子引用

三.AtomicStampedReference版本号原子引用

四.ABA问题解决

前面的内容之间的关联:CAS->Unsafe类->CAS思想->ABA问题->如何解决ABA问题

一.ABA问题的产生(狸猫换太子)

1)线程1和线程2开启时,按照之前讲述的对线程变量的操作,把主内存的值A复制到线程中的工作内存A

2)线程1需要10s,线程2需要2s,假设线程2先修改则线程2中的工作内存的值A和主内存中的值A修改为B

3)等待线程1的过程中,线程2又把自己内存中的值和主内存中的值修改为“A”

4)此时线程1开启,发现线程1中的A与主内存中的“A”相同,按照CAS的方法把值修改为B

简单的来说就是由于线程1和线程2存在时间差,线程2执行完之后又执行了一次改回来”原来的“值,线程1认为和自己的值相同,则又进行了操作。

二.AtomicReference原子引用

public class AtomicReferenceDemo {public static void main(String[] args) {User lzm = new User("lzm", 18);User lin = new User("lin", 20);AtomicReference<User> atomicReference = new AtomicReference<>();atomicReference.set(lzm);System.out.println(atomicReference.compareAndSet(lzm, lin)); // trueSystem.out.println(atomicReference.get()); // User(userName=lin, age=20)}
}
class User{String userName;int age;
}

三.AtomicStampedReference版本号原子引用

线程A和线程B初始值都为100,版本号都为1,假设线程A先执行,此时线程B挂起,线程A的值把100修改为101,此时版本号加1变为2,由于时间差,线程A又把值101修改为100,此时版本号继续加1变为3,主内存的值为“100”;此时线程B开启,线程B工作内存的值100与主内存中的“100”对比发现相同则进行修改操作,此时版本号变为2.这个过程中虽然修改成功但是线程B和主内存中100并非相同,主内存的值被狸猫换太子了,通过版本号就可清晰看出。

四.ABA问题解决

增加版本号

public class ABADemo2 {private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(100, 1);public static void main(String[] args) {new Thread(() -> {//获得版本号为1int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp);//睡眠1s是为了执行下面的一个线程使得版本号都为1开始try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//100修改为101再修改为100 产生ABA问题 每次修改版本号加1atomicStampedReference.compareAndSet(100, 101, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 );//版本号为2atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 );//版本号为3}).start();new Thread(() -> {//获得版本号为1int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp);//睡眠3s是为了让上面的线程先执行完 产生ABAtry {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}由于上面的线程版本号为3 这个线程版本号为2 所以返回falseboolean b = atomicStampedReference.compareAndSet(100, 2020, stamp, stamp + 1);System.out.println(b); // falseSystem.out.println(atomicStampedReference.getReference()); // 100}).start();}

ABA问题基础及解决相关推荐

  1. P41-前端基础-clear解决受浮动元素的影响而改变位置

    P41-前端基础-clear解决浮动元素的影响而改变位置 1.概述 问题描述 使用块元素设计页面布局,当A块元素设置浮动后,离开了文档流.相邻的块元素B受浮动的影响会改变原有的位置,移动到A元素位置. ...

  2. 三星s10待机耗电怎么解决_三星S10+,如何从基础上解决电量不足的问题

    一向被誉为安卓阵营领头羊的三星,于今年年初发布了全新旗舰S10系列.除了在性能.摄像以及屏幕上精益求精外,此次S10系列还给大家带来了新的惊喜--续航.特别是顶配版本S10+,更以4100mAh大电池 ...

  3. 【Python基础】解决matplotlib文字标签遮挡问题

    本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在进行数据可视化时我们常常需要在可视化作品 ...

  4. ABA问题分析与解决

    ABA问题分析 产生原因 CAS会导致ABA问题 CAS算法实现一个重要的前提是需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化. 比如说一个线程one从内存位置V ...

  5. (自学)sklearn决策树基础知识|解决centos7.8 graphviz报错不能画图的问题

    sklearn常规流程: from sklearn import tree #导入需要的模块 clf = tree.DecisionTreeClassifier()#实例化 clf = clf.fit ...

  6. 【C# 基础】— 解决 winForm 引用 Adobe PDF Reader控件不显示pdf 文件 问题

    前言 公司的CS 终端需要显示 PDF 文件 ,在换用了"Adobe PDF Reader" 这个控件后,运行程序不报错,窗体控件区显示一片空白,PDF 文件就是不显示,这是怎么回 ...

  7. 【爱因斯坦谜题】用python基础语法解决爱因斯坦谜题

    今天分享一个困难的谜题 据传是爱因斯坦还年轻时所想出来的 本人自学python已经有一段时间,偶然间了解到了爱因斯坦谜题,就想用已经学过的知识来解决这个谜题,下面我就将我的方法分享给大家. 题目: 有 ...

  8. Mac部分基础故障解决

    Mac故障解决 1.office for mac安装好后,打开word编辑输入法拼音乱码 打开word后点击上角的"帮助"→"检查更新"更新完成后输入法拼音显示 ...

  9. 关于react-router-dom 6.0.1的基础写法 解决Error A <Route> is only ever to be used as the child of <Routes>

    在新建react项目中 使用react-router-dom 6.0.1版本难免会遇到以下报错 Error: A <Route> is only ever to be used as th ...

最新文章

  1. c语言英语笔试题,C语言面试题(国外英语资料).doc
  2. nike附近门店查询_门店配送的全国服务网络如何快速成功运营?
  3. 设计模式在vue中的应用(五)
  4. 如何使用验证控件对DropDownList进行验证
  5. 常见危险文件列表 以及清除方法
  6. 如何给基于 SAP Cloud SDK 的应用增添缓存支持 Cache support
  7. 防病毒插件更新失败!?
  8. 04级函授计算机等级考试练习.rar
  9. Google云也想为中国企业服务,正与腾讯浪潮谈合作
  10. 【编译原理笔记15】运行存储分配概述,静态存储分配,栈式存储分配,调用序列和返回序列,非局部数据的访问,符号表,符号表建立
  11. 解决EXE文件无法打开的问题!
  12. 4 软件业务分析要点
  13. 黑客用社会工程学做渗透测试的广泛应用介绍
  14. java jpa是什么_jpa是什么框架?jpa是什么意思?
  15. [转]IDE 、SATA、SCSI 的区别
  16. Ubuntu Dolphinscheduler 执行命令 source: 未找到
  17. 王立平--scard0与scard1分别指的是什么?以及路径获取
  18. Android TTS语音播报实践
  19. excel文件导入hive乱码_hive 从Excel中导入数据
  20. leetcode记录-340-至多包含 K 个不同字符的最长子串-双指针

热门文章

  1. ip地址中斜杠(/)含义
  2. ffmpeg m4a 转pcm_使用 FFmpeg 转换音频文件
  3. Windows系统安装jdk1.7
  4. GIS系统在房产信息平台中的作用
  5. 什么是steam账号红信,如何避免steam账号红信,如何提升选品和消耗速度
  6. springboot整合druid 监控sql
  7. JavaScript实现页面加载成功后刷新一遍当前页面(二)
  8. python入门教程NO.3 用python破解谍报密码
  9. 【装机指南】显示器篇
  10. 使用 EMQ X Neuron 构建基于 Modbus 的 IIoT 应用