Atomic位于java.util.concurrent包中,可以简化多线程编程:
- 无锁,但是保证线程安全;
- 适用于计数器,累加器等。
Atomic原理:
无锁,使用CAS(compare and swap)来保证线程安全。
Atomic原子类:
基本类型
- AtomicInteger
- AtomicLong
- AtomicBoolean
数组类型 - AtomicIntegerArray
- AtomicLongArray
- AtomicReferenceArray
引用类型 - AtomicReference
- AtomicStampedReference
- AtomicMarkableReference
常用的API:
以AtomicInteger为例:
/**
* Atomically increments by one the current value.
*
* @return the updated value
*/
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);
// compareAndSwap(),如果当前值是v,则设置新值v+delta,返回true;否则返回false。
} while (!compareAndSwapInt(o, offset, v, v + delta));
return v;
}
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}