java多线程(七)---原子操作的实现原理

2019-02-09  本文已影响204人  brock

原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。

1 CPU术语定义

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

2 处理器如何实现原子操作

2.1 使用总线锁保证原子性

所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存

2.2 使用缓存所保证原子性

3 Java如何实现原子性

在Java中可以通过循环CAS的方式来实现原子操作。

3.1 使用循环CAS实现原子操作

3.2 CAS实现原子操作的三大问题

ABA问题,循环时间长开销大,以及只能保证一个共享变量的原子操作。

3.2.1 ABA问题

public boolean compareAndSet(
           V          expectedReference,         // 预期引用
           V          newReference,              // 更新后的引用
           int         expectedStamp,            // 预期标志
           int         newStamp                  // 更新后的标志
)

3.2.2 循环时间长开销大

3.2.3 只能保证一个共享变量的原子操作

4 使用锁机制实现原子操作

参考

《java并发编程的艺术》

上一篇下一篇

猜你喜欢

热点阅读