CAS - 从AtomicInteger窥探CAS
Unsafe类是CAS的核心,由于Java方法无法直接访问底层,需要通过本地方法(native)来实现,Unsafe类相当于一个桥梁。基于Unsafe类,可以直接操作特定的内存数据。
我们从上一篇说CAS基本原理的时候,有说到一个“资源”被100个线程每个线程累加100次,最终得到10000,该“资源”我们使用AtomicInteger来模拟的。这篇我们就从AtomicInteger更加深入探究CAS。
AtomicInteger的getAndIncrement()方法
/*** Atomically increments by one the current value.** @return the previous value*/public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}
AtomicInteger的getAndIncrement()方法调用的是Unsafe类中的getAndAddInt()方法,其中的参数valueOffset是通过Unsafe实例的获取到当前AtomicInteger这个对象的value属性的内存偏移地址。
Unsafe的getAndAddInt()方法
public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}
参数var1就是当前需要Unsafe类操作的对象,在当前案例中就是AtomicInteger的一个实例。var2则是当前AtomicInteger实例(也就是var1)的value这个属性的变量的内存地址偏移量。var4就是案例中需要累加的值(案例中是1)。
接下来是一个 do{ } while()循环,首先通过Unsafe类的getIntVolatile()方法(native方法)拿到当前操作的AtomicInteger的实例中的value属性的值,在使用Unsafe类的compareAndSwapInt()方法(native方法),将当前操作的AtomicInteger的实例中的value属性的原值和新值进行CAS。如果没有交换成功就一直重复上面的动作,如果交换成功就跳出当前循环。
AtomicInteger的get()方法
/*** Gets the current value.** @return the current value*/public final int get() {return value;}
等100个线程,每个都完成100次累加后(案例中使用到了CountDownLatch保证100个线程都操作完成)在调用AtomicInteger的get()方法。我们发现AtomicInteger的get()方法获取的就是value这个值,value属性是由volatile修饰的(在多线程环境下保证其可见性)。
最终我们发现AtomicInteger实现多线程并发保证线程安全,是通CAS(compare and swap)+volatile来实现的,从而避免synchronized的高开销,提高执行效率。
相关文章:
CAS - 从AtomicInteger窥探CAS
Unsafe类是CAS的核心,由于Java方法无法直接访问底层,需要通过本地方法(native)来实现,Unsafe类相当于一个桥梁。基于Unsafe类,可以直接操作特定的内存数据。 我们从上一篇说CAS基本原理的时候,有说到一个“资源”被100…...
micro-ros IMU ML 代码
示例代码: #include <micro_ros_arduino.h>#include "LSM6DSOXSensor.h" #include "lsm6dsox_activity_recognition_for_mobile.h"#include <stdio.h> #include <rcl/rcl.h> #include <rcl/error_handling.h> #inclu…...
二十三种设计模式第二十四篇--访问者模式(完结撒花)
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式,元素对象已接…...
月报总结|Moonbeam 7月份大事一览
炎炎夏日,Moonbeam于越南举办了线下交流会,在EthCC 2023和以太坊社区成员共同讨论多链应用,在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束,选出了每个赛道最杰出的项目&#…...
【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录
安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …...
【2023】字节跳动 10 日心动计划——第四关
目录 1. 买卖股票的最佳时机2. 打家劫舍 II 1. 买卖股票的最佳时机 🔗 原题链接:121. 买卖股票的最佳时机 假设在第 i i i 天卖出股票可获得最大利润,那么买入股票必然是在前 i − 1 i-1 i−1 天中的某一天。更进一步,买入股票应…...
数据库与数据仓库的区别及关系
数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…...
Emacs之设置行号前景颜色(字体颜色)/背景颜色/光标颜色/背景透明度(一百二十七)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
【hive经典指标,离线数仓指标,ADS层指标分析】最近7日内连续3日下单用户数
1.建表语句 DROP TABLE IF EXISTS ads_order_continuously_user_count; CREATE EXTERNAL TABLE ads_order_continuously_user_count (dt STRING COMMENT 统计日期,recent_days BIGINT COMMENT 最近天数,7:最近7天,order_continu…...
线上java程序CPU及内存占用过高问题排查总结
背景 最近发现线上的一个JAVA程序总是过段时间慢慢卡死,最后导致无法提供服务,外部请求接口超时。 经排查发现,该程序CPU及内存占用都很高,导致整个系统负载很高。 到这里,就想到了对程序内存进行分析。排查过程 查询…...
c高级:day3
作业: 1. 整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash ######################################################################## # File Name: zy1.sh # Created Time: 2023年08月04日 星期五 19时13分08秒 ##############################…...
Java检查值是否存在于数组中的3种方法
在 Java 中,有许多方法可以检查此数组中是否存在特定元素。 1)使用线性搜索方法 时间复杂度:O(N) 辅助空间:O(1) for (int element : arr) { if (element toCheckValue) { return true; } } 示例代码: import java.ut…...
python 连接oracle pandas以简化excel的编写和数据操作
python代码 Author: liukai 2810248865qq.com Date: 2022-08-18 04:28:52 LastEditors: liukai 2810248865qq.com LastEditTime: 2023-07-06 22:12:56 FilePath: \PythonProject02\pandas以简化excel的编写和数据操作.py Description: 这是默认设置,请设置customMade, 打开koro…...
Kubernetes高可用集群二进制部署(三)部署api-server
Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署…...
【网络|TCP】三次握手、四次握手
TCP是一种面向连接的可靠的传输协议,建立和断开TCP连接时需要进行握手的过程。其中,TCP的连接建立需要进行三次握手,而连接断开则需要进行四次握手。 解释 三次握手 第一次握手:客户端发送一个SYN(同步)报…...
刷题笔记 day7
力扣 209 长度最小的子数组 解法:滑动指针(对同向双指针区间内的数据处理) 1)先初始化 两个指针 left ,right。 2)右移指针right的同时使用sum记录指针right处的值,并判断sum的值是否满足要求&…...
Tuxera NTFS2023Mac强大的Mac读写工具
Mac用户在使用NTFS格式移动硬盘时,会遇到无法写入硬盘的情况。要想解决无法写入的问题,很多人选择使用Mac读写软件。面对市面上“众多”的读写硬盘软件,用户应该怎么选择呢?初次接触移动硬盘的伙伴可能不知道移动硬盘怎么和电脑连…...
ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习
文章目录 ARM 汇编宏介绍ARM 汇编宏的使用 下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL ARM 汇编宏介绍 在 ARM 汇编中,“.macro” 是用来定义一个宏的指…...
数据库的分库分表
#!/bin/bash ######################### #File name:db_fen.sh #Version:v1.0 #Email:admintest.com #Created time:2023-07-29 09:18:52 #Description: ########################## MySQL连接信息 db_user"root" db_password"RedHat123" db_cmd"-u${…...
[Docker实现测试部署CI/CD----相关服务器的安装配置(2)]
目录 6、Jenkins安装配置安装jdk安装maven拉取镜像启动jenkins修改数据卷权限浏览器访问安装插件配置jenkins移动JDK和Maven配置JDK和Maven 6、Jenkins安装配置 Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作&…...
formsy-react跨字段验证:实现复杂业务逻辑的终极方法
formsy-react跨字段验证:实现复杂业务逻辑的终极方法 【免费下载链接】formsy-react A form input builder and validator for React JS 项目地址: https://gitcode.com/gh_mirrors/fo/formsy-react 想要在React应用中构建复杂的表单验证逻辑吗?f…...
OpenClaw排错指南:Kimi-VL-A3B-Thinking接口调用常见问题解决
OpenClaw排错指南:Kimi-VL-A3B-Thinking接口调用常见问题解决 1. 为什么需要这份排错指南? 上周我在本地部署OpenClaw对接Kimi-VL-A3B-Thinking多模态模型时,遇到了连续三个通宵都没解决的接口调用问题。从模型响应超时到多模态数据处理异常…...
分享一个网络智能运维系统
项目简介 网络智能运维系统是一款面向网络设备的一体化智能运维管理平台,旨在帮助企业 IT 运维团队高效、自动化地完成网络设备的日常巡检、配置备份、批量操作及定时任务调度等核心工作。系统支持多品牌设备(华为、H3C、思科、锐捷、Juniper、MikroTik …...
【数据库系统】数据库系统概论——第十二章 数据库管理系统
第十二章 数据库管理系统 文章目录 第十二章 数据库管理系统 12.1数据库管理系统的基本功能 12.2数据库管理系统的系统结构 12.2.1数据库管理系统的层次结构 12.2.2关系数据库管理系统的运行过程示例 12.3语言处理层 12.3.1语言处理层的任务和工作步骤 12.3.2解释方法 12.3.3预…...
先进封装中如何判定凸点结合力大小?
在先进封装中,凸点(Bump)的结合力是决定芯片可靠性的核心指标。如果结合力不足,芯片在后续的倒装焊、底部填充或长期热循环中会出现分层或断路。判定凸点结合力大小,通常采用凸点剪切测试。简单来说,它的原…...
性价比高的水泥压力板哪家技术强
在建筑材料市场中,水泥压力板凭借其诸多优势,如防火、防潮、隔音等,成为众多建筑项目的理想选择。对于追求性价比的客户来说,选择一家技术实力强的水泥压力板品牌至关重要。兴达成就是这样一家在市场上具有较高声誉的品牌…...
仅限首批200名开发者获取:Java 25虚拟线程高并发架构迁移评估工具包(含代码扫描器+风险热力图+ROI预测模型)
第一章:Java 25虚拟线程高并发架构迁移全景认知Java 25正式将虚拟线程(Virtual Threads)从预览特性转为标准特性,标志着JVM并发模型进入轻量级、高密度、低开销的新纪元。虚拟线程基于Project Loom多年演进,以java.lan…...
Raspberry Pi Imager 终极指南:如何轻松创建树莓派启动盘
Raspberry Pi Imager 终极指南:如何轻松创建树莓派启动盘 【免费下载链接】rpi-imager The home of Raspberry Pi Imager, a user-friendly tool for creating bootable media for Raspberry Pi devices. 项目地址: https://gitcode.com/gh_mirrors/rp/rpi-imager…...
从误报率47%到99.2%精准识别,PHP静态分析AI模型调优全过程,仅限内部团队流出
第一章:PHP AI 代码检测PHP AI 代码检测是指利用人工智能技术(如静态分析模型、预训练代码语言模型、规则引擎与模式识别结合)对 PHP 源码进行自动化缺陷识别、安全漏洞预警、代码风格合规性评估及潜在逻辑风险预测的过程。随着 PHP 生态中 C…...
把 Flask 搬进 ESP,高中生自研嵌入式 Web 框架 MicroFlask !唤
如果有多个供应商,你也可以使用 [[CC-Switch]] 来可视化管理这些API key,以及claude code 的skills。 # 多平台安装指令 curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/i…...
