当返回值不感兴趣时,当返回值被忽略时,AtomicInteger.getAndIncrement()
和方法之间是否有任何(甚至在实践中不相关)区别?AtomicInteger.incrementAndGet()
我正在考虑哪些差异会更惯用,以及哪些会减少 CPU 缓存同步的负载,或者其他任何真正有助于决定哪个比扔硬币更合理使用的东西。
当返回值不感兴趣时,当返回值被忽略时,AtomicInteger.getAndIncrement()
和方法之间是否有任何(甚至在实践中不相关)区别?AtomicInteger.incrementAndGet()
我正在考虑哪些差异会更惯用,以及哪些会减少 CPU 缓存同步的负载,或者其他任何真正有助于决定哪个比扔硬币更合理使用的东西。
由于没有给出实际问题的答案,因此这是我基于其他答案(感谢,赞成)和 Java 约定的个人意见:
incrementAndGet()
更好,因为方法名称应该以描述动作的动词开头,而这里的预期动作只是递增。
以动词开头是常见的 Java 约定,官方文档也有描述:
代码本质上是相同的,所以没关系:
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;
}
}
不,没有区别(如果您不关心返回值)。
这些方法的代码(在 OpenJDK 中)的不同之处仅在于一种用途return next
和另一种用途return current
。
两者都compareAndSet
在引擎盖下使用完全相同的算法。两者都需要知道旧值和新值。
只是想添加到现有的答案:可能会有非常小的不明显的差异。
如果您查看此实现:
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;
}
}
唯一的区别是返回变量,所以两个函数的执行完全相同。
这里我举个例子。希望它能消除你的疑惑。
假设我有一个变量 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 值,然后递增。
就这样。