0

我发现在 Java 中使用AtomicIntegers,GetAndDecrementGetAndIncrement. 为什么会这样?

4

2 回答 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 回答