如何在AtomicInteger
变量中执行“check-then-act”?
即什么是最安全/最好的方法来检查这种变量第一和inc / dec的值取决于结果?
例如。 (高级别)
if(count < VALUE) count++;
//原子地使用AtomicInteger
答案 0 :(得分:10)
你需要写一个循环。假设count
是您的AtomicInteger
引用,您可以编写如下内容:
while(true)
{
final int oldCount = count.get();
if(oldCount >= VALUE)
break;
if(count.compareAndSet(oldCount, oldCount + 1))
break;
}
上述情况将循环,直到:(1)您的if(count < VALUE)
条件不满意;或(2)count
成功递增。使用compareAndSet
执行递增可以保证{I} count
的值在我们设置其新值时仍然是oldCount
(因此仍然小于VALUE
)。
答案 1 :(得分:0)
如果你正在使用Java 8,你可以像这样解决它。它是线程安全的,并且是以原子方式执行的。
AtomicInteger counter = new AtomicInteger();
static final int COUNT = 10;
public int incrementUntilLimitReached() {
return counter.getAndUpdate((n -> (n < COUNT) ? n + 1 : n));
}