【CompareAndSwap底层原理】

news/2024/7/3 16:38:50

文章目录

    • CompareAndSwap底层原理
    • 小故事

CompareAndSwap底层原理

CompareAndSwap(CAS)是一种并发编程中的操作,它可以判断一个变量的当前值是否与预期值相同,如果相同,就将该变量的值设置为新值。CAS操作通常用于多线程并发访问的情况下,保证数据的一致性和正确性。

下面是一个简单的CAS操作的代码示例:

public class CASExample {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        int expect = counter.get();
        int update = expect + 1;
        while (!counter.compareAndSet(expect, update)) {
            expect = counter.get();
            update = expect + 1;
        }
        System.out.println("Counter value: " + counter.get());
    }
}

在该示例中,我们使用了Java提供的AtomicInteger类来实现CAS操作。首先我们获取当前计数器的值,并将其赋给expect变量。然后我们将expect加1,得到update变量。

接着我们用while循环进行CAS操作,如果当前计数器的值与expect相同,就将计数器的值设置为update,并返回true。否则,说明该操作失败了,我们重新获取计数器的值,重新计算expectupdate,并继续尝试CAS操作。

CAS操作的底层原理通常是通过硬件指令实现的,这些指令通常是原子的,不会被中断或抢占。这种方式可以避免线程竞争的情况下出现不一致的状态。具体地,CAS操作通常包括以下三个步骤:

  1. 读取内存地址中的值,并将其与预期值进行比较;
  2. 如果相同,则将内存地址中的值设置为新值,并返回true
  3. 如果不同,则什么也不做,并返回false

在Java中,CAS操作通常通过synchronized关键字和Lock接口来实现。Java中的synchronized关键字可以保证代码块的原子性,而Lock接口提供了更加灵活的锁机制,可以满足不同的并发需求。

总之,CAS操作是一种非常重要的并发编程技术,可以保证多线程并发访问的数据一致性和正确性。通过硬件指令实现的CAS操作,可以避免线程竞争的情况下出现不一致的状态,是一种非常高效的并发编程技术。

小故事

曾经有一个小偷来到了一家银行,他想要打开银行保险柜里的钱箱。但是保险柜上有一个密码锁,密码锁的密码是一个四位数。他开始试着猜这个密码,但是每次猜错了都会发出嘟嘟声,惊动了银行的保安。为了避免被发现,小偷想到了一个方法:他观察了一会儿密码锁的操作,发现每次输入密码之后,密码锁会将输入的数字与一个内部的计数器相加,然后将相加的结果存储在一个内部变量中。如果输入的密码与存储的结果相等,密码就是正确的。于是小偷就开始想办法修改存储的结果,这样即使他输入的密码不正确,也能够打开保险柜。他把密码锁的内部计数器改成了0,然后输入密码。密码锁将输入的数字与计数器相加,然后存储在内部变量中。小偷再次来到密码锁前,输入了一组错误的密码,密码锁将输入的数字与计数器相加之后,存储在了内部变量中,但是这时存储的结果已经不正确了,因为小偷已经改变了计数器的值。小偷又试了几次不同的密码,密码锁一直认为密码是正确的,最终,他成功地打开了保险柜。

这个小故事就是 CompareAndSwap(比较-交换)操作的原理,也就是小偷通过观察密码锁的内部操作,改变内部变量来实现了盗窃。在计算机中,CompareAndSwap也是通过比较内存中的值与一个期望值,如果相等,则将内存中的值替换成一个新的值。CompareAndSwap操作是一种原子操作,可以保证在多线程并发执行的情况下,只有一个线程可以成功地修改内存中的值。这样可以保证多线程程序的正确性。


http://lihuaxi.xjx100.cn/news/1247062.html

相关文章

Mini LED电视大热,“智能化”渐行渐远?

在中国,电视机几乎是每个家庭必备的家用电器。相较于手机、平板、电脑、学习机等产品而言,由于电视机的屏幕足够大,所以其带给用户的视觉体验会相对更好一些,而影响用户视觉体验的除了屏幕大小以外,还有显示技术。 前…

微信小程序实现选择地区demo,记录最近访问的地区

最终效果图&#xff1a; index.wxml <view class"container"><view class"search_contaniner"><view class"search_box"><input type"text" placeholder"省/市级/区县级" value"{{search_con…

1.5 掌握Scala内建控制结构(一)

一、条件表达式 &#xff08;一&#xff09;语法格式 if (条件) 值1 else 值2 &#xff08;二&#xff09;执行情况 条件为真&#xff0c;结果是值1&#xff1b;条件为假&#xff0c;结果是值2。如果if和else的返回结果同为某种类型&#xff0c;那么条件表达式结果也是那种…

10 个杀手级的Python自动化脚本,解放你的双手

重复性任务总是耗时且无聊&#xff0c;想一想你想要一张一张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作&#xff0c;所有这些任务都很耗时&#xff0c;为什么不自动化它们呢&#xff1f;在今天的文章中&#xff0c;我将与你分享 10 个 Python [自动化脚本]。 所以&a…

网络编程与自动化(python)

20.1 网络编程与自动化概述 传统网络运维困境大家在日常的网络运维中是否遇到过如下问题: 设备升级:现网有数千台网络设备,你需要周期性、批量性地对设备进行升级。配置审计:企业年度需要对设备进行配置审计。例如要求所有设备开启sTelnet功能,以太网交换机配置生成树安全…

【mmcls】mmdet中使用mmcls的网络及预训练模型

mmcls现在叫mmpretrain&#xff0c;以前叫mmclassification&#xff0c;这里为了统一称为mmcls。在基于MM框架的下游任务&#xff0c;例如检测(mmdetection)中可以使用mmcls中的backbone进行特征提取&#xff0c;但这就需要知道网络的参数以及输出特征的维度。本文简单介绍了在…

Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

1. 前言&#x1f525; 对于很多小伙伴来说&#xff0c;项目现在都普遍前后端分离&#xff0c;各干各的事儿&#xff0c;在前后端进行服务调用才会有大面积的碰头&#xff0c;后端接口数据格式发生变更要通知前端&#xff0c;相反&#xff0c;前端有变化要告诉后端&#xff0c;这…

Matter实战系列-----4.matter设备的OTA

一、生成OTA固件升级压缩包 1.1 修改OTA固件版本号为3 1.2 编译生成 MatterLightOverThread_V3.ota 将编译得到的MatterLightOverThread.s37固件名称改成MatterLightOverThread_V3.s37&#xff0c;复制到以下Windows文件夹 C:\SiliconLabs\SimplicityStudio\v5\developer\ad…