本文共 673 字,大约阅读时间需要 2 分钟。
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方法,这个方法是一个循环,先获取值,然后用原值去比较以及新增,如果新增失败了,再去获取值重试。这就是一个自旋锁,线程不释放资源一直重试,直到新增成功。
转载地址:http://hsjqi.baihongyu.com/