如何在设置AtomicBoolean之前检查另一个条件?

时间:2015-04-22 16:22:27

标签: java multithreading thread-safety atomic

我有一个AtomicBoolean并且想要设置它,如果另一个条件也是如此:

例如,我们有一个bankaccount,其中包含 Active Saldo 字段。在setInctive方法中,我必须检查 Saldo 字段是否正好为零,然后将 Active 字段设置为false。

这是我的解决方案,但我不确定这是否真的有效!

private final AtomicBoolean active = new AtomicBoolean(true);
private final AtomicReference<Double> saldo = new AtomicReference<>(0.0);

@Override
public boolean setInctive() {
    //First: check if saldo is 0.0
    //Second: set active to false

    saldo.getAndUpdate(aDouble ->  {
        if(aDouble == 0)
            active.set(false);

        return aDouble;
    });

    //return negated value of the active field
    return !active.get();
}

什么是原子和正确的解决方案 这甚至可以在不使用锁的情况下实现吗?

1 个答案:

答案 0 :(得分:0)

一种可能的方法来检查另一个条件并设置一个布尔值,就是使用AtomicMarkableReference。我的类型是 Double 的例子:

private final AtomicMarkableReference<Double> saldo = new AtomicMarkableReference<>(0.0, true);

@Override
public boolean setInctive() {
    return saldo.attemptMark(0.0, false);
}

saldo字段现在不仅代表当前的saldo,还代表银行帐户的状态。