如何使用AtomicInteger进行比较的情况

时间:2015-11-18 19:24:24

标签: java thread-safety atomic

我有一个AtomicInteger变量:

AtomicInteger aInteger = new AtomicInteger(0);

访问变量的其中一个线程需要检查其值并基于它来调用函数。这就是我的意思。

if(aInteger < maxAvailableConnectionSlots)
{
   aInteger.incrementAndGet();
   doSomething();
}
else
{
  doSomething2();
}

所以我的问题是如何才能使上述代码线程安全?

1 个答案:

答案 0 :(得分:0)

你可以这样做(未经测试):

do {
  prev = aInteger.get();
  next = prev + 1;
} while (prev < maxAvailableConnections && !aInteger.compareAndSet(prev, next));

boolean wasIncremented = prev < maxAvailableConnections;
if (wasIncremented) doSomething();
else doSomething2();

请注意,aInteger可能会在循环和if / else之间发生变化,但如果实际增加doSomething,则只会调用aInteger