常見的原子類:
- 基本類:
AtomicInteger、AtomicLong、AtomicBoolean; - 引用類型:
AtomicReference、AtomicReference的ABA實例、AtomicStampedRerence、AtomicMarkableReference; - 數組類型:
AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray - 屬性原子修改器(Updater):
AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
本節介紹:AtomicBoolean類
1.首先維護了一個volatile的value,保證線程可見
private volatile int value;
2.get方法
public final boolean get() {
return value != 0;
}
3.getAndSet
/**
* Atomically sets to the given value and returns the previous value.
*
* @param newValue the new value
* @return the previous value
*/
public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get();
} while (!compareAndSet(prev, newValue));
return prev;
}
4.compareAndSet
/**
* Atomically sets the value to the given updated value
* if the current value {@code ==} the expected value.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public final boolean compareAndSet(boolean expect, boolean update) {
int e = expect ? 1 : 0;
int u = update ? 1 : 0;
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}
5.set
/**
* Unconditionally sets to the given value.
*
* @param newValue the new value
*/
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
由此可見,原子類底層使用的是unsafe類的CAS來控制原子操作的,如果CAS失敗則一直嘗試。而且value使用volatile保證多線程可見性。