我有一个AtomicInteger变量:
AtomicInteger aInteger = new AtomicInteger(0);
访问变量的其中一个线程需要检查其值并基于它来调用函数。这就是我的意思。
if(aInteger < maxAvailableConnectionSlots)
{
aInteger.incrementAndGet();
doSomething();
}
else
{
doSomething2();
}
所以我的问题是如何才能使上述代码线程安全?
答案 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
。