定义
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
实现了序列号接口,编码时最好手动生成序列ID,让javac编译器生成开销大,而且可能造成意想不到的状况。
变量声明
private volatile int value;
public final int get() {
return value;
}
变量是private修饰,防止外部修改。volatile保证多线程下的可见性。底层实现是内存栅栏,保证每次取到的都是最新值;
final类型方法,不可继承,进一步保证线程安全。
自减:
/**
* Atomically decrements by one the current value.
*
* @return the previous value
*/
public final int getAndDecrement() {
for (;;) {
int current = get();
int next = current - 1;
if (compareAndSet(current, next))
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
for(;;)是一个死循环,是采用忙等(也叫自旋)的方式不断地尝试(乐观锁) -1操作,直到成功才退出。
compareAndSet方法,传入当前值和新值。该方法利用JNI调用底层其他语言实现,利用操作系统提供的CAS(只要当前值和原来值不一致,就重新取值,直到成功)来保证原子性。