Java AtomicInteger.incrementAndGet线程安全吗?

Java AtomicInteger.incrementAndGet线程安全吗?,java,multithreading,thread-safety,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; } 公共布尔交换

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

   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;
}
公共布尔交换(int i,int j){
if(value.get(i)=maxval){
返回false;
}
值。递减和获取(i);
value.incrementAndGet(j);
返回true;
}
顺便问一下,如果我在这里使用decrementAndGet或GetAndDecrety,有什么区别吗

这里的值是一个原子整数数组。我需要在不同的同步方法之间进行性能测试。所以我交换元素的值,看看输出的总和是否与预期的相同


我的任务是找到一个“不应该是DRF”,但“必须仍然是无死锁”的方法,并且比ReentrantLock快得多。因此,我很难找到一个有数据竞争的方法…

是的;
原子*
类上的所有方法都是线程安全的


decrementAndGet()
getAndDecrement()
之间的区别在于它返回的值。

是的,
incrementAndGet
是线程安全的

incrementAndGet
getAndIncrement
++i
vs
i++
相同。即

int i = 0;
i++ // <- expression returns 0, i is now 1
++i // <- expression return 2, i is now 2
inti=0;

i++/如上所述,
AtomicInteger
的所有方法都是线程安全的

是否会有潜在的数据竞争

技术上是的,会有一场数据竞赛,因为

  • 在计算逻辑表达式时调用
    get
    两次
  • AtomicInteger
    是线程安全的”
    意味着每个线程调用例如
    value.decrementAndGet(i)
    (以及所有其他基于CAS的方法)最终将成功完成此操作无其他保证

使用线程安全类不足以防止数据争用。另外,我想指出的是,数据竞争并不总是坏事,有时它实际上是可以接受的。

您的代码实际上没有任何意义;不存在这样的方法。
值是多少?这个问题似乎暗示它是一个
AtomicInteger
,但它没有
get(int)
decrementAndGet(int)
、或
incrementAndGet(int)
方法,只有没有任何参数的同名方法。
Atomic*
方法是线程安全的,但OP对它们的使用是不安全的。我认为后者被问到了(尽管有标题),但即使没有,至少不提它也是疏忽大意。哪一部分没有编译?注意编辑
value
是一个
AtomicIntegerArray
,而不是一个
AtomicInteger
。它是否有可能传递不应该传递的if语句?抱歉,我的英语不好:)@peps问题不仅仅是
if
:你有很多原子操作没有任何同步;它们中的每一个都将以原子方式执行,但它们的顺序不会。在这些原子操作之间,另一条线可能会打断,把事情搞得一团糟。当
value.get(i)
返回某个内容时,该返回值将是最新且正确的。但是过了一会儿,可能在这个线程可以做任何其他事情之前,它可能已经过时了,因为另一个线程修改了这个整数