每日一博 - CAS(Compare-And-Swap)原理剖_原子操作


What’s CAS & sun.misc.Unsafe

全称 Compare-And-Swap , 主要实现的功能是和内存中的某个位置的值进行比较判断是否为预期值,如果是预期值则更改为新值, 整个过程具有原子性。

每日一博 - CAS(Compare-And-Swap)原理剖_操作系统应用_02


CAS & sun.misc.Unsafe

CAS属于CPU并发原语

CAS是一种系统原语,原语属于操作系统应用范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题,即CAS是线程安全的

在JDK中,主要体现在sun.misc.Unsafe类。

每日一博 - CAS(Compare-And-Swap)原理剖_原子操作_03

当执行UnSafe类中的cas相关方法时, JVM会转换成类似汇编指令,通过它实现了原子操作。

来看个代码

package com.artisan.juc;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2021/11/6 13:11
 * @mark: show me the code , change the world
 */
public class CASTest {

    public static void main(String[] args) {

        // 设置初始值为100
        AtomicInteger atomicInteger = new AtomicInteger(100);

        // 使用atomicInteger的compareAndSet,如果为100,则更新为123
        boolean b = atomicInteger.compareAndSet(100, 123);
        System.out.println(b + "----" + atomicInteger.get());

        // 使用atomicInteger的compareAndSet,如果为100,则更新为456 (上一步已经更新成了123,所以不是100)
        b = atomicInteger.compareAndSet(100, 456);
        System.out.println(b + "----" + atomicInteger.get());


    }
}
    

输出

true----123
false----123

每日一博 - CAS(Compare-And-Swap)原理剖_汇编指令_04


底层原理剖析

每日一博 - CAS(Compare-And-Swap)原理剖_操作系统应用_05
输出

每日一博 - CAS(Compare-And-Swap)原理剖_汇编指令_06

我们来研究下 getAndIncrement

每日一博 - CAS(Compare-And-Swap)原理剖_汇编指令_07
调用了unsafe# getAndAddInt

每日一博 - CAS(Compare-And-Swap)原理剖_cas_08