CAS简介

在这里插入图片描述
#1024程序员节|征文#

CAS是什么?

CAS(Compare And Swap),即比较与交换,是一种乐观锁的实现方式,用于在不使用锁的情况下实现多线程之间的变量同步。

CAS操作包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。

当且仅当内存位置的值与预期原值相等时,才会将该位置的值更新为新值。

这种机制广泛应用于Java并发编程中,如AtomicInteger、AtomicLong等原子类内部都使用了CAS操作来实现线程安全。

CAS存在的问题

尽管CAS在并发编程中具有重要作用,但它也存在一些显著的问题:

  1. ABA问题:
    • 问题描述:CAS需要在操作值的时候检查内存值是否发生变化,没有发生变化才会更新内存值。但是,如果内存值原来是A,后来变成了B,然后又变成了A,那么CAS进行检查时会发现值没有发生变化(仍为A),但实际上该值已经被其他线程修改过。
    • 解决思路:通过在变量前面添加版本号,每次变量更新的时候都把版本号加一。这样,即使变量的值从A变为B再变回A,版本号也会改变,从而CAS能够识别出变量的值已经发生了变化。Java从1.5开始提供了AtomicStampedReference类来解决ABA问题。
  2. 循环时间长开销大:
    • 问题描述:CAS操作如果长时间不成功,会导致其一直自旋(即不断重试),给CPU带来非常大的开销。特别是在高并发场景下,多个线程同时对一个变量进行CAS操作,可能导致大量线程长时间处于自旋状态。
    • 解决思路:可以通过自旋锁和pause指令优化。例如,JVM支持处理器提供的pause指令,该指令能让自旋失败的线程CPU睡眠一小段时间再继续自旋,从而减少CPU的浪费。
  3. 只能保证一个共享变量的原子操作:
    • 问题描述:CAS操作只能保证对单个共享变量的原子操作。当需要对多个共享变量进行原子操作时,CAS无法保证这些操作的原子性。
    • 解决思路:对于多个共享变量的原子操作,需要使用其他技术如锁(synchronized或ReentrantLock)来保证原子性。Java从1.5开始提供了AtomicReference类来保证引用对象之间的原子性,可以将多个变量放在一个对象里来进行CAS操作。

示例讲解

CAS(Compare And Swap),即比较并交换,是一种用于实现多线程同步的乐观锁机制。在Java中,CAS操作广泛应用于java.util.concurrent.atomic包下的原子类中,如AtomicInteger、AtomicLong等。以下将给出一个具体的CAS示例并进行讲解。

CAS示例

假设有一个场景,我们需要实现一个线程安全的计数器,多个线程同时对这个计数器进行自增操作。

我们可以使用AtomicInteger类来实现这个计数器,而AtomicInteger内部正是通过CAS操作来保证线程安全的。

import java.util.concurrent.atomic.AtomicInteger;public class CounterExample {private static AtomicInteger counter = new AtomicInteger(0);public static void main(String[] args) throws InterruptedException {// 创建多个线程对counter进行自增操作Thread t1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {counter.incrementAndGet();}}, "Thread-1");Thread t2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {counter.incrementAndGet();}}, "Thread-2");t1.start();t2.start();// 等待所有线程执行完毕t1.join();t2.join();// 打印最终结果System.out.println("Final counter value: " + counter.get());}
}

CAS讲解

在上述示例中,AtomicInteger类的incrementAndGet()方法实现了线程安全的自增操作。

这个方法内部正是通过CAS操作来保证的。

具体来说,incrementAndGet()方法的大致实现逻辑如下:

  1. 获取当前值:首先,通过get()方法或类似机制获取当前计数器的值,假设为oldValue。
  2. 计算新值:然后,基于当前值oldValue计算出新值newValue,即newValue = oldValue + 1。
  3. CAS操作:接着,使用CAS操作尝试将计数器的值从oldValue更新为newValue。CAS操作包含三个参数:内存地址(这里是计数器的内存地址)、预期原值(oldValue)、新值(newValue)。如果此时计数器的实际值仍然等于oldValue,则将计数器的值更新为newValue,操作成功;如果不等于,则操作失败,说明在获取当前值和进行CAS操作之间,计数器的值已经被其他线程修改了。
  4. 循环重试:如果CAS操作失败,则重新执行步骤1到步骤3,直到CAS操作成功为止。这个过程称为自旋。
  5. 返回新值:CAS操作成功后,返回更新后的新值newValue。

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

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

相关文章

Stability.AI 发布 SD3.5 模型,能否逆袭击败 FLUX?如何在ComfyUI中的使用SD3.5?

就在前天&#xff0c;Stability AI 正式发布了 Stable Diffusion 3.5版本&#xff0c;包括 3 款强大的模型&#xff1a; Stable Diffusion 3.5 Large&#xff1a;拥有 80 亿参数&#xff0c;提供卓越的图像质量和精确的提示词响应&#xff0c;非常适合在 1 兆像素分辨率下的专…

鸿蒙开发:走进stateStyles多态样式

前言 一个组件&#xff0c;多种状态下&#xff0c;我们如何实现呢&#xff1f;举一个很简单的案例&#xff0c;一个按钮&#xff0c;默认状态下是黑色背景&#xff0c;点击后是红色&#xff0c;手指放开后还原黑色。 我们自然而然的就会想到利用手势的按下和抬起&#xff0c;…

美课+, 一个公司老项目,一段程序猿的技术回忆

前言 "美课"项目从2018年3月26号开始启动到2018年6月8号结束,总计两个月多的时间,项目的时间节点比较紧张.虽然最后没有上线很遗憾,但是,不管是在流程和项目上,对自己都是一次不错的尝试.下面我就对这次项目做一下iOS端的整体总结. #### 技术难点 *** 在iOS端,我感到…

鸿蒙应用开发:数据持久化

最近在搞公司项目用到了鸿蒙端的数据持久化&#xff0c;特来跟大家分享一下。 在鸿蒙开发中&#xff0c;可以使用以下几个包来实现数据的持久化处理&#xff1a; Data Ability 通过数据能力组件&#xff0c;开发者可以实现复杂的数据操作&#xff0c;包括增、删、改、查等功…

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…

Linux如何安装“ServerAgent“并使用?

1、cd /home/ 2、上传文件到项目文件下 3、解压 unzip ServerAgent-2.2.3.zip 4、打开文件 cd ServerAgent-2.2.3/ 5、赋权&#xff08;测试环境&#xff09; chmod -R 777 *6、启动 ./startAgent.sh

Prompt-Tuning方法学习

文章目录 一、背景1.1 Pre-training1.2 Fine-Tuning1.3 高效微调&#xff08;SOTA PEFT&#xff09;1.4 基于强化学习的进阶微调方法&#xff08;RLHF&#xff09; 二、Prompt-Tuning技术2.1 发展历程2.2 Prompt模板构建方式 三、基于连续提示的Prompt Tuning四、Q&A 一、背…

程序员节日的日期是10月24日‌程序员日

‌程序员节日的日期是10月24日。‌ 这一天被称为‌中国程序员日或‌1024程序员节&#xff0c;由‌博客园、‌CSDN等自发组织设立&#xff0c;旨在纪念程序员对科技世界的贡献。 程序员节日的由来和意义 1024程序员节的由来可以追溯到2010年&#xff0c;最初由网友提出设立一个…

RocketMQ消息处理详解!

文章目录 引言同步发送原理分析优缺点优点缺点 使用场景 异步发送原理分析优缺点优点缺点使用场景 单向发送原理分析优缺点优点缺点 使用场景 三种方式对比如何选择同步发送异步发送单向发送 总结 引言 在 RocketMQ 中&#xff0c;有 3种简单的消息发送方式&#xff1a;同步发…

计算服务器:开启科学计算新变革的强大引擎

1983 年&#xff0c;著名数学家 Lax 为首的调研小组指出&#xff0c;大型科学计算对国家安全、科技进步与经济发展至关重要&#xff0c;从美国国家利益出发&#xff0c;大型计算的绝对优势不容动摇。 科学计算是什么&#xff1f;为何在 20 世纪 80 年代就被提升到美国国家利益层…

Pytest日志收集器配置

前言 在pytest框架中&#xff0c;日志记录&#xff08;logging&#xff09;是一个强大的功能&#xff0c;它允许我们在测试期间记录信息、警告、错误等&#xff0c;从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成&#xff0c;因此你可以很容易地在…

vmware虚拟机linux系统安装

一、下载linux镜像安装包 步骤1---网址地址下载镜像 地址&#xff1a;Index of /ubuntu-releases/22.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 步骤2---下载linux版本号 步骤3---查看下载的linuxiso linux镜像操作系统 二、vmware新建安装linux操作系统…

边缘计算技术的优势与挑战

如今&#xff0c;随着5G快速无线网络的到来&#xff0c;将计算存储和物联网&#xff08;IoT&#xff09;分析的部署放在靠近数据产生的地方&#xff0c;使得边缘计算成为可能。 物联网设备和新应用的扩展需要实时计算能力。5G无线正在考虑边缘系统&#xff0c;以快速跟踪支持实…

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

爬虫中代理ip选择和使用实战

一、爬虫中的反爬问题 爬虫技术不仅是一种工具&#xff0c;更像是一门捕捉信息的艺术。通过它&#xff0c;我们能够从浩瀚的互联网中&#xff0c;精确获取到所需的有价值数据。对于那些需要进行数据分析或模型训练的人来说&#xff0c;爬虫技术几乎是必备的技能。虽然网上公开…

git提交到github个人记录

windows下git下载 1.进入git官网https://git-scm.com/downloads/win 一直默认选项即可 2.在settings中SSH and GPG keys中Add SSH key 3.选择git cmd git使用 1.配置用户名&#xff0c;和邮箱 git config --global user.email "youexample.com" git config --g…

Director3D: Real-world Camera Trajectory and 3DScene Generation from Text 论文解读

目录 一、概述 二、相关工作 1、文本到3D生成 2、3DGS 三、Director3D 1、Cinematographer 2、Decorator 3、Detailer 4、Loss 一、概述 该论文提出利用真实世界数据集&#xff0c;设计一个从文本生成真实世界3D场景和自适应相机轨迹的强大的开放世界文本到3D生成框架…

067_基于springboot的HSK学习平台

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

文章目录 人脸关键点定位一、作用二、原理三、代码实现1. 构造人脸检测器2. 载入模型&#xff08;加载预测器&#xff09;3. 获取关键点4. 显示图像5. 完整代码 总结 人脸关键点定位 在dlib库中&#xff0c;有shape_predictor_68_face_landmarks.dat预测器&#xff0c;这是一个…

安装vue发生异常: idealTree:nodejs: sill idealTree buildDeps

一、异常 C:\>npm install vue -g npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIREDnpm ERR! request to https://registry.npm.taobao.org/vue failed, reason: certificate has expired 二、原因 请求 https://registry.npm.taobao.org 失败&#xff0c;证…