我发现在 Java 中使用AtomicIntegers
,GetAndDecrement
比GetAndIncrement
. 为什么会这样?
问问题
190 次
2 回答
1
无论哪个第二个都更快。
AtomicInteger a = new AtomicInteger(1);
long start1 = System.nanoTime();
a.decrementAndGet();
System.out.println("Time: " + (System.nanoTime()-start1));
AtomicInteger b = new AtomicInteger(1);
long start2 = System.nanoTime();
a.incrementAndGet();
System.out.println("Time: " + (System.nanoTime()-start2));
在我的机器上,打印:
时间:49264
时间:4105
但是,如果我们交换两个操作的顺序:
AtomicInteger a = new AtomicInteger(1);
long start1 = System.nanoTime();
a.incrementAndGet();
System.out.println("Time: " + (System.nanoTime()-start1));
AtomicInteger b = new AtomicInteger(1);
long start2 = System.nanoTime();
a.decrementAndGet();
System.out.println("Time: " + (System.nanoTime()-start2));
然后我们得到:
时间:43106
时间:7697
大概 JVM 或处理器或其他东西正在做一些运行时优化。
于 2014-04-17T02:12:34.433 回答
-1
它们在我看来几乎一样——
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final int getAndDecrement() {
for (;;) {
int current = get();
int next = current - 1;
if (compareAndSet(current, next))
return current;
}
}
于 2014-04-17T00:24:31.723 回答