CAS算法

CAS算法

1. CAS简介

CAS叫做CompareAndSwap,比较并交换,主要是通过处理器的指令来保证操作的原子性。

CAS基本概念

  • 内存位置 (V):需要进行CAS操作的内存地址。
  • 预期原值 (A):期望该内存位置上的旧值。
  • 新值 (B):如果旧值与预期原值相匹配,则用这个新值替换旧值。

CAS操作流程

  1. 比较: CAS首先读取内存位置V的当前值。
  2. 检查: 检查当前值是否与预期值A相等。
    • 如果相等,则进行下一步。
    • 如果不相等,则CAS操作失败,返回当前值或false。
  3. 交换: 如果当前值与预期值相等,则用新值B替换当前值。
  4. 返回结果: 成功后返回true,表示值已更新;或者返回false,表示值未更改

补充1:CAS操作是原子的,这意味着它要么完全执行成功,要么完全不执行。这意味着在CAS操作过程中,其他线程不能干扰这个操作。在硬件级别,这是通过CPU的特殊指令实现的,比如在Intel x86架构中使用的CMPXCHG(compare and exchange)指令。(来自网络)
补充2:在Java中,CAS操作是通过Unsafe类提供的本机方法实现的,这些方法允许直接访问底层内存。(来自网络)

2. CAS具体实践

Java中的java.util.concurrent.atomic包提供了基于CAS的原子类,如AtomicInteger、AtomicReference等。

下面结合我的所学,简单的试验一下AtmoicInteger
说明:下面用到的线程池Executors、AtmoicInteger等都是java.util.concurrent下面的类

public class TestCAS {private static final AtomicInteger count1 = new AtomicInteger(0);private static Integer count2 = 0;public static void main(String[] args) throws InterruptedException, ExecutionException {useAtomicInteger();notUseAtomicInteger();}// 使用AtomicIntegerpublic static void useAtomicInteger() {ExecutorService executor = Executors.newFixedThreadPool(10);for (int i = 0; i < 1000; i++) {executor.submit(() -> count1.incrementAndGet());}executor.shutdown();while (!executor.isTerminated()) {}System.out.println("Use AtomicInteger Final Result count: " + count1.get());}// 不使用AtomicIntegerpublic static void notUseAtomicInteger() {ExecutorService executor = Executors.newFixedThreadPool(10);for (int i = 0; i < 1000; i++) {executor.submit(() -> count2++);}executor.shutdown();while (!executor.isTerminated()) {}System.out.println("Not Use AtomicInteger Final Result count: " + count2);}
}

结果:
在这里插入图片描述

结果说明:

  1. 使用AtomicInteger的结果因为AtomicInteger实现了CAS算法,所以结果始终是1000;
  2. 而没有使用AtomicInteger的结果,因为线程池异步的原因,导致每次计算的结果都会略有偏差。

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

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

相关文章

The Llama 3 Herd of Models.Llama 3 模型论文全文

现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…

DNS 污染/毒化——华为ensp

实验原理:1&#xff0c;用户正常访问 Web页面&#xff0c;会查询本地DNS服务器&#xff0c;一般情况下&#xff0c;本地DNS服务器会设置为 网关地址。2&#xff0c; 攻击者在 用户和网关之间&#xff0c;开启ARP攻击即可&#xff0c;这样&#xff0c;就可以让 用户访问本地DNS服…

【Ant Design Pro】快速上手

初始化 初始化脚手架&#xff1a;快速开始 官方默认使用 umi4&#xff0c;这里文档还没有及时更新&#xff08;不能像文档一样选择 umi 的版本&#xff09;&#xff0c;之后我选择 simple。 然后安装依赖。 在 package.json 中&#xff1a; "start": "cross-e…

卷积的意义及其派生(一)

1.卷积的意义 1.1从LTI的角度看 卷积最开始其实是信号处理中用来描述线性移不变系统Linear time-invariant systems的。线性&#xff0c;表明可以叠加&#xff0c;信号可以拆分成脉冲的响应&#xff1b;时不变&#xff0c;指信号不随着时间的迁移改变&#xff0c;意味着能量守…

【iOS】——通知机制及底层原理

通知传值概要 通知传值可以跨越多个界面进行传值&#xff0c;一般用于后一个界面向前一个界面传值。 通知传值支持多个接收者&#xff0c;多个对象可以同时接收同一个通知并进行处理。这样可以实现一对多的通信&#xff0c;方便跨多个对象进行值传递。 使用步骤 1.在发送者中…

Latent Factor Analysis via Dynamical Systems:LFADS (Nature methods 2018)

Nature Methods&#xff1a;https://www.nature.com/articles/s41592-018-0109-9 LFADS Run Manager for Matlab&#xff1a;https://lfads.github.io/lfads-run-manager/ 目录 Single session:假设&#xff1a;方法&#xff1a;结果&#xff1a; Multi-sessions:假设&#xff…

【C++】位运算:两整数之和

1.题目 2.算法思路 本题不能只用 -&#xff0c;那大概率用到位运算符。 异或的作用是无进位相加&#xff0c;所以需要通过异或运算&#xff08;^&#xff09;来替代加法运算&#xff0c;但是我们无法确定进位的信息。所以需要与运算&#xff08;&&#xff09;来得到进位的…

【Android】Activity生命周期与五种启动模式

文章目录 生命周期返回栈Activity状态生命周期方法 启动模式standard模式singleTask模式singleTop模式singleInstance模式singleInstancePerTask模式配置方式 生命周期 返回栈 每个Activity的状态由它在Activity栈&#xff08;又叫“回退栈back stack”&#xff09;中的位置决…

MySQL高性能读写分离实战

介绍 我的上一篇文章实现了mysql的主从复制结构&#xff0c;今天这篇继续将如何实现读写分离。 读写分离是指&#xff1a;针对数据库的写操作&#xff08;插入、更新、删除等&#xff09;访问主数据库&#xff0c;读操作访问从数据库。 因为一般网站的读请求的数量是远远大于…

《数据结构:顺序实现二叉树》

文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff…

【Python机器学习】决策树的构造——划分数据集

分类算法除了需要测量信息熵&#xff0c;还需要划分数据集&#xff0c;度量划分数据集的熵&#xff0c;以便判断当前是否正确划分了数据集。 我们将对每个特征划分数据集的结果计算一次信息熵&#xff0c;然后判断按照哪个特征划分数据集是最好的划分方式。 想象一个分部在二…

4-4 数值稳定性 + 模型初始化和激活函数

数值稳定性 这里的 t t t表示层&#xff0c;假设 h t − 1 h^{t-1} ht−1是第 t − 1 t-1 t−1层隐藏层的输出&#xff0c;经过一个 f t f_{t} ft​得到第 t t t层隐藏层的输出 h t h^{t} ht。 y y y表示 x x x进来&#xff0c;第一层一直到第 d d d层&#xff0c;最后到一个损…

研究生选择学习Android开发的利与弊?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;产品经理可以学学Axure快…

vscode远程免密登入

1、windows (1) 点击左下角 ->将当前窗口连接到主机…->&#xff08;配置ssh文件&#xff0c;点击或者指定&#xff09;->按这个格式添加 (2) 在cmd命令窗口&#xff1a;ssh-keygen -t rsa (-C “name”) #这个name是远程linux的用户名&#xff0c;这里也可以不加-C…

H264编码器实现-帧内预测之像素值预测

前言 本文所介绍的像素值预测&#xff0c;是指在帧内预测总体流程中的预测块每个像素值的推导过程。当我们已知向量像素的重建值的时候&#xff0c;我们就可以对当前预测块进行像素值预测。该过程得到的结果将与源像素值相减得到残差&#xff0c;为后续变换量化提供数据来源。…

Godot入门 04平台设计

新建创景&#xff0c;添加AnimatableBody2D节点。 添加Sprite2D节点 拖动图片 剪裁图片&#xff0c;吸附模式&#xff1a;像素吸附 添加CollisionShape2D&#xff0c;设置实际形状为矩形 重命名AnimatableBody2D节点为Platform&#xff0c;保存场景&#xff0c;拖动platform场景…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…

软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能…

“消费增值风暴:百万业绩背后的创新电商模式“

今日&#xff0c;我怀着无比激动的心情&#xff0c;向您揭示一个激励人心的成长篇章。我们的战略伙伴在短短一个月内&#xff0c;业绩如火箭般攀升&#xff0c;成功跨越百万销售额大关&#xff0c;同时&#xff0c;其用户活跃度居高不下&#xff0c;日均在线用户数稳稳占据8至1…