简单了解什么是CAS

本文探讨了Java的CAS(CompareandSwap)原子操作原理,它在JDK8中的应用,如AtomicInteger类中的weakCompareAndSet方法。还介绍了Unsafe类的作用,以及如何通过两种方式获取它,以及Unsafe类与CAS的内在联系。

本文基于JDK8

什么是CAS?

CAS(compare and swap),比较与交换,CAS实际上是操作系统底层提供的一个原子指令,对于CAS来说有三个值,V(需要修改的内存的地址)、A(预期初始的值)、B(预期修改后的值),简单来说就是当V位置的数据为A时,我们尝试把它修改为B。当多个线程同时进行修改的时候,只有一个线程可以成功,其它线程都会失败,对于失败的线程区别于锁不会挂起而是会继续尝试修改。

那么CAS在JDK里面的应用呢?

像我们熟悉的原子类的一些方法就是和CAS相关

public final boolean weakCompareAndSet(int expect, int update) {
    // valueOffset == V、expect == A、update == B
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

什么是Unsafe类?

Unsafe类有着类似于C语言指针一样可以操作内存的效果,但是如果不正确的使用Unsafe类可能导致程序出错。

// Unsafe类是单例实现的
private static final Unsafe theUnsafe;

有两种方式可以获得Unsafe类:

1.把调用Unsafe相关方法的类A所在jar包路径追加到默认的bootstrap路径中

java -Xbootclasspath/a: ${path}   // 其中path为调用Unsafe相关方法的类所在jar包路径 

2.反射

Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
return (Unsafe) field.get(null);

那Unsafe类和CAS的关系是什么呢?

AtomicInteger类的一个静态变量valueOffset表示字段value的内存偏移地址,配合AtomicInteger对象的基地址就可以得到CAS的三个基本数中的V

image-20240308193852686

private static final long valueOffset;
static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值