多线程---CAS

比较交换,不会真正阻塞线程,不断尝试更新。(乐观锁的一种实现方式)假设当前主内存中的值为V,工作内存中的值为A,当前线程要修改的值为B。
摘要由CSDN通过智能技术生成

CAS(Compare and Swap ):

比较交换,不会真正阻塞线程,不断尝试更新。(乐观锁的一种实现方式)

假设当前主内存中的值为 V,工作内存中的值为 A,当前线程要修改的值为 B。

// address 主内存的值
// expectValue 工作内存的值
// swapValue 当前的值
boolean CAS(address, expectValue, swapValue) { 
     if (address == expectedValue) {
            address = swapValue;
            return true;
       }
       return false; 
}

CAS的操作流程如下:

1.比较内存中的值 V 和当前工作内存的值 A 是否相等。

2.若相等,可以认为当前主内存的值没有被修改,当前线程就将值 B 写回主内存。

3.若不相等,说明当前线程的值A已经过时了(主内存已经发生了变化),将当前主内存的最新值 V 保存到当前工作内存中,此时无法将 B 写回主内存,继续循环。

CAS 是怎么实现的?

针对不同的操作系统, JVM 用到了不同的 CAS 实现原理,简单来讲:
        1).java 的 CAS 利用的的是 unsafe 这个类提供的 CAS 操作;
        2).unsafe 的 CAS 依赖了的是 jvm 针对不同的操作系统实现的 Atomic::cmpxchg
        3).Atomic::cmpxchg 的实现使用了汇编的 CAS 操作,并使用 cpu 硬件提供的 lock 机制保证其原子性。
简而言之,是因为 硬件予以了支持,软件层面才能做到

CAS的应用

1) 实现原子类

标准库中提供了 java.util.concurrent.atomic
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值