AtomicInteger的实现主要是通过方法compareAndSet实现的,这个方法底层是调用了native的方法,下面看下这个方法。
public final boolean compareAndSet(int expect, int update)
这个方法第一个参数是expect,为原来的值。update为修改后的值。如果当前的值为expect,就修改为update的值,整个过程是一个原子操作。
那这个类是如何保证自增不冲突的呢,我们看一下具体的实现。
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
主要看getAndAddInt方法,这个方法是一个循环,先获取值,然后用原值去比较以及新增,如果新增失败了,再去获取值重试。这就是一个自旋锁,线程不释放资源一直重试,直到新增成功。