CAS操作

CAS

全称:Compare and swap,能够比较和交换某个寄存器中的值和内存中的值,看是否相等,如果相等,则把另外一个寄存器中的值和内存进行交换.

(这是一个伪代码,所以这里的&address实际上是想要表示取出address中的值)

那么我们可以看到,CAS就是这样一个简单的交换操作,那么我们为什么要在这里单独提出来呢?

原因是:这一段逻辑是通过一条CPU指令来完成的!(这就意味着,它是原子的)

这个对于编写线程安全的代码是非常重要的.我们为什么会有线程安全问题?归根结底是因为当前操作不是原子的.基于CAS又可以衍生出一套"无锁编程",但是CAS的使用范围具有一定的局限性.加锁的适用范围更广.

CAS的应用

实现原子类

比如,多线程针对一个count变量进行++操作,在Java标准库中,已经提供了一组原子类

//原子类的使用
public class Demo {public static AtomicInteger count =new AtomicInteger();public static void main(String[] args) throws InterruptedException {Thread t1=new Thread(()->{for (int i=0;i<5000;i++){// count++;//注意,这里是一个对象,而不是一个变量,所以不能直接使用++;count.getAndIncrement();//相当于:count++;//count.incrementAndGet();//相当于:++count;//count.getAndDecrement();//相当于count--;//count.decrementAndGet();//相当于--count;}});Thread t2=new Thread(()->{for (int i = 0; i < 5000; i++) {count.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count.get());}
}

对于这个关键字,现在这个关键字说的已经不算了,到底要不要将这个数据放到寄存器当中,是由编译器来自主决定的.

为什么这两个CAS访问内存会有先后呢?多个CPU在操作同一个资源,也会涉及到锁竞争(指令级别的锁),指令级别的锁是比synchronized代码级别的锁要轻量很多的.

实现自旋锁

CAS的ABA问题

CAS的关键要点是比较寄存器1和内存的值,通过这里的值是否相等来判定内存的值是否发生了变化,如果内存的值变了,那么就存在其他线程对其进行了修改,如果内存的值没有变,那么就说明没有其他线程进行修改,接下来进行的修改就是安全的.

如果这里的值没有变,就一定没有别的线程进行修改吗?

A-B-A

另一个线程,把变量的值从A->B,又从B->A.此时本线程就区分不了,这个值是始终没变还是出现变化有变回来了的这种情况.大部分情况下,就算出现ABA问题也没事.

在面对ABA问题,CAS的基本思路是正确的,但是主要是修改操作能够进行反复横跳,就容易让咱们CAS的判定失效.CAS判定的是"值相同",实际上期望的是"值没有变化过"如果约定,值只能单向变化,那不就可以判断了吗?有的时候我们的数据不允许只增加不减少,此时我们只需要在增加一个变量来专门记录修改的次数就可以了.

CAS也是属于多线程开发中的一种典型的思路,在实际开发中,一般不会直接使用CAS,都是用库里已经基于CAS封装好的组件(就像原子类这种)

native

见到native关键字,就要明白这个方法是在JVM内部通过C++代码实现的了

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

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

相关文章

基于SpringBoot房屋租赁管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《1000套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff…

TVBox自定义配置+软件密码版本

apk地址 : https://gitee.com/wheat-wheat/kekeda-duck-apk 1、安装安卓SDK Android SDK Windows 安装及环境配置教程_sdk manager windows-CSDN博客 修改点: 基础配置: java版本:

在系统已经存在postgres时,安装gitlab

以下作废&#xff0c;感觉直接装gitlab太不稳定了&#xff0c;现在转而使用dockers安装gitlab https://cloud.tencent.com/developer/article/2309562 https://www.cnblogs.com/lvzhenjiang/p/14949722.html https://cloud.tencent.com/developer/article/2256871 https://blo…

新火种AI|国产大模型展开决战,是资本游戏还是技术革命?

作者&#xff1a;一号 编辑&#xff1a;美美 资本角逐与技术革新&#xff0c;国产大模型的双线战场已然开启。 随着人工智能技术的不断进步&#xff0c;国产大模型正迅速成为行业关注的焦点。在这个由数据驱动的时代&#xff0c;资本的注入和技术创新的加速&#xff0c;让国…

Spring Cloud中的服务路由与过滤技术实现

Spring Cloud中的服务路由与过滤技术实现 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在微服务架构中&#xff0c;服务路由与过滤是确保服务之间通信有效性和安全性的重要技术。Spring Cloud作为…

Python28-6 随机森林

随机森林算法详细介绍 1. 理论背景 随机森林&#xff08;Random Forest&#xff09;是一种由Leo Breiman和Adele Cutler在2001年提出的集成学习方法。它结合了多个决策树的预测结果&#xff0c;以提高模型的准确性和鲁棒性。 2. 算法细节 随机森林的构建过程可以分为以下几…

Qt——升级系列(Level Eight):界面优化

目录 QSS 背景介绍 基本语法 QSS设置方式 指定控件样式设置 全局样式设置 从文件加载样式表 使用Qt Designer 编辑样式 选择器 选择器概况 子控件选择器 伪类选择器 样式属性 盒模型 控件样式示例 按钮 复选框、单选框 输入框 列表 菜单栏 登录界面 绘图 基本概念 绘制各种形…

[Go 微服务] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…

Linux内网端口转公网端口映射

由于服务商做安全演练&#xff0c;把原先服务器内网的端口映射到外网端口全都关闭了&#xff0c;每次维护服务器特别麻烦&#xff0c;像数据库查询如果用原生的mysql 去连接&#xff0c;查询返回的结果乱了&#xff0c;非常不方便。 查了服务还是可以正常访问部分外网的&#x…

知识图谱查询语言的表示

文章目录 SPARQL知识图谱查询基本构成常见的SPARQL查询算子语义Markup表示语言SPARQL知识图谱查询基本构成 RDF 支持类似数据库的查询语言,叫作SPARQL,它提供了查询RDF 数据的标准语法、处理SPARQL查询的规则以及结果返回形式。 变量,RDF中的资源,以“?”或者“$”指示;…

【chatgpt】pytorch的全连接层FC

文章目录 创建全连接层全连接层&#xff08;线性层&#xff09;使用 PyTorch 定义全连接层1. 定义一个全连接层2. 查看层的参数3. 使用全连接层 示例&#xff1a;构建一个简单的神经网络总结 打印FC参数输出解释完整代码示例示例输出总结 线性层的参数和属性线性层的参数和属性…

抖音外卖服务商入驻流程及费用分别是什么?入驻官方平台的难度大吗?

随着抖音关于新增《【到家外卖】内容服务商开放准入公告》的意见征集通知&#xff08;以下简称“通知”&#xff09;的发布&#xff0c;抖音外卖服务商入驻流程及费用逐渐成为众多创业者所关注和热议的话题。不过&#xff0c;就当前的讨论情况来看&#xff0c;这个话题似乎没有…

软件测试中安全测试包含内容及安全测试怎么测

一、软件测试安全测试包含哪些 1. 漏洞扫描 漏洞扫描是软件测试安全测试的基础&#xff0c;它用于检测应用程序和系统中存在的已知漏洞。安全测试工具如AppScan、OWASP ZAP和Nessus等可以对应用程序进行自动化扫描&#xff0c;发现可能存在的漏洞&#xff0c;如跨站点脚本&am…

7.2、指针变量的定义和使用

代码 #include <iostream> using namespace std; #include <string>int main() {//定义指针int a 10;//指针定义语法&#xff1a;数据类型 * 指针变量名int * p;//让指针记录变量a的地址p &a;cout << "a的地址为&#xff1a;" << &am…

MySQL之应用层优化(二)

应用层优化 Web服务器问题 寻找最优并发度 每个Web服务器都有一个最佳并发度——就是说&#xff0c;让进程处理请求尽可能快&#xff0c;并且不超过系统负载的最优的并发连接数。这就是前面说的最大系统容量。进行一个简单的测量和建模&#xff0c;或者只是反复试验&#xf…

2024年湖南省各市科小申报时间(科技型中小企业申报流程、条件、好处)新政

湖南省各市科小申报时间流程 一、评价管理 省科技厅牵头负责科技型中小企业评价工作的组织和监督、实地核查、公示公告、入库登记及编号撤销和集中抽查工作&#xff0c;及时处理相关异议、投诉和举报信息。 各市州科技局负责科技型中小企业评价工作的具体实施&#xff0c;组…

nginx SSI(Server Side Include)服务端包含 合并拼装静态内容

一、什么是SSI 在被传送给浏览器之前&#xff0c;服务器会对 HTML 文档进行完全地读取、分析以及修改&#xff0c;使用SSI指令将文本、图片或代码信息包含到网页中。对于整个页面可以拆分成多个模块&#xff0c;通过SSI指令将几个模块拼接成一个完整的页面&#xff0c;当有内容…

【数据库原理】课程笔记

数据库原理 一、数据库系统基础 数据模型的类型 概念数据模型&#xff1a; 概念数据模型也称概念模型或信息模型,是对现实世界中问题域内事务(特性)的描述,是以用户观点实现世界的模型(图形表示)。主要用于描述事物的概念化结构,使数据库的设计人员在设计初期,避开计算机系统及…

ATA-L2水声功率放大器驱动水声换能器的测试研究

随着水声通信技术的发展&#xff0c;水下通信设备也开始逐步走向实用化&#xff0c;为了满足其实际的使用要求&#xff0c;功率放大器的设计需要具有高效率的特性&#xff0c;并能在水下长时间连续可靠的工作。 压电陶瓷换能器主要负责电信号与声信号之间的转换&#xff0c;换能…

mybatis配置返回boolean类型

先大概说明一下ResultMap和ResultType的使用场景 ResultMap适用于复杂的查询&#xff0c;可以处理多表关联查询、嵌套查询等情况。通过ResultMap&#xff0c;可以更精确地控制查询结果的映射。ResultType适用于简单的查询&#xff0c;而ResultMap适用于复杂的查询。具体使用哪…