当前位置: 首页 > news >正文

CAS之AtomicReference原理解析

如果你了解了AtomicInteger的工作原理,或者看了如下文章,知道了AtomicInteger只能对当个int类型共享变量做cas的缺点。

CAS之AtomicInteger原理解析_z275598733的博客-CSDN博客

那么AtomicReference就是来解决这个问题的。原理很类似,只是AtomicReference是对对象做cas操作。从一段AtomicReference类的方法调用代码开始来对源码做分析

public class Test {public static void main(String[] args) {A a1 = new A(0, 0l);A a2 = new A(1, 1l);AtomicReference<A> ar = new AtomicReference<>(a1);ar.getAndSet(a2);System.out.println(ar.get().toString());//打印对象ai的内存结构,需要引入jol-core工具包ClassLayout classLayout = ClassLayout.parseInstance(ar);System.out.println(classLayout.toPrintable());}
}@Getter
@Setter
@AllArgsConstructor
@ToString
class A{private int v1;private double v2;
}

从 new AtomicReference<>(a1)进入先看静态代码块和构造方法,再看 ar.getAndSet(a2) 做了什么。

public class AtomicReference<V> implements java.io.Serializable {...static {try {valueOffset = unsafe.objectFieldOffset(AtomicReference.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}//与AtomicInterger类基本一致,只不过类型由int变成了泛型Vprivate volatile V value;public AtomicReference(V initialValue) {value = initialValue;}//与对象public final boolean compareAndSet(V expect, V update) {//this-当前AtomicReference对象;valueoffest-相对AtomicReference的内存偏移量;expectreturn unsafe.compareAndSwapObject(this, valueOffset, expect, update);}//具体实现,需要进入到Unsafe类中public final V getAndSet(V newValue) {this-当前AtomicReference对象;valueoffest-相对this对象的内存偏移量;newValue-新对象return (V)unsafe.getAndSetObject(this, valueOffset, newValue);}...
}

 进入到Unsafe.getAndSetObject方法中

public final class Unsafe {...public final Object getAndSetObject(Object var1, long var2, Object var4) {Object var5;do {//通过对象中value相对偏移量获取内存中的value对象,这里var5对其他线程是可见的, 如果不可见,那么这个值的获取就可能非内存真实值。与Unsafe.getAndAddInt异曲同工var5 = this.getObjectVolatile(var1, var2);//compareAndSwapObject的过程是原子性的,将重新获取到的内存对象value与var5比较,true则说明对象value并未被修改,可以将原对象改成var4。区别于Unsafe.compareAndSwapInt, 这里比较对象} while(!this.compareAndSwapObject(var1, var2, var5, var4));return var5;}//native方法,暂不深究public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);...
}

 以下是debug的信息

 AtomicReference类对象ar的内存结构

 总而言之,AtomicReference可以保证对象的修改是线程安全的,AtomicReference对比AtomicInteger 可以在共享对象内部维护多个共享变量,但是ABA问题依然没有解决。

相关文章:

CAS之AtomicReference原理解析

如果你了解了AtomicInteger的工作原理&#xff0c;或者看了如下文章&#xff0c;知道了AtomicInteger只能对当个int类型共享变量做cas的缺点。 CAS之AtomicInteger原理解析_z275598733的博客-CSDN博客 那么AtomicReference就是来解决这个问题的。原理很类似&#xff0c;只是A…...

JS/JQ实现字符串加密成 HEX(十六进制) 字符串

应用场景&#xff1a; 1、数据传输&#xff1a;在网络通信或数据存储中&#xff0c;将字符串转换为十六进制格式可以确保数据的可靠传输和存储。十六进制字符串只包含数字和字母&#xff0c;而不涉及控制字符或其他特殊字符&#xff0c;因此避免了特殊字符在传输过程中引起的问…...

骨传导耳机怎么样?盘点五款适合室外佩戴的骨传导耳机

不知道各位出去玩的时候&#xff0c;有没有觉得外面的世界太喧嚣&#xff0c;需要一副耳机开启自己的小天地&#xff0c;相信有很多人都有这种习惯&#xff0c;在路上戴着耳机享受属于自己的那一片天地&#xff0c;可是市面上种类这么多耳机&#xff0c;该如何选择呢&#xff0…...

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图&#xff1a; 弹框信息&#xff1a; Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…...

「从零入门推荐系统」22:chatGPT、大模型在推荐系统中的应用

作者 | gongyouliu 编辑 | gongyouliu 提示&#xff1a;全文2.5万字&#xff0c;预计阅读时长2小时&#xff0c;可以先收藏再慢慢阅读。 我们在上一章介绍了chatGPT、大模型的基本概念、核心技术原理等基础知识&#xff0c;有了这些背景知识的铺垫&#xff0c;下面我们来介绍ch…...

机器学习---概述(一)

文章目录 1.人工智能、机器学习、深度学习2.机器学习的工作流程2.1 获取数据集2.2 数据基本处理2.3 特征工程2.3.1 特征提取2.3.2 特征预处理2.3.3 特征降维 2.4 机器学习2.5 模型评估 3.机器学习的算法分类3.1 监督学习3.1.1 回归问题3.1.2 分类问题 3.2 无监督学习3.3 半监督…...

概念解析 | AutoFed:面向异构数据的联邦多模态自动驾驶的学习框架

AutoFed:面向异构数据的联邦多模态自动驾驶的学习框架 注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:面向异构数据的联邦学习在自动驾驶中的应用。 参考文献:Zheng T, Li A, Chen Z, et al. AutoFed: Heterogeneity-Aware F…...

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…...

stable diffusion webui 安装

安装环境:cuda10.2-cudnn8-devel-ubuntu18.04 torchtorchvision:[pytorch]pytorch官方安装法_torch1.13.1cu117_FL1623863129的博客-CSDN博客 error&#xff1a;RuntimeError: Couldnt determine Stable Diffusions hash: 69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc. 解决方法…...

csdn文章编辑器必备语法备用

前言 本文是为了记录csdn文章编辑器的必备语法&#xff0c;为写作小白提供更详细的写作规范技巧 csdn的质量分查询地址&#xff1a;质量分查询 这里的跳转链接&#xff0c;可以使用ctrlshift L 来输入链接 亦可以使用 链接: link. &#x1f680;&#x1f680;&#x1f680; &a…...

机器学习鲁棒性笔记

鲁棒性&#xff08;Robustness&#xff09;在统计学和数据分析中是一个重要的概念。它指的是某个统计方法或模型对于异常值或偏离数据集正常分布的情况的敏感程度。一个鲁棒性较好的方法能够在存在异常值或数据分布不符合假设的情况下依然给出可靠的结果&#xff0c;而不会被极…...

ubuntu 有 1 个软件包没有被完全安装或卸载

ubuntu 有 1 个软件包没有被完全安装或卸载&#xff0c;安装时出现问题&#xff0c;一直卡在 rti-connext-dds-5.3.1 安装问题上。 下面是我安装 sqlite3 出现的问题&#xff1a; sukaiG7-7500:~/1/111/workspace_ros_car_noetic$ sudo apt-get install sqlite3 正在读取软件…...

【QT调用ST-link-使用QT编写程序-调用ST-LINK_CLI.exe-烧写STM32F4xxx-基础样例】

【QT结合ST-link&#xff0c;使用QT编写程序&#xff0c;调用ST-LINK_CLI.exe,烧写STM32F4xxx-基础样例】 1、前言2、实验环境3、先前了解-自我总结4、实验过程&#xff08;0&#xff09;硬件连接与供电&#xff08;1&#xff09;安装&使用STM32 ST-LINK Utility&#xff0…...

高并发下的Java项目解决方案

高并发下的Java项目解决方案 在当今的互联网时代&#xff0c;高并发是Java项目在设计和开发过程中必须要考虑的重要因素之一。本文将详细介绍如何在Java项目中处理高并发的问题&#xff0c;并提供具体的解决方案。我们将主要讨论四个主要的主题&#xff1a;服务器扩展&#xf…...

华为推出手机系统云翻新服务:什么是云翻新?如何使用?

华为手机系统云翻新是华为推出的一项功能&#xff0c;旨在通过云服务提供系统翻新的服务。它可以帮助用户对手机的系统进行优化和更新&#xff0c;以提高手机的性能和流畅度。具体而言&#xff0c;华为手机系统云翻新功能提供了免费的云空间&#xff0c;用户可以将手机中的系统…...

修改时间和创建时间的设计问题

记录一次 在django框架开发中遇到问题&#xff1a; 想要的逻辑&#xff1a; 当在保存数据时&#xff0c;create_time字段只会在新建数据时被设置为当前时间&#xff0c;并且之后不会再修改&#xff0c;而modify_time字段在每次保存数据时都会被设置为当前时间也可以为空&…...

CentOS 搭建 Harbor 镜像仓库(图文详解)

本文目录 1. 下载 Harbor 安装包2. 解压3. 修改配置文件4. 安装 Harbor5. 修改 docker 配置6. docker 登录方式7. 访问 Harbor Web 界面8. 创建证书9. 生成证书10. 更新配置11. 网页登录 说明&#xff1a;在搭建 Harbor 镜像仓库之前&#xff0c;虚拟机要先安装 docker 和 dock…...

【云原生】k8s组件架构介绍与K8s最新版部署

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 集群组件 1.1 控制平面组件&#xff08;Control Plane Components&#xff09; 1.2 Node 组件 1.3 插件 (Addons) 2 集群架构详细 3 集群搭建[重点] 3.1 mi…...

你真的了解什么是生成式AI吗?

最近正好有这样的机会&#xff0c;让我给一群非技术人士介绍生成式AI&#xff0c;忙忙碌碌了一阵子&#xff0c;结果发现受众还是未能理解什么是生成式AI&#xff0c;到底和之前的AI有什么区别。因此希望此篇能够帮助普通人真正理解生成式AI&#xff0c;有个直观印象。 人工智…...

Linux--高级IO

高级IO 1. 五种IO模型 阻塞IO&#xff1a;在内核将数据准备好之前&#xff0c;系统调用会一直等待。 所有的套接字&#xff0c;默认都是阻塞方式。阻塞IO是最常见的IO模型。 非阻塞IO&#xff1a;如果内核还未将数据准备好&#xff0c;系统调用仍然会直接返回&#xff0c;并…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...