Java中原子操作的实现原理

Java中原子操作的实现原理

Java中原子操作的实现原理

原子操作就是不可被中断的一个或一系列操作,看看Java是怎么实现原子操作的。

CPU实现原子操作

处理器通过对总线加锁或者缓存行加锁的方式实现多个处理器之间的原子操作。

  1. 通过对总线加锁实现原子性,现在都是多处理器,对于共享变量的读写操作,如果不加限制,可导致数据的不一致,比如处理器把值改成A,另外的处理器又把值改成B,导致不是我们需要的结果。为了解决这个问题,处理器可以使用总线锁,当一个处理器锁住总线的时候,其他处理器处于阻塞状态。这样能解决问题,但是代价是很大的。
  2. 通过对缓存行加锁实现原子性,为了保证原子性,在同一时间,只要保证对于某个内存地址的原子操作即可。缓存一致性机制阻止同时修改由两个及以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行数据时,会使缓存行无效。

Java的原子操作

Java使用锁机制和CAS来实现原子操作。

  1. 锁机制实现原子操作,JVM内部实现了很多锁,比如偏向锁,轻量级锁,重量级锁和互斥锁。
  2. CAS来实现原子操作,实现原理就是通过循环执行CAS操作直到成功为止。Java的并发包中提供了一些Atomic类来支持原子操作。其实CAS操作有些问题,比如ABA问题,循环时间长和共享变了的原子操作。1)ABA问题,可以通过AtomicStampedReference类解决,思路就是加版本号或者时间戳。2)共享变了的原子操作。CAS可以实现一个变量的原子操作,但是不能保证多个共享变量的原子操作。自从Java 1.5起,提供了一个AtomicReference类来实现对象之间的原子性,多个共享变量可以放到一个对象里面实现原子性。

每天都要进步一点点,哪怕一丁点......


分享到:


相關文章: