Atomic原子类,可以对相应的操作执行原子操作。主要分为以下几种:
1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;
2. 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;
3. 引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;
4. 对象的属性修改类型: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 。
本文只分析基本类型。
AtomicInteger类与其他几个原子类实现方式类似,只分析其源码
1 类变量&常量
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static { //通过Unsafe操作,得到value值,赋给valueOffset
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value; //volatile类型,表示“值”
2 构造方法
public AtomicInteger() {
}
//有初始值的构造方法
public AtomicInteger(int initialValue) {
value = initialValue;
}
3 重要方法
3.1 get方法,final类型,返回value值
public final int get() {
return value;
}
3.2 set方法,final类型,设置value值
public final void set(int newValue) {
value = newValue;
}
3.3 lazySet方法,最后设置为给定值。延时设置变量值,这个等价于set()方法,但
是由于字段是volatile类型的,因此此字段的修改会比普通字段(非volatile字段)有
稍微的性能延时(尽管可以忽略),所以如果不是想立即读取设置的新值,允许在“后台
”修改值,那么此方法就很有用。
public final void lazySet(int newValue) {
unsafe.putOrderedInt(this, valueOffset, newValue);
}
3.4 getAndSet方法,以原子方式设置当前value值,并返回旧值
public final int getAndSet(int newValue) {
return unsafe.getAndSetInt(this, valueOffset, newValue);
}
3.5 compareAndSet方法,以原子方式实现比较valueOffset和expect的值,若相等则
用update来替换valueOffset的值;否则直接返回不修改
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
3.6 与compareAndSwapInt类似
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
3.7 getAndIncrement方法,以原子方式实现将valueOffset+1,返回旧值
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
3.8 getAndDecrement方法,以原子方式实现将valueOffset-1,返回旧值
public final int getAndDecrement方法() {
return unsafe.getAndAddInt(this, valueOffset, -1);
}
3.9 getAndAdd,以原子方式实现将valueOffset+delta,返回旧值
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
3.10 incrementAndGet方法,原子性的将当前值加1后,返回新值
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
3.11 decrementAndGet,以原子方式实现将valueOffset-1,返回新值
public final int decrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
}
3.12 addAndGet方法,以原子方式实现将valueOffset+delta,返回新值
public final int addAndGet(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
}
3.13 intValue方法,返回当前value值
public int intValue() {
return get();
}
“`