原子变量类比锁的粒度更加细,量级更轻,并且对于在多处理器系统上实现高性能的并发代码来说非常关键。
原子标量类可以分为4组:标量类、更新器类、数组类以及复合变量类。最常用的就是原子变量累计就是标量类:AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference。
其实原子变量类就是一种”更好的volatile”。
下面我通过分析AtomicInteger来解析一下原子变量类的原理:
AtomicInteger
AtomicInteger是一个支持原子操作的Integer类,就是保证对AtomicInteger类型变量 的增加和减少是原子性的,不会在多个线程之间出现数据不一致的问题。如果不使用AtomicInteger,要实现一个按顺序获取的 ID,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样的 ID 的现象。但是加锁是一个非常耗时的操作。
下面通过看源码来分析AtomicInteger是如何实现原子操作的。
1. 重要属性域
在源码中我们发现首先是获取Unsafe类对象来加载Value在内存中的位置。源码如下:
//获取unsafe类
private static final Unsafe unsafe = Unsafe.getUnsafe();
//value在内存中的位置