例如,如果我从多个线程和每个线程多次运行此代码,是否可能会出现数据争用?
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;
}
顺便说一句,如果我在这里使用 decrementAndGet 或 getAndDecrement 有什么区别吗?
这里的值是一个 AtomicIntegerArray。我需要在不同的同步方法之间进行性能测试。因此,我交换元素的值,看看输出总和是否与预期相同
我的任务是找到一种“不应该是DRF”,但“仍然必须无死锁”的方法,并且比ReentrantLock快得多。所以我很难找到一种具有数据竞争的方法......
是的incrementAndGet
是线程安全的。
incrementAndGet
and getAndIncrement
与++i
vs i++
. I.e.
int i = 0;
i++ // <- expression returns 0, i is now 1
++i // <- expression return 2, i is now 2
同上decrement
.
然而,你的代码是not正如你所说的线程安全get
两次跨越||
in the if
。所以价值could之间改变value.get(i)
and value.get(j)
, 任何value
is.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)