2015-04-22 82 views
0

我有一个的AtomicBoolean并要设置它,如果其他条件也是如此:如何在设置AtomicBoolean之前检查另一个条件?

例如,我们有与活动Saldo领域的BankAccount。在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(); 
} 

什么是与原子能一个正确的解决方案, 是这甚至可能不使用锁吗?

+0

算法有什么问题?对我来说似乎没问题。 –

+3

请参阅AtomicStampedReference。允许您轻松地将两个值放在一个原子中。或者,只需使用包含布尔值和双精度的对象的AtomicReference。 – jtahlborn

+0

@jtahlborn谢谢!这是正确的方向。通过AtomicMarkableReference,可以检查两个值(Double和Boolean)。 – cansik

回答

0

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

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

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

的saldo字段现在不仅代表当前saldo,而且银行账户的状态。

相关问题