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
vsi++
相同。即
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)
返回某个内容时,该返回值将是最新且正确的。但是过了一会儿,可能在这个线程可以做任何其他事情之前,它可能已经过时了,因为另一个线程修改了这个整数