初识 CAS理论

1、CAS 通过硬件保证比较-更新的原子性,不涉及用户态内核态的切换。

2、CAS 是 CPU 的原子指令(cmpxchg指令),不会造成数据的不一致问题。Unsafe提供的 CAS 方法底层实现的是 CPU 指令cmpxchg。

3、执行cmpxchg指令,会判断 当前系统是否为多核系统,如果是给总线加锁,只有一个线程给总线加锁成功,加锁成功后执行 CAS,也就是说 CAS 原子性实际上是 CPU 实现独占的,比起synchronized重量级锁,这里排他时间要短很多,多线程情况下,性能要好很多。

4、Java 中的 CAS 操作依赖于Unsafe方法,Unsafe类中所有的方法都是native修饰的,Unsafe的方法直接调用操作系统底层资源。

5、valueOffset表示变量值在内存中偏移地址,Unsafe是根据内存偏移地址获取数据。

6、CAS 并发原语体现在 Java 的Unsafe的各个方法,调用Unsafe的各个方法,JVM 会帮我们实现CAS汇编指令,这完全依赖于硬件来实现原子操作,由于 CAS 是一种系统原语,是由若干条指令组成,用于完成某个功能的一个过程,原语执行是连续的,不允许中断,CAS 是一条 CPU 原子指令,不会造成数据的不一致问题。

public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);
}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;
}

自旋锁:
CAS是实现自旋锁的基础,CAS 利用 CPU 指令保证操作的原子性,以达到锁的效果,至于自旋,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,当线程发现锁被占用,会不断判断锁的状态,直到获取,这样的好处可以减少上下文切换的消耗,缺点就是循环消耗 CPU。

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

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

相关文章

Vmess协议是什么意思? VLESS与VMess有什么区别?

VMess 是一个基于 TCP 的加密传输协议,所有数据使用 TCP 传输,是由 V2Ray 原创并使用于 V2Ray 的加密传输协议,它分为入站和出站两部分,其作用是帮助客户端跟服务器之间建立通信。在 V2Ray 上客户端与服务器的通信主要是通过 VMes…

深度学习的点云分类

深度学习的点云分类 点云分类是指将三维点云数据中的每个点或整个点云进行分类的任务。点云数据由大量三维点构成,每个点包含空间坐标(x, y, z),有时还包含其他信息如颜色和法向量。点云分类在自动驾驶、机器人导航、3D重建等领域…

bitset 优化DP

bitset bitset 可以 用二进制代替0,1选择情况,也就是把固有的时间复杂度除以64或者32,且常数非常小,有些题目1e8都可以过

【InternLM实战营第二期笔记】06:Lagent AgentLego 智能体应用搭建

文章目录 讲解为什么要有智能体什么是 Agent智能体的组成智能体框架AutoGPTReWooReAct Lagent & Agent LegoAgentLego 实操Lagent Web Demo自定义工具 AgentLego:组装智能体“乐高”直接使用作为智能体,WebUI文生图测试 Agent 工具能力微调 讲解 为…

idea如何使用git reset进行回退以及如何使用git stash将暂存区文件储藏,打包后重新恢复暂存区文件

最近遇到一个棘手的问题,本来按照计划表开发,但是项目经理突然让你改一个小bug,改完需要马上部署到线上,但是你手上的活做到一半还没做完,提交上去那肯定是不可行的。这时就可以使用git stash命令先把当前进度&#xf…

三.四其他小组件

1、头部 2、logo组件 3、头部功能组件 4、视图组件 其他的没啥可以说的 视图数一下吧 说明白点就是 router封装的组件 <template><div:class"{ slideRight: state.slideclass.slideRight, slideLeft: state.slideclass.slideLeft , fadeInFadeOut: state.slidec…

Discuz! X3.4发帖时间修改插件批量操作版

下载地址&#xff1a;Discuz! X3.4发帖时间修改插件批量操作版 发帖时间与回复时间说明 1、使用本插件修改发帖时间&#xff0c;则帖子中的回复楼层的时间会保持同步同间隔修改&#xff0c;所谓同步同间隔就是如果某个回复是在主题发布之后一小时回复的&#xff0c;那么修改之…

【NLP】Python正则表达式

正则表达式&#xff08;Regular Expression, 简称 Regex&#xff09;是一种用于匹配字符串中字符模式的强大工具。在Python中&#xff0c;正则表达式由 re 模块支持。正则表达式可以用于搜索、编辑和处理文本。 正则表达式语法 正则表达式由普通字符和特殊字符&#xff08;元字…

71、最长上升子序列II

最长上升子序列II 题目描述 给定一个长度为N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 100000…

初阶c++入门

1.命名空间 namespace 变量的查找范围&#xff08;默认的情况下&#xff09; 当前的局部变量全局变量不会去命名空间去找&#xff08;以一定的格式 命名::变量或者函数&#xff0c;就是直接去命名空间里去查找&#xff09; 命名空间可以嵌套&#xff0c;来解决命名空间命名重复…

electron录制工具-desktopCapturer录屏

需求 录屏状态时&#xff0c;屏幕底部有个计时器&#xff0c;点击计时器停止录屏&#xff0c;跳转录屏结束的视频播放。 效果如下 electron-录屏演示 实现 计时器 创建一个浮窗&#xff0c;根据x、y坐标移动窗口的位置&#xff1b; // 获取屏幕的主显示器信息const { width…

AI服务器相关知识

在当今社会&#xff0c;人工智能的应用场景愈发广泛&#xff0c;如小爱同学、天猫精灵等 AI 服务已深入人们的生活。随着人工智能时代的来临&#xff0c;AI 服务器也开始在社会各行业发挥重要作用。那么&#xff0c;AI 服务器与传统服务器相比&#xff0c;究竟有何独特之处&…

ArcGIS要点和难点以及具体应用和优缺点介绍

ArcGIS是一款强大的地理信息系统(GIS)软件,广泛应用于各种领域,如城市规划、自然资源管理、环境保护、应急响应、地理科学研究和商业分析等。以下是对ArcGIS的详细介绍: 产品概述: ArcGIS提供了一个可伸缩的、全面的GIS平台,满足从桌面到服务器、野外和Web的各种GIS用户…

【docker】 pull access denied for alpine-java, repository does not exist

问题&#xff1a; com.spotify.docker.client.exceptions.DockerException: pull access denied for alpine-java, repository does not exist or may require docker login: denied: requested access to the resource is denied org.apache.maven.plugin.MojoExecutionExce…

Vue16-绑定class样式

一、vue绑定class样式 1-1、需求一&#xff1a;字符串写法 vue实现class样式绑定 1-2、需求二 点击div&#xff0c;随机切换样式。 math.random()&#xff1a;随机数的范围[0, 1) 1-3、需求三&#xff1a;数组写法 样式的追加 1-4、需求四 &#xff1a;对象写法 二、vue绑定…

mqtt js同时监听多个topic

在mqttjs中&#xff0c;可以使用client.subscribe()方法订阅多个topic&#xff0c;然后使用client.on(message)监听所有订阅的topic的消息。以下是一个示例&#xff1a; javascript const mqtt require(mqtt); const client mqtt.connect(mqtt://test.mosquitto.org); clie…

椋鸟C++笔记#5:C++内存管理

文章目录 C语言中的动态内存管理C\\中的动态内存管理使用new/delete操作内置类型使用new/delete操作自定义类型operator new(operator new[])与operator delete(operator delete[])函数operator new函数operator delete函数operator new[]和operator delete[] new与delete的实现…

ref和out

学习ref和out的原因 它们可以解决在函数内部改变外部传入的内容&#xff0c;里面变了&#xff0c;外面也要改变。 static void ChangeValue(int value) {value 3; }static void ChangeArrayValue(int[] arr) {arr[0] 99; }static void ChangeArray(int[] arr) {//重新声明了…

linux centos consul1.15.2一键安装部署

consul原理、作用、安装相关内容 一、理论部分二、安装下载版本地址三、安装consul服务 一、理论部分 1、consul的原理 Consul的原理及作用可以归纳为以下几点&#xff1a; ①、基于Gossip协议的通信&#xff1a;Consul使用了基于Gossip协议的Serf实现来进行通信。 Gossip协议…

【DevOps】服务器硬件基础知识

目录 前言 1、处理器&#xff08;CPU&#xff09;&#xff1a;服务器的“大脑” 2、内存&#xff08;RAM&#xff09;&#xff1a;服务器的“工作台” 3、存储&#xff08;Storage&#xff09;&#xff1a;服务器的“仓库” 4、 网络接口&#xff08;NIC&#xff09;&…