并发编程 - CAS学习、理解

CAS(Compare and Swap)是处理器支持的一种原子操作,用于多线程环境下保证数据修改的原子性。在Java中,通过Atomic类提供了一系列的CAS操作,如AtomicInteger、AtomicReference等,用于不同类型的原子更新。同时,文章提到了ABA问题,即值从A变为B再变回A,可能导致的问题,并指出CAS操作不能解决这个问题。此外,使用CAS可能会造成自旋锁带来的资源消耗,但相对于CPU时间来说,这种消耗较低。
摘要由CSDN通过智能技术生成

什么是CAS

CAS是现代处理器内部实现,用于解决在多线程环境下,通过对同一内存地址的值进行修改时,确保该操作,是原子的。
主要实现原理,在提交修改时,将该内存地址中原值进行取出,与传入的旧值进行比较,如果一致,那么将新值写入该内存地址。
在Java中,提供了三种类型操作类:

普通类型

AtomicInteger:用于对整形数据的修改

AtomicIntegerArray:用于对数组整形成员进行修改,每次修改时,需要额外提供数组索引下标。

引用类型

AtomicReference 用于修改该内存地址的引用 AtomicStampedReference 用于解决ABA问题而产生,在每次修改前,可以取出版本号进行比较。两个参数,第一个参数为泛型V,第二个参数为初始版本号

AtomicMarkableReference 也是用于解决ABA问题,不过第二个参数为布尔型,其关注该值有没有被修改过,与AtomicStampedReference的区别在于,AtomicStampedReference关心的是值被修改了几次

引用字段类型

AtomicIntegerFieldUpdater 原子更新整形字段值

AtomicLongFieldUpdater 原子更新长整形字段值

AtomicReferenceFieldUpdater 原子更新引用字段值

什么是ABA问题?

ABA问题就是,在修改一个值前,获取到该值原值为A,然后中间由操作系统的调度暂停,此期间由其他线程执行时,将此值修改到了B,然后又修改回了A,此时线程调度回来进行修改时,发现旧值与原来的值一致,实际上中间被修改过。这就是ABA问题的产生。

CAS注意事项

如果在CAS使用时,通过自旋的方式对值进行修改,那么会造成一定资源的消耗,因为需要保证修改成功,所以需要采用自旋的方式不断尝试,直到成功为止,每次修改大概需要耗费0.6ns,对于cpu来讲是很低的消耗

只能保证一个变量的原子性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值