如何在设置 AtomicBoolean 之前检查另一个条件?
How to check another condition before set AtomicBoolean?
我有一个 AtomicBoolean 并且想要设置它,如果另一个条件也为真:
例如,我们有一个带有 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();
}
什么是原子学和
这甚至可以不使用锁吗?
检查另一个条件并设置布尔值的一种可能方法是使用 AtomicMarkableReference。我是类型 Double:
的示例
private final AtomicMarkableReference<Double> saldo = new AtomicMarkableReference<>(0.0, true);
@Override
public boolean setInctive() {
return saldo.attemptMark(0.0, false);
}
saldo 字段现在不仅代表当前saldo,还代表银行账户的状态。
我有一个 AtomicBoolean 并且想要设置它,如果另一个条件也为真:
例如,我们有一个带有 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();
}
什么是原子学和 这甚至可以不使用锁吗?
检查另一个条件并设置布尔值的一种可能方法是使用 AtomicMarkableReference。我是类型 Double:
的示例private final AtomicMarkableReference<Double> saldo = new AtomicMarkableReference<>(0.0, true);
@Override
public boolean setInctive() {
return saldo.attemptMark(0.0, false);
}
saldo 字段现在不仅代表当前saldo,还代表银行账户的状态。