ABA问题基础及解决

2023-11-13

一.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认为和自己的值相同,则又进行了操作。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAI0hhc2hNYXAj,size_20,color_FFFFFF,t_70,g_se,x_16

 二.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)); // true
        System.out.println(atomicReference.get()); // User(userName=lin, age=20)
    }
}
class User{
    String userName;
    int age;
}

 三.AtomicStampedReference版本号原子引用

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAI0hhc2hNYXAj,size_20,color_FFFFFF,t_70,g_se,x_16

 线程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(() -> {
            //获得版本号为1
            int 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问题 每次修改版本号加1
            atomicStampedReference.compareAndSet(100, 101, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 );//版本号为2
            atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 );//版本号为3
        }).start();

        new Thread(() -> {
            //获得版本号为1
            int stamp = atomicStampedReference.getStamp();
            System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp);
            //睡眠3s是为了让上面的线程先执行完 产生ABA
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            由于上面的线程版本号为3 这个线程版本号为2 所以返回false
            boolean b = atomicStampedReference.compareAndSet(100, 2020, stamp, stamp + 1);
            System.out.println(b); // false
            System.out.println(atomicStampedReference.getReference()); // 100
        }).start();
    }

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ABA问题基础及解决 的相关文章

  • 如何以编程方式找出我的 PermGen 空间使用情况?

    我正在尝试诊断java lang OutOfMemoryError PermGen Space在 Sun 的 Hotspot JVM 上运行时出现错误 并且想知道我的程序在不同时刻使用了多少 PermGen 空间 有没有办法以编程方式找出这
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 代码编译期间遇到警告消息“使用或覆盖已弃用的 API”

    我编译了我的程序并收到以下错误 我该如何解决呢 Note ClientThreadClients java uses or overrides a deprecated API Note Recompile with Xlint depre
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • 为什么一个线程会中断另一个线程[重复]

    这个问题在这里已经有答案了 在Java多线程应用程序中 我们处理InterruptedThreadException 如果另一个线程中断当前线程 则会抛出此异常 现在 当另一个线程知道它将导致异常时 它可能想要中断当前线程的原因是什么 很多
  • 带有面板的 Java Swing JToolbar:外观和感觉

    我有一个JToolbar其中包含多个JPanels 需要 因为我希望每个都有特定的边界 不幸的是 外观管理器无法识别JPanels属于工具栏和JButtons因此 渲染器与普通按钮一样 即没有工具栏上的特殊鼠标悬停效果 更换JPanels
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • Kerberos 缓存票证

    我使用的是 Windows 7 64 位 我创建了一个简单的应用程序来对实现 PrivilegedAction 的类的 run 方法中的文件进行计数 以下是我的 jaas conf 文件 CountFiles com sun securit
  • 尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.nodes.Element.ownText()”

    我正在使用下面的代码来获取版本名称 from 应用商店通过使用 jsoup 我正在获取详细信息 但它引发了一些异常 我的代码是 public class ForceUpdateAsync extends AsyncTask
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • 如何列出所有可用的 LookAndFeel 主题?

    如何列出所有可用的 LookAndFeel 主题 我想在 JComboBox 中显示以供用户选择 这真的很简单 public static UIManager LookAndFeelInfo getInstalledLookAndFeels
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 在方法内声明类 - Final 关键字 [重复]

    这个问题在这里已经有答案了 给定方法中的以下内部类 IsSomething public class InnerMethod private int x public class Something private int y public
  • JPA - 非主键字段上的 @OneToOne 关系不起作用

    我有一个 Spring Data JPA 后端 使用 Hibernate 作为 ORM 实现 这是模型 Person MailConfig id PK uid PK FK Person uid uid Entity
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri
  • java中的回调是什么[重复]

    这个问题在这里已经有答案了 可能的重复 什么是回调函数 https stackoverflow com questions 824234 what is a callback function 我已经阅读了回调的维基百科定义 但我仍然没有明

随机推荐

  • Qt

    Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 目录 Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 1 简
  • 想入门网络安全?先来看看网络安全行业人才需求!

    如果你是一个想要入门网络安全行业的小白 如果你是网络安全专业在读的大学生 如果你是正在找工作的新手 那么这篇文章你一定要仔细看 毕竟知己知彼百战百胜 知道行业的人才需求才能更好得发挥自己的优势 当你打开BOSS直聘 拉钩等招聘网站 在首页的
  • 快手分享链接,实战解析无水印视频源码

    这个是我发现的源码解析 快手 package blog rs1314 cn test import java io IOException import java io InputStream import java net URLDeco
  • Numpy在三维矩阵的max()、argmax()上的操作

    1 Numpy中对于3维数组的表达形式不同于RGB图片在通道上的堆叠形式 0 设一个矩阵尺寸为 h w c 1 Numpy 会将该矩阵的后两维看成一个二维矩阵 h则代表w c大小的矩阵的个数 整体矩阵是w c矩阵在h维度上的堆叠 2 图像上
  • 日常笔记day2

    Python在3 5版本中引入了关于协程的语法糖async和await 普通的函数通过类型判断可以验证函数的类型 直接调用异步函数不会返回结果 而是返回一个coroutine对象 协程需要通过其他方式来驱动 因此可以使用这个协程对象的sen
  • LVM精简卷(Thinly-Provisioned Logical Volumes)

    可能LVM大家都比较熟悉 那么精简卷又是干什么的呢 相比于普通LVM有什么优势 又会带来哪些新的问题 带着这些我们来一探究竟 工作原理 在创建Thin 瘦 卷时 预分配一个虚拟的逻辑卷容量大小 而只是在实际写入数据时才分配物理空间给这个卷
  • 开源超级终端工具——WindTerm

    1 下载和安装 我的是win10 其他版本各位自选 Releases kingToolbox WindTerm GitHub 安装的话 相信大家不用我赘述了 初始界面是这样的 2 WindTerm使用 2 1 本地会话 最下面那个框 发送
  • html5 blob video 下载

    最近在看腾讯视频时 想把它下载下来 发现 video src 是 blob 加密的源 不能像以前那样看到一个mp4的 url
  • 【mysql将一个表的数据添加到另一个表中】

    mysql将一个表的数据添加到另一个表中 1 两个表的结构一致 将表B数据添加到A中 INSERT INTO A SELECT FROM B 插入时若存在主键冲突 使用以下sql删掉重复数据 DELETE b FROM A a B b WH
  • 计算机网络——数据链路层

    数据链路层 交换机 switch 的基本原理 theory 与配置 config 交换机 工作在数据链路层 用于组织局域网 常见的品牌有H3C 华为 思科 锐捷 tp link 以太网 Ethernet 即局域网 MAC地址 网卡里会带有的
  • 如果只能选3个伦敦金投资技巧,我会选这3个

    伦敦金投资是很考验投资者技术的一个投资项目 如果说股票投资大部分都看基本面 技术面值作为判断的话 那么伦敦金投资责刚刚相反 他很注重技术面方面的分析 所以 在伦敦金市场中 我们会看到市面上有很多有关于投资方面的教学 不过 在众多教学当中 如
  • 常见特征工程操作

    常见的特征工程包括 异常处理 1 通过箱线图 或 3 Sigma 分析删除异常值 2 BOX COX 转换 处理有偏分布 3 长尾截断 特征归一化 标准化 1 标准化 转换为标准正态分布 2 归一化 抓换到 0 1 区间 3 针对幂律分布
  • 2023年十大最佳自动化测试工具(建议收藏)

    Best Automation Testing Tools for 2023 对更快交付高质量软件 或 快速质量 的需求要求组织以敏捷 持续集成 CI 和DevOps方法论来寻找解决方案 测试自动化是这些方面的重要组成部分 最新的 2018
  • 【满分】【华为OD机试真题2023 JS】相同数字的积木游戏1

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 相同数字的积木游戏1 知识点数组循环map 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小华和小薇一起通过玩积木游戏学习数学 他们有很多积木 每个积木块上都有
  • 查找Chrome浏览器header中的user-Agent两种方法

    user Agent是浏览器搜索信息 可以用它来模拟浏览器进行浏览 从而进行爬取网页信息 爬虫 第一种方法 首先 F12或右键 检查网页元素 之后 NetWork index header user Agent 第二种方法 在浏览器直接搜索
  • 1.软件设计模式概述

    软件设计模式的产生背景 设计模式 这个术语最初并不是出现在软件设计中 而是被用于建筑领域的设计中 1977 年 美国著名建筑大师 加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫 亚历山大 Christopher Alexander 在他
  • css如何实现进度条??

    css 如何实现进度条 在生活中 我们不经意间就会看到很多的 手机app上都会有带进度条 精简的软件会给我们视觉上的享受 那进度条是如何实现的呢 首先 创建一个大小自定义的div模块为外层 其下再创建布局两个div左右布局 在这两个div下
  • 模拟信号和数字信号

    模拟 幅值随时间连续变化 如温度 位移 湿度等等 数字 幅值随时间都离散的信号 离散和连续相对 如下图发生突变就是离散 计算机中是二值逻辑信号 特点 模拟 保密性差 易收干扰 无转换误差 脉冲信号 二值信号就是脉冲信号 如方波pwm trr
  • JAVA 简单的getJSONObject、getJSONArray用法

    msg success code 0 page getJSONObject page totalCount 108 pageSize 10 totalPage 11 currPage 1 list getJSONArray list get
  • ABA问题基础及解决

    一 ABA问题的产生 二 AtomicReference原子引用 三 AtomicStampedReference版本号原子引用 四 ABA问题解决 前面的内容之间的关联 CAS gt Unsafe类 gt CAS思想 gt ABA问题 g