并发之原子操作实现原理

443 阅读2分钟

一:原子操作的原理:

 原子意味着不可分割,而原子操作为不可被中断的一个或一系列操作。在多处理器上原子操作优点复杂,让我们来一起
 探究一下Intel处理器和Java是如何实现原子操作的。
 

二:了解原子操作之前的需要了解一些原理

image.png

三:处理器如何实现原子操作

首先处理器对于一个字节的的操作是原子性的,比如一个处理器在操作一个字节的时候,其他处理器无法对其更改。

1.总线锁:

总线锁是处理器保证多处理器下原子性的一种方式,其只要原理为当一个请求正在操作缓存行和内内存中的数据时,另外一个处理器也要操作这个数据,那么处理器就会使其他处理器阻塞,等当前处理器操作完了之后才到恢复运行。

   注:通过这种方式可以让当前操作数据的处理器独享内存,这点也是它的缺点,其他不操作本数据的处
       理器也会被阻塞,效率不高。

2. 缓存锁:

频繁使用的内存会缓存在处理器的L1,L2,L3高速缓存中,那么原子操作就可以直接在高速缓存中进行,基于缓存一致性原则,会给缓存行加锁,当一个处理器在处理缓存行中数据时,不允许其他处理器同时缓存当前数据,也就是其他处理器回写锁定的缓存行中数据时,其他处理器的缓存行会失效。

四:Java如何实现原子操作:

通过锁和循环CAS实现

1.循环CAS:循环CAS基于CAS算法,内存中数据与预期值进行比较,相同则进行更改

比如:原子类Automic

缺点:ABA问题,循环时间开销过大造成资源浪费,只能保证一个共享变量的原子性

  1. 锁:Java的锁机制也是解决原子操作的方式,比如偏向锁,轻量级,重量级,不过有意思的是Java的锁除了偏向锁都使用了CAS循环机制实现获取锁和释放锁