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

CAS原理解析

CAS是一种乐观锁机制,一种比较并交换的过程和理念,用来解决线程安全问题,具体来讲就是对共享变量值的安全更新机制。能够保证原子、可见、一致性。这种交换过程是在Unsafe类中实现。

从一段简单的代码开始来对源码做分析

    public static void main(String[] args) {AtomicInteger ai = new AtomicInteger(0);ai.getAndAdd(1);System.out.println(ai.get());//打印对象ai的内存结构,需要引入jol-core工具包ClassLayout classLayout = ClassLayout.parseInstance(ai);System.out.println(classLayout.toPrintable());}

从 new AtomicInteger(0) 进入先看构造方法和静态代码块,再看ai.getAndAdd(1)做了什么。

public class AtomicInteger extends Number implements java.io.Serializable {...private static final long valueOffset;static {try {//获取初始值value的内存偏移量,这个偏移量指的是变量相对于对象地址的偏移,通过此偏移可以获取变量在内存中的值,后面还会介绍valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}//初始化的时候给value赋值public AtomicInteger(int initialValue) {value = initialValue;}//比较并交换的具体实现,需要进入到Unsafe类中public final int getAndAdd(int delta) {//this-当前atomicInter对象;valueoffest-内存偏移量;delta需要增加的值return unsafe.getAndAddInt(this, valueOffset, delta);}
}

 进入到Unsafe.getAndAddInt方法中

 public final class Unsafe {...public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {//通过AtomicInteger对象和其变量value的偏移量获取内存中的value值,这里var5对其他线程                            是可见的, 如果不可见,那么这个值的获取就可能非内存真实值。如果var5 = this.getIntVolatile(var1, var2);//compareAndSwapInt的过程是原子性的,将重新获取到的内存value值与var5比较,true则说明value的内存值并未被修改,可以将原值var5 + 增值var4。} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}
}  

通过断点看具体的值

 再来看偏移量是什么,下面是AtomicInteger类型对象ai的内存结构

java.util.concurrent.atomic.AtomicInteger object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           bd 3d 00 f8 (10111101 00111101 00000000 11111000) (-134201923)12     4    int AtomicInteger.value                       1
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

请看标红的位置,由于对象的分配是在一个地址段内,对象中变量就是基于对象初始地址作了偏移,这里是对象中value变量相对对象初始地址的位置,其值最终为1。

个人理解,有不对之处,望请指正,谢谢。

相关文章:

CAS原理解析

CAS是一种乐观锁机制,一种比较并交换的过程和理念,用来解决线程安全问题,具体来讲就是对共享变量值的安全更新机制。能够保证原子、可见、一致性。这种交换过程是在Unsafe类中实现。 从一段简单的代码开始来对源码做分析 public static void…...

SQL项目实战:银行客户分析

大家好,本文将与大家分享一个SQL项目,即根据从数据集收集到的信息分析银行客户流失的可能性。这些洞察来自个人信息,如年龄、性别、收入和人口统计信息、银行卡类型、产品、客户信用评分以及客户在银行的服务时间长短等。对于银行而言&#x…...

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—实战篇)

探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群指令分析—下篇) Cluster XX的集群指令(扩展)写入记录主节点和备节点切换-CLUSTER FAILOVER新加入master节点新加入slave节点为slave节点重新分配master分配哈希槽删除…...

ubuntu

安装 sudo apt-get update sudo apt-get install mysql-server mysql-client 设置root密码 cat /etc/mysql/debian.cnf 查看默认密码 mysql -u debian-sys-maint -p 连接输入密码 use mysql; select user,plugin from user; update user set pluginmysql_native_passwor…...

【芯片设计- RTL 数字逻辑设计入门 3- Verdi 常用使用命令】

文章目录 Verdi 全局显示Verdi 前导 0 的显示Verdi 数据笔数统计Verdi 波形数据dump Verdi 全局显示 bsubi -n 16 -J sam visualizer -tracedir ./veloce.wave/debug_waveform.stw 打开波形后,如果想要看到所有信号的数据,可以点击下图中红框中的按钮&a…...

python-pytorch基础之cifar10数据集使用图片分类

这里写目录标题 总体思路获取数据集下载cifar10数据解压包文件介绍加载图片数字化信息查看数据信息数据读取自定义dataset使用loader加载建模训练测试建测试数据的loader测试准确性测试一张图片读取一张图片加载模型预测图片类型创建一个预测函数随便来张马的图片结果其他打开一…...

华纳云:linux下磁盘管理与挂载硬盘方法是什么

在Linux下进行磁盘管理和挂载硬盘的方法如下: 磁盘管理: a. 查看已连接的磁盘:可以使用命令 fdisk -l 或 lsblk 查看系统中已连接的磁盘信息,包括硬盘和分区。 b. 创建分区:如果磁盘是全新的,需要使用 f…...

ChatGPT + Stable Diffusion + 百度AI + MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一)

ChatGPT Stable Diffusion 百度AI MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一) 前言 最近大模型频出,但是对于我们普通人来说,如何使用这些AI工具来辅助我们的工作呢,或者参与进入我们的生活…...

linux strcpy/strncpy/sprintf内存溢出问题

本文主要介绍strcpy/strncpy/sprintf都是不安全的&#xff0c;可能存在内存溢出的问题。下来进行实例分析。 strcpy代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h>void test_func(char *str) {b…...

Jmeter如何添加插件

一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件&#xff1f; 2023最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 二、插件管理器 ​ 首先我们需要下载插件管理器j…...

flask---CBV使用和源码分析

1 cbv写法 -1 写个类&#xff0c;继承MethodView-2 在类中写跟请求方式同名的方法-3 注册路由&#xff1a;app.add_url_rule(/home, view_funcHome.as_view(home))#home是endpoint&#xff0c;就是路由别名#例子 class add(MethodView):def get(self):return holleapp.add_url…...

Qt 实现压缩文件、文件夹和解压缩操作zip

一、实现方式 通过Qt自带的库来实现&#xff0c;使用多线程方式&#xff0c;通过信号和槽来触发压缩与解压缩&#xff0c;并将压缩和解压缩结果回传过来。 使用的类&#xff1a; #include "QtGui/private/qzipreader_p.h" #include "QtGui/private/qzipwriter…...

简单工厂模式VS策略模式

简单工厂模式VS策略模式 今天复习设计模式&#xff0c;由于简单工厂模式和策略模式太像了&#xff0c;重新整理梳理一下 简单工厂模式MUL图&#xff1a; 策略模式UML图&#xff1a; 1、简单工厂模式中只管创建实例&#xff0c;具体怎么使用工厂实例由调用方决定&#xff0c…...

【MySQL】触发器 (十二)

🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…...

听说 Spring Bean 的创建还有一条捷径?

文章目录 1. resolveBeforeInstantiation1.1 applyBeanPostProcessorsBeforeInstantiation1.2 applyBeanPostProcessorsAfterInitialization1.3 案例 2. 源码实践2.1 切面 Bean2.2 普通 Bean 在 Spring Bean 的创建方法中&#xff0c;有如下一段代码&#xff1a; AbstractAutow…...

大数据课程E6——Flume的Processor

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Processor的概念和配置参数; ⚪ 掌握Processor的使用方法; ⚪ 掌握Processor的Default Processo; ⚪ 掌握Processor的Load Balance Processo; 一、Failover Sink Processor 1. …...

实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览

要进行Office365邮箱的授权对接&#xff0c;你需要先申请一个应用&#xff0c;并获取授权访问令牌。 以下是一个简单的步骤&#xff1a; 登录 Azure 门户&#xff1a;https://portal.azure.com/创建一个新的应用程序&#xff0c;或者使用现有的应用程序。要创建新的应用程序&…...

(AcWing)多重背包问题 I,II

有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使物品体积总和不超过背包容量&#xff0c;且价值总和最大。 输出最大价值。 输入格式 第一行两个整数 N&#xff0c;…...

如何把几个视频合并在一起?视频合并方法分享

当我们需要制作一个比较长的视频时&#xff0c;将多个视频进行合并可以使得整个过程更加高效。此外&#xff0c;合并视频还可以避免出现“剪辑断层”的情况&#xff0c;使得视频内容更加连贯&#xff0c;更加容易被观众理解和接受。再有&#xff0c;合并视频还可以减少视频文件…...

【MyBatis】初学MyBatis

目录 MyBatis 是什么&#xff1f;MyBatis框架搭建1.添加MyBatis框架2.设置MyBatis配置数据库的相关链接信息xml 保存路径和命名格式 根据MyBatis写法完成数据库的操作MyBatis插件MyBatis传递参数查询${} 和 #{} 有什么区别&#xff1f;SQL注入问题 MyBatis like查询MyBatis多表…...

DdddOcr:5分钟掌握Python验证码识别,彻底告别手动输入![特殊字符]

DdddOcr&#xff1a;5分钟掌握Python验证码识别&#xff0c;彻底告别手动输入&#xff01;&#x1f680; 【免费下载链接】ddddocr 带带弟弟 通用验证码识别OCR pypi版 项目地址: https://gitcode.com/gh_mirrors/dd/ddddocr 还在为繁琐的验证码输入而烦恼吗&#xff1f…...

终极视频修复神器UNTRUNC:如何免费恢复损坏的MP4/MOV文件

终极视频修复神器UNTRUNC&#xff1a;如何免费恢复损坏的MP4/MOV文件 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 你是否…...

从零到一:WPR机器人仿真平台实战指南,快速掌握ROS机器人开发精髓

从零到一&#xff1a;WPR机器人仿真平台实战指南&#xff0c;快速掌握ROS机器人开发精髓 【免费下载链接】wpr_simulation 项目地址: https://gitcode.com/gh_mirrors/wp/wpr_simulation 你是否对机器人开发充满热情&#xff0c;却被高昂的硬件成本和复杂的调试过程吓退…...

2026年第六届FIC全国网络空间取证大赛-初赛详细版Writeup(服务器+互联网+二进制)

2026年第六届FIC全国网络空间取证大赛-初赛详细版Writeup&#xff08;服务器互联网二进制&#xff09; 前言&#xff1a;服务器&#xff1a;1. 该服务器主机操作系统版本为2. 该服务器根分区硬盘的uuid号为3. 该服务器中最新的docker镜像创建时间为4. 该服务器根分区快照路径为…...

用C语言搞定PTA数据结构7-1天梯地图:迪杰斯特拉算法实战与避坑指南

从零实现PTA天梯地图&#xff1a;双权重迪杰斯特拉算法全解析 当面对PTA数据结构7-1天梯地图这类双权重图的最短路径问题时&#xff0c;许多初学者会陷入算法选择的困境。本文将彻底拆解如何用C语言实现这一经典题目&#xff0c;不仅教你写出能AC的代码&#xff0c;更重要的是掌…...

Python报错Resource averaged_perceptron_tagger_eng not found

用python标注英文单词词形时&#xff0c;报错&#xff1a; import nltk nltk.download(‘averaged_perceptron_tagger_eng’) Resource averaged_perceptron_tagger_eng not found. 估计是因为网络问题&#xff0c;遂改用离线安装的方式。 第一步&#xff1a;下载averaged_perc…...

UVM寄存器模型简化实践:提升芯片验证效率的封装与自动化方案

1. 项目概述&#xff1a;为什么我们需要简化UVM寄存器模型&#xff1f;如果你在芯片验证领域摸爬滚打过几年&#xff0c;尤其是深度参与过SoC或复杂IP的验证&#xff0c;那么对UVM寄存器模型&#xff08;UVM Register Model&#xff09;一定是又爱又恨。爱的是&#xff0c;它提…...

实时娱乐资讯获取慢?Perplexity新闻查询延迟优化全解析,3步压降至800ms内

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;实时娱乐资讯获取慢&#xff1f;Perplexity新闻查询延迟优化全解析&#xff0c;3步压降至800ms内 在高并发娱乐资讯场景下&#xff0c;Perplexity API 默认配置常导致端到端响应延迟突破1.5秒&#xff0c;严…...

别再手动整理文献了!用Python+Semantic Scholar API,5分钟搞定论文参考文献批量导出

科研效率革命&#xff1a;用PythonSemantic Scholar批量导出参考文献的完整方案 深夜的实验室里&#xff0c;咖啡杯已经见底&#xff0c;而你的文献综述才完成不到三分之一。面对散落在各处的参考文献格式&#xff0c;手动整理的时间远超阅读时间——这是大多数科研工作者的真…...

别让中文路径坑了你!FaceFusion在Windows和Mac上的完整环境配置与文件规范指南

别让中文路径坑了你&#xff01;FaceFusion在Windows和Mac上的完整环境配置与文件规范指南 在数字创意领域&#xff0c;FaceFusion作为一款强大的AI换脸工具&#xff0c;正受到越来越多内容创作者的青睐。然而&#xff0c;许多用户在初次接触时往往会被一系列看似莫名其妙的错误…...