CSDN博主:【java_wxid】
CSDN博主:点击【Java廖志伟】
CSDN社区:点击【幕后大佬】
码云:点击【互联网Java工程师知识扫盲】
随笔 - 882,  文章 - 0,  评论 - 1,  阅读 - 51602

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操作是一种原子操作,可以保证在多线程并发执行的情况下,只有一个线程可以成功地修改内存中的值。这样可以保证多线程程序的正确性。

posted on   我是廖志伟  阅读(57)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

南北踏尘
点击右上角即可分享
微信分享提示