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());
    }

控制台输出:

 

posted @ 2022-09-22 14:49  小猪不会叫  阅读(152)  评论(0)    收藏  举报  来源