50

当返回值不感兴趣时​​,当返回值被忽略时,AtomicInteger.getAndIncrement()和方法之间是否有任何(甚至在实践中不相关)区别?AtomicInteger.incrementAndGet()

我正在考虑哪些差异会更惯用,以及哪些会减少 CPU 缓存同步的负载,或者其他任何真正有助于决定哪个比扔硬币更合理使用的东西。

4

5 回答 5

36

由于没有给出实际问题的答案,因此这是我基于其他答案(感谢,赞成)和 Java 约定的个人意见:

incrementAndGet()

更好,因为方法名称应该以描述动作的动词开头,而这里的预期动作只是递增。

以动词开头是常见的 Java 约定,官方文档也有描述:

“方法应该是动词,混合大小写,首字母小写,每个内部单词的首字母大写。”

于 2013-03-01T09:29:22.307 回答
33

代码本质上是相同的,所以没关系:

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}
于 2013-02-28T13:58:11.443 回答
10

不,没有区别(如果您不关心返回值)。

这些方法的代码(在 OpenJDK 中)的不同之处在于一种用途return next和另一种用途return current

两者都compareAndSet在引擎盖下使用完全相同的算法。两者都需要知道旧值和新值。

于 2013-02-28T13:58:20.950 回答
6

只是想添加到现有的答案:可能会有非常小的不明显的差异。

如果您查看此实现

public final int getAndIncrement() {
    return unsafe.getAndAddInt(this, valueOffset, 1);
}

public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}

注意 - 两个函数调用完全相同的函数getAndAddInt,除了+1部分,这意味着在这个实现getAndIncrement中更快。

但是,这是较旧的实现

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

唯一的区别是返回变量,所以两个函数的执行完全相同。

于 2017-08-30T19:17:25.773 回答
-1

这里我举个例子。希望它能消除你的疑惑。

假设我有一个变量 i 作为

AtomicInteger i = new AtomicInteger();

在这种情况下:

i.getAndIncrement() <==> i++;

i.incrementAndGet() <==> ++i;

请查看以下程序

public class Test1
{   
    public static void main(String[] args) 
    {               
        AtomicInteger i = new AtomicInteger();
        System.out.println(i.incrementAndGet());  
        System.out.println(i);  

    }

}

**输出

1 1 =======================================**

public class Test2
{   
    public static void main(String[] args) 
    {               
        AtomicInteger i = new AtomicInteger();
        System.out.println(i.getAndIncrement());  
        System.out.println(i); 

    }

}

**输出

0 1 -------------**

注释: 1) 在Test1 类中,incrementAndGet() 将首先递增i 值,然后打印。

2) 在Test2 类中,getAndIncrement() 将首先打印i 值,然后递增。

就这样。

于 2017-06-02T10:31:58.207 回答