atomicInteger.getAndIncrement()
记录今天遇到的一个小问题:
AtomicInteger atomicInteger = new AtomicInteger();
System.out.println(atomicInteger.getAndIncrement());
大家可以先猜想一下这个输出的是几,我之前一直以为是1,但是今天发现好像并不是。它是0。
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 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;
}
可以发现它只是将原先的值进行了一个加1,但是返回的加1之前的值。那如果想要返回相加之后的值,应该调用,如下方法。
AtomicInteger atomicInteger = new AtomicInteger();
System.out.println(atomicInteger.incrementAndGet());
底层:
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;
}
可以发现这个才是返回后相加的值。
@Test
public void testSelect1(){
AtomicInteger atomicInteger = new AtomicInteger();
System.out.println("atomicInteger.getAndIncrement():"+atomicInteger.getAndIncrement());
System.out.println("atomicInteger.incrementAndGet():"+atomicInteger.incrementAndGet());
}
控制台输出:


浙公网安备 33010602011771号