AtomicInteger:保持非负面

时间:2014-10-24 06:46:56

标签: java concurrency atomicity

有没有办法用AtomicInteger执行“如果结果为正或零”操作的“递减”? 澄清所需的行为:

  • 如果当前值大于零,则递减
  • 如果当前值等于零,则不执行任何操作
  • (未处理负电流值)

3 个答案:

答案 0 :(得分:13)

在Java 8中,yes

atomicInteger.updateAndGet(i -> i > 0 ? i - 1 : i); 

在Java 8之前,no

答案 1 :(得分:3)

我想你可以做一些类似于Java 8之前的事情:

int val = atomicInt.get();
boolean success = false;
while(val > 0 && !success) {
    success = atomicInt.compareAndSet(val, val - 1);
    if(!success) {
        // Try again if the value is still > 0
        val = atomicInt.get();
    }
}
// Check 'success' to see if it worked

不是最优雅的代码,但我认为它可以解决问题。

答案 2 :(得分:0)

感谢@JB Nizet。

要知道更新是否成功:

    AtomicBoolean isUpdateSuccessful = new AtomicBoolean(false);
    atomicInteger.updateAndGet( i -> {
        if( i > 0 ) {

            isUpdateSuccessful.getAndSet(true);
            return i - 1;
        } else {

            isUpdateSuccessful.getAndSet(false);
            return i;
        }
    });