这是我参与 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());
}
}
结果解释:
为什么第一次能够修改成功,第二次就不行呢?
由上图可知,CAS每次替换值得时候,都会去主内存中查看被替换得值是否和atomicInteger.compareAndSet(var1,var2)中var1是否是一样的;一样则修改成var,否则则修改失败。
5.CAS在项目上的应用
CAS经常被做为synchronized的替代品。CAS具有并发性的同时也具有保持共享变量一致性的能力。