Java并发编程CAS与Atomic原子类

1.什么是 CAS

        CAS(Compare And Swap,比较并交换),通常指对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。
在Java中,CAS 操作是由 Unsafe 类提供支持的,该类定义了三种针对不同类型变量的 CAS 操
作。 以compareAndSwapInt为例 ,这四个参数分别是:对象实例(var1)、 内存 偏移量(var2)、字段期望值(var4)、字段新值(var5)

        进行cas操作时,首先var1对象根据字段内存偏移量,找到其在内存中对应的值,然后与var3进行比较,如果和var3相等,则将var5的值赋给var4,否则CAS失败。

        使用CAS可以保证原子性和可见性。使用CAS,当有多个线程对共享变量进行操作时,如果此时该变量已经被一个线程使用,则其他线程会进入阻塞等待,不断自旋重新尝试获取资源,知道该线程释放锁。这样就保证了一个共享变量原子操作 。

ABA问题

        对于这种情况,ThreadA想通过CAS将变量i=5改成i=3,我们都知道进行CAS时,都会于旧值进行比较看看是否相等,如果相等,cas会认为它没有被其他线程修改过。但是倘若ThreadB先将i=5改成了i=2,然后ThreadC又将i=2改回i=5,此时ThreadA在对i进行操作时,会认为它没有被修改过,这种情况下就出现了线程安全问题。

        因此Java中引用了原子引用类AtomicStampedReference<V>其中有一个stamp变量用于记录版本,每次修改可以通过+1保证版本唯一性。这样就解决了ABA问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏之翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值