【搞定Java并发编程】第9篇:CAS详解

本文详细介绍了CAS(Compare And Swap)算法,解释了CAS的基本概念、3个操作数,以及Java如何借助处理器和自旋CAS实现原子操作。通过对AtomicInteger的源码解析,展示了CAS如何保证原子性,最后探讨了CAS的ABA问题和相关优化策略。
摘要由CSDN通过智能技术生成

上一篇:volatile关键字详解:https://blog.csdn.net/pcwl1206/article/details/84881395

目  录

一、CAS基本概念

1.1、CAS的定义

1.2、CAS的3个操作数 

二、Java如何实现原子操作

2.1、相关概念

2.2、处理器如何实现原子操作

2.3、Java如何实现原子操作

三、原子变量

四、AtomicInteger源码解析

五、模拟CAS算法


我们在上篇文章 volatile 关键字的讲解中提到:volatile 不能保证变量状态的“原子性操作”。

所谓的原子性就是:一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉

在Java基础系列文章中有一篇关于: i++ 和 ++i 详解的文章,因为 i++操作不具有原子性。

今天我们就来讲解Java提供的一种原子性的操作算法:CAS算法。先把CAS的关键概念列举出来,后文再具体讲解Java是如何实现其原子操作的。

一、CAS基本概念

1.1、CAS的定义

CAS(Compare  And  Swap):是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。

CAS是一种无锁的非阻塞算法的实现。

1.2、CAS的3个操作数 

CAS包含了3个操作数:

1、内存值:需要读写的内存值V;

2、预估值:进行比较的值A,即内存中的旧值;

3、更新值:拟写入的新值B。

  • 当且仅当 V = A 时,CAS通过原子方式用新值 B 来更新 V 的值,否则不会执行任何操作。

二、Java如何实现原子操作

本小节内容参考:https://blog.csdn.net/a724888/article/details/60871077

2.1、相关概念

  • 原子和原子操作

原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。下文中会讲解在Inter处理器和Java里是如何实现原子操作的。

  • 相关术语
术语名称 英文名称 解释
缓存行 Cache line 缓存的最小操作单位
比较并交换 Compare and Swap CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换
CPU流水线 CPU pipeline CPU流水线的工作方式就象工业生产上的装配流水线,在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5~6步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度
内存顺序冲突 Memory order violation 内存顺序冲突一般是由假共享引起,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线

2.2、处理器如何实现原子操作

32位 IA-32 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值