public class AtomicInteger extends Number implements java.io.Serializable
AtomicInteger继承了Number类实现了序列化接口,它的意义在对它的操作是原子性的,也就是说是线程安全的。它是如何实现原子操作的呢?
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
它使用了Unsafe类,此类调用的是JNI接口去实现原子操作,此类只信任可信的类使用,当然有例外情况,这里不多做说明。上述代码中valueOffset会保存当前value的内存地址,具体操作时会调用Unsafe.compareAndSwapIn方法进行内存的CAS操作。CAS的基本原则是,修改内存值需要三个参数,当前值、预期值、修改值,当且仅当当前值和预期值相等,才会去修改内存值。