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问题基础及解决 的相关文章

随机推荐

  • 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