首先使用AtomicInteger安全检查

时间:2012-03-30 11:25:06

标签: java multithreading concurrency atomic

如何在AtomicInteger变量中执行“check-then-act”? 即什么是最安全/最好的方法来检查这种变量第一和inc / dec的值取决于结果?
例如。 (高级别)
if(count < VALUE) count++; //原子地使用AtomicInteger

2 个答案:

答案 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));
}