上一篇:volatile关键字详解:https://blog.csdn.net/pcwl1206/article/details/84881395
目 录:
我们在上篇文章 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 处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。