【多线程】原子引用ABA问题

news2024/11/26 19:56:15

目录

        • 一、代码示例
        • 二、执行结果截图
        • 三、说明
        • 四、AtomicStampedReference使用
          • 4.1 代码示例
          • 4.2 截图

一、代码示例

package com.learning.atomic;

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.atomic.AtomicReference;
/**
 * @Author wangyouhui
 * @Description ABA问题
 **/
@Slf4j
public class AtomicReferenceABA {
    static AtomicReference<String> reference = new AtomicReference<>("A");

    public static void main(String[] args) {
        String previous = reference.get();
        otherThreadExecute();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("A->C:{}",reference.compareAndSet(previous, "C"));
    }

    private static void otherThreadExecute() {
        new Thread(()->{
            log.info("A->B:{}", reference.compareAndSet(reference.get(), "B"));
        }).start();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(()->{
            log.info("B->A:{}",reference.compareAndSet(reference.get(), "A"));
        }).start();
    }
}


二、执行结果截图

在这里插入图片描述

三、说明

  • 1.主线程准备将共享变量由A改为C
  • 2.在这期间,线程1将共享变量由A改为B,线程2再将共享变量B改为A
  • 3.对于主线程仅能判断出共享变量的值与最初值A是否相同,不能感知到A改为B又改回A的情况
  • 4.如果希望主线程能感知到其它线程动过该共享变量,则cas失败,所以比较值是不能解决问题的,需要再加一个版本号
  • 5.AtomicStampedReferennce

四、AtomicStampedReference使用

4.1 代码示例
package com.learning.atomic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicStampedReference;

/**
 * @Author wangyouhui
 * @Description AtomicStampedReference解决ABA问题
 **/
@Slf4j
public class AtomicStampedReferenceABA {
    static AtomicStampedReference<String> reference = new AtomicStampedReference("A", 0);

    public static void main(String[] args) {
        // 主线程获取值
        String previous = reference.getReference();
        // 主线程获取版本号
        int stamp = reference.getStamp();
        log.info("主线程获取版本号:{}", stamp);
        otherThreadExecute();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("主线程获取版本号:{}", reference.getStamp());
        log.info("A->C:{}",reference.compareAndSet(previous, "C", stamp, stamp+1));
    }

    private static void otherThreadExecute() {
        new Thread(()->{
            int stamp = reference.getStamp();
            log.info("线程1获取版本号:{}", stamp);
            log.info("A->B:{}", reference.compareAndSet(reference.getReference(), "B", stamp, stamp + 1));
        }).start();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(()->{
            int stamp = reference.getStamp();
            log.info("线程2获取版本号:{}", stamp);
            log.info("B->A:{}",reference.compareAndSet(reference.getReference(), "A", stamp, stamp + 1));
        }).start();
    }
}

4.2 截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年软考-高级信息系统项目管理工程师考试大纲

高级信息系统项目管理工程师考试大纲 2023年软考高级信息系统项目管理工程师考试大纲已于2023年5月出版。您可以在 中国计算机技术职业资格网 上找到更多关于考试的信息 。 信息系统项目管理师是对从事信息系统项目管理工作的专业技术人员基本理论和实践能力的综合考核,该专业…

新手如何挑选一款合适的功率放大器?

ATA系列功率放大器是&#xff08;AB&#xff09;类功放&#xff0c;相比于甲类功率放大器&#xff0c;它小信号输入时效率更高&#xff0c;随着输出功率的增大&#xff0c;效率也增高&#xff0c;它的效率比以及保真度而言&#xff0c;都优于A类和B类功放。 因为具有这些优势&a…

助你更好的理解 Python 字典

助你更好的理解 Python 字典 字典是Python中的常用数据类型之一&#xff0c;可将数据存储在键/值对中&#xff0c;同 Java 中的 Map 相似。 1、什么是字典理解&#xff1f; 字典理解是创建字典的一种优雅简洁的方法。 字典理解优化 使用字典理解优化函数。 示例&#xff…

使用 FFmpeg 开发的那些事

勇敢就是&#xff0c;在你还没开始的时候就知道自己注定会输&#xff0c;但依然义无反顾地去做&#xff0c;并且不管发生什么都坚持到底。一个人很少能赢&#xff0c;但也总会有赢的时候。《杀死一只知更鸟》 欢迎大家加入广州城市社区&#xff1a;https://devpress.csdn.net/g…

java面经

String, StringBuffer, StringBuilder区别 第一点是可变性。String不可变&#xff0c;String Buffer和StringBuider可变。这是因为String被final修饰&#xff0c;每次操作都生成新的对象。StringBuffer和StringBuilder的父类AbstractStringBuilder没有被final修饰。 第二点是…

MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

这里写目录标题 一、非线性方程数值求解1. 单变量非线性方程求解2. 非线性方程组的求解 二、最优化问题求解1. 无约束最优化问题求解2. 有约束最优化问题求解3. 线性规划问题求解 三、常微分方程初值问题的数值求解1. 龙格—库塔法简介2. 龙格—库塔法的实现 一、非线性方程数值…

Day975.如何使用JWT结构化令牌 -OAuth 2.0

如何使用JWT结构化令牌 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何使用JWT结构化令牌的内容。 OAuth 2.0 规范并没有约束访问令牌内容的生成规则&#xff0c;只要符合唯一性、不连续性、不可猜性就够了。这就意味着&#xff0c;可以灵活选择令牌的形式&…

将递归函数转成非递归函数的通用方法

看到过一道非常不错的面试题&#xff1a;不支持递归的程序语言如何实现递归程序&#xff1f; 之所以说这道题好&#xff0c;是因为&#xff1a; 首先&#xff0c;它不是纯粹考概念和死记硬背&#xff0c;求职者在回答问题之前需要进行一定的思考&#xff1b; 其次&#xff0c…

vim粘贴出现多余的#

vim粘贴yaml格式时&#xff0c;出现多余的#&#xff0c;格式错误 解决&#xff1a;设置paste :set paste 然后再粘贴即可

final不可变性

一、什么是不可变性&#xff08;Immutable&#xff09; 如果对象在被创建后&#xff0c;状态就不能被修改&#xff0c;那么它就是不可变的这个对象不能被修改指&#xff1a; 对象指向(引用)不可变字段不可变成员变量不可变 案列演示&#xff1a; person对象&#xff0c;age和…

我的C++学习笔记

声明&#xff1a; 写本篇博客的目的是为了整理自己在找工作时学习的C相关知识点&#xff0c;博客整体内容会分为两种风格&#xff0c;第一章基础部分是以常见C面试问题解答的形式呈现&#xff1b;其余部分是知识点层层递进的方式展现&#xff0c;比较系统。其中&#xff0c;在第…

Avalon 学习系列(三)—— 数据和指令同步

Avalon 有很多个指令&#xff0c;通过这些指令可以对 DOM 进行一些事件操作、或者样式修改。 ms-duplex Avalon 实现数据与视图的同步的方式是用 ms-duplex 将元素跟数据绑定在一起&#xff0c;如果有其中一个的值改变另一个值也将改变。 ms-duplex 是 avalon 的双向绑定属性…

OpenCV(C++)创建图片绘制图形(矩形、圆、文字、线段等等)

一、OpenCV介绍 OpenCV 是基于开源许可证的跨平台计算机视觉库,提供了一组丰富、广泛的图像处理和计算机视觉算法。OpenCV 支持多种编程语言,包括 C++、Python、Java 等,可以运行在 Linux、Windows、Mac OS 等平台上。 OpenCV 能够在图像上绘制各种几何形状、文本和曲线,…

学习ESP32笔记

学习ESP32笔记 1.platform IO插件的下载&#xff08;提前安装好python&#xff0c;不然在中间的一部分会一直报错&#xff09; VS Code下载platform IO时&#xff0c;开加速器&#xff08;VPN&#xff09;&#xff0c;并且关闭防火墙 这一步比较慢&#xff0c;大概等十来分钟…

Kendo UI for jQuery---02.开始---01.使用 Kendo UI for jQuery 的第一步

使用 Kendo UI for jQuery 的第一步 欢迎来到 Kendo UI for jQuery 入门的第一步指南&#xff01; 本指南演示如何通过添加所需资源和初始化 Kendo UI 网格来开始使用套件。 该过程借鉴了以下里程碑&#xff1a; 1.下载控件 2.添加所需的 JavaScript 和 CSS 文件 3.将网格绑…

如何使用postman做接口测试

常用的接口测试工具主要有以下几种&#xff1a; Postman: 简单方便的接口调试工具&#xff0c;便于分享和协作。具有接口调试&#xff0c;接口集管理&#xff0c;环境配置&#xff0c;参数化&#xff0c;断言&#xff0c;批量执行&#xff0c;录制接口&#xff0c;Mock Server…

【每日挠头算法题(6)】二叉树的所有路径|神奇字符串

欢迎~ 一、二叉树的所有路径思路&#xff1a;深度优先搜索具体代码如下&#xff1a; 二、神奇字符串思路&#xff1a;模拟双指针具体代码如下&#xff1a; 总结 一、二叉树的所有路径 点我直达~ 思路&#xff1a;深度优先搜索 使用深度优先搜索&#xff1a;即二叉树的前序遍历…

设计模式(十二):结构型之享元模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

编码生成矩阵与检错监督矩阵

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 线性分组码基本概念…

Elasticsearch快速入门及使用

Elasticsearch快速入门及使用 一.Elasticsearch是什么二.基本概念1.index (索引)2. type (类型)3.Document (文档) 三.为什么Elasticsearch可以从海量数据里快速检索出数据四.Elasticsearch安装1.解压2.运行3.显示以下内容就是启动成功14.Kibana可视化软件安装 五.入门(基本的操…