AtomicInteger.incrementAndGet线程安全吗?

pep*_*eps 2 java multithreading thread-safety

例如,如果我多次从多个线程和每个线程运行此代码,是否会有数据竞争?

   public boolean swap(int i, int j) {
    if (value.get(i) <= 0 || value.get(j) >= maxval) {
        return false;
    }
    value.decrementAndGet(i);
    value.incrementAndGet(j);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果我在这里使用decrementAndGet或getAndDecrement有什么区别吗?

这里的值是AtomicIntegerArray.我需要在不同的同步方法中进行性能测试.所以我在值中交换elemtents,看看输出总和是否与预期相同

我的任务是找到一个"不应该是DRF"但"必须仍然无死锁"的方法,并且比ReentrantLock快得多.所以我很难找到一种有数据竞争的方法......

Bor*_*der 9

是的,incrementAndGet是线程安全的.

incrementAndGet并且getAndIncrement++ivs 相同i++.即

int i = 0;
i++ // <- expression returns 0, i is now 1
++i // <- expression return 2, i is now 2
Run Code Online (Sandbox Code Playgroud)

同上decrement.

您的代码,但是,是不是您拨打线程get跨两次||if.所以价值可以value.get(i)和之间改变value.get(j),无论如何value.

  • @peps问题不仅仅是`if`:你有很多原子操作,没有任何同步; 它们中的每一个都将以原子方式执行,但它们的顺序不会.另一个线程可能会在任何这些原子操作之间插入并搞砸.当`value.get(i)`返回一些东西时,该返回值将是最新的和正确的.但是稍后,可能在此线程可以执行任何其他操作之前,它可能已经过时,因为另一个线程修改了该整数. (2认同)