CAS (CompareAndSwap) 底层基本原理分析和 ABA问题

CAS机制

CAS——CompareAndSwap:比较并替换
作用是进行计算的时候判断当前值是否满足预期,如果满足则更新为新值,保证整个过程具备原子性。通过内存中的值,逻辑值和要更改的值进行比较替换,通过自旋的方式在操作内存的值的时候通过内存的值和逻辑值进行比较,如果一致,则替换更改(这一步原子操作)。

代码分析:

JDK中为了方便开发正操作,已经实现了很多原子性操作的类,这些类底层就是通过CAS控制原子操作的,比如AtomicInteger,通过AtomicInteger 提供的API就可以验证CAS的简单执行原理。在AtomicInteger API中可以看到具体实现是通过sun.misc包中的Unsafe类实现的。后面会简单的说明,如下代用来验证CAS的简单执行过程和思想。

public class Test {
   
    public static void main(String[] args) {
   
        AtomicInteger test = new AtomicInteger();
        System.out.println(test.get());   // 初始化的 值为 0 
        /*
         //该方法就是根据预期来更新值得,底层是调用了Unsafe类的 compareAndSwapInt
         //expect 预期值, update 更新的值
         public final boolean compareAndSet(int expect, int update) {
         	 // 最后调用的是Unsafe类中的compareAndSwap 方法
		     return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
		 }
         */
        boolean b = test.compareAndSet(2, 1);  // 传入一个预期值2  但实际值是0
        System.out.println(b);   // false   实际值0 不满足预期值2 即设置不成功
        System.out.println(test.get());  // 0  
        b = test.compareAndSet(0, 10);   // 预期值0   实际值0 
        System.out.println(b);        // true
        System.out.println(test.get());  // 10  满足预期
    }
}
Unsafe 类

Unsafe是存在于sun.misc包中的一个类,该类的作用是使Java拥有想C语言一样直接操作内存空间的能力,该类使用了单利模式,需要通过一个静态方法来获取,但是又做了限制,如果是普通调用,会抛出一个SecurityException的异常,只允许jdk 加载核心类的类加载器(Bootstrap)加载的类才可以调用。该类提供了很多直接操作内存的方法。

// Unsafe提供了许多可以直接操作内存的一些API
// 如分配指定内存大小,释放内存,给指定内存设值等。
public native long allocateMemory
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值