初级程序员必知系列之CAS略谈

298 阅读2分钟

这是我参与 8 月更文挑战的第 7 天,活动详情查看: 8月更文挑战 在多线程的环境下,如何保证修改多个变量的时候保持一致性成了一个不可逃避的问题。 针对上面的问题,可以通过加锁以及通过JUC中CAS来解决。

1.CAS是什么

个人认为CAS是一个CPU的原语,直接的说是操作硬件中内存的指令集合。 Ps: 所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断 规范的说法:CAS的全称为Compare-And-Swap,它是一条CPU的原语。

2.CAS能做什么?

它的功能是判断内存某个位置的值是否是预期,如果是则更改为新的值,这个过程是原子的。 Ps:原子性:一个操作或多个操作要么同时执行,要么就不执行,并且执行过程中不能被任何因素打断,我们称这种现象为原子性。

3.CAS的具体落地

在Java中的Unsafe类中各种方法就是CAS的落地。 Ps:Unsafe在sum.misc包中

4.CAS具体场景介绍

具体代码:

package JUC;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author MingJian_Zhu
 * @Date 2021/8/10 23:17
 */
public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5,2019)+"\t current data:"+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5,2019)+"\t current data:"+atomicInteger.get());
    }

}

image.png 结果解释: 为什么第一次能够修改成功,第二次就不行呢?

image.png

由上图可知,CAS每次替换值得时候,都会去主内存中查看被替换得值是否和atomicInteger.compareAndSet(var1,var2)中var1是否是一样的;一样则修改成var,否则则修改失败。

5.CAS在项目上的应用

CAS经常被做为synchronized的替代品。CAS具有并发性的同时也具有保持共享变量一致性的能力。