CAS学习笔记

CAS学习笔记

–底层原理:
1.自旋锁
2.unsafe. getandaddint()

CAS:比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令(功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。)
它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成。

compareAndSwap();

AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5, 2019)+"\t current date: "+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5, 1080)+"\t current date: "+atomicInteger.get());

unsafe类:
-------- 由于java方法无法直接访问底层系统,需要通过本地 (native) 方法来访问,unsafe相当于一个后门,基本该类可以直接操作特定内存的数据。unsafe类存在于sun.misc包中,其内部操作可以想C的指针一样直接操作内存,因为java中CAS操作的执行依赖于unsafe类的方法
注意:unsafe类中的所有方法都是native修饰的,也就是说unsafe类中的方法都直接调用操作系统底层资源执行相应任务
native方法:直接操作系统底层资源
CAS的底层原理的简明理解
在这里插入图片描述

public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

(var1 AtomicInteger对象本身
var2该对象值得引用地址
var4 需要变动的数量
var5 是用对var1 var2找出的主内存中真实的值。)

用该对象当前的值与var5比较;
如果相同,更新var5+var4并且返回true
如果不同,继续取值然后再比较,直到更新完成。

CAS缺点

1.循环时间长开销大 ——> 如果CAS失败,会一直进行尝试。如果CAS一直不成功,可能会给CPU带来很大的开销(synchronized锁住一个线程,进行单线程操作,cup利用率低)
2.只能保证一个共享变量的原子操作;对多个共享变量的操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性

3.ABA问题:CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差里会产生数据的变化

  ----->:原子引用   AtomicReference方法

(解决ABA问题) ------> :原子引用(修改版本号)AtomicStampedReference

以上仅是代表个人学习心得,不对的地方请告知!谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值