1. 介绍

本文是我看了并发编程网“聊聊并发”系列文章的总结。查看完整原文地址点我查看

本文分别讨论intel处理器何java是如何实现原子操作的

2. 基本概念定义

3. 处理器实现原子操作的方法

对于内存读写1个字节就是一个原子操作。这些最基本的原子操作是由处理器本身来保证的。

处理器保证原子操作的方法主要是:

3.1 总线锁定

我们以i++为例,通过下图可以发现在多处理器的时候可能造成值错误。下图中两个CPU同时修改,则结果仍然为2而不是3.

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

缺点:总线锁定把CPU和内存之间通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大

总结:总线锁定就是在总线上发出信号使得只有自己一个人可以占用共享内存。

3.2 缓存锁保证原子性

定义:使用缓存一致性协议,避免同时修改被两个以上处理器缓存的内存区域数据。当其他处理器回写已被锁定的缓存行的数据时,会使得当前缓存行失效。

4. JAVA如何实现原子操作

JAVA实现原子操作按照出现时间来分可以分为两类:

  1. JAVA内置锁: synchronized关键字
  2. 并发包工具:Lock类、原子对象

从底层实现原理上来讲,以上两类都用到了一些相同的技术,其中比较重要的技术就是CAS。

JAVA的原子对象就用到了CAS。JAVA底层实现CAS还是比较麻烦的。不过我们可以利用原子对象提供的compareAndSet方法来利用CAS的特性。