ABA问题基础及解决
一.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问题基础及解决相关推荐
- P41-前端基础-clear解决受浮动元素的影响而改变位置
P41-前端基础-clear解决浮动元素的影响而改变位置 1.概述 问题描述 使用块元素设计页面布局,当A块元素设置浮动后,离开了文档流.相邻的块元素B受浮动的影响会改变原有的位置,移动到A元素位置. ...
- 三星s10待机耗电怎么解决_三星S10+,如何从基础上解决电量不足的问题
一向被誉为安卓阵营领头羊的三星,于今年年初发布了全新旗舰S10系列.除了在性能.摄像以及屏幕上精益求精外,此次S10系列还给大家带来了新的惊喜--续航.特别是顶配版本S10+,更以4100mAh大电池 ...
- 【Python基础】解决matplotlib文字标签遮挡问题
本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在进行数据可视化时我们常常需要在可视化作品 ...
- ABA问题分析与解决
ABA问题分析 产生原因 CAS会导致ABA问题 CAS算法实现一个重要的前提是需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化. 比如说一个线程one从内存位置V ...
- (自学)sklearn决策树基础知识|解决centos7.8 graphviz报错不能画图的问题
sklearn常规流程: from sklearn import tree #导入需要的模块 clf = tree.DecisionTreeClassifier()#实例化 clf = clf.fit ...
- 【C# 基础】— 解决 winForm 引用 Adobe PDF Reader控件不显示pdf 文件 问题
前言 公司的CS 终端需要显示 PDF 文件 ,在换用了"Adobe PDF Reader" 这个控件后,运行程序不报错,窗体控件区显示一片空白,PDF 文件就是不显示,这是怎么回 ...
- 【爱因斯坦谜题】用python基础语法解决爱因斯坦谜题
今天分享一个困难的谜题 据传是爱因斯坦还年轻时所想出来的 本人自学python已经有一段时间,偶然间了解到了爱因斯坦谜题,就想用已经学过的知识来解决这个谜题,下面我就将我的方法分享给大家. 题目: 有 ...
- Mac部分基础故障解决
Mac故障解决 1.office for mac安装好后,打开word编辑输入法拼音乱码 打开word后点击上角的"帮助"→"检查更新"更新完成后输入法拼音显示 ...
- 关于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 ...
最新文章
- sklearn使用FeatureHasher处理字符串特征
- Android性能优化常见问题,附架构师必备技术详解
- 机器学习系列之手把手教你实现一个分类回归树
- 单片机中断程序实例_单片机定时器中断实现长时间定时程序
- linux创建新进程就分配空间,linux几种创建进程的方法
- JAVA出现空指针异常(初学者)
- monodevelp注释显示中文
- liquibase mysql_Liquibase MySQL:语法错误附近'????????????????'
- 字节回应阿里涉侵犯男员工曾面试并通过一面;HarmonyOS 2.0用户数升至5000万|极客头条...
- 蓝桥杯大赛软件赛省赛,C/C++大学B组,改革后2019-2021真题知识点分类
- 十问:BAT技术大牛的核心学习方法
- 【翻译】“PE文件格式”1.9版 完整译文(附注释)
- 滴滴打车2015-2016
- 基于深度学习的单人步态识别系统
- 中国石油大学《红楼梦研究》在线考试
- VIVO、蚂蚁金服跨界握手,融入区块链技术,共同研发新型智能手机
- 怎样规划自己的研究生生活?
- VMware 安装Ubuntu系统后,启动一直黑屏
- Cassandra的使用
- webscarab fuzz testing