2012-08-16 161 views
0

我试图为BankAccount转账的经典问题编写同步代码。现在我正试图找出解决方案的问题。在网络上找到的任何解决方案中,传输方法使用了两个锁,但我没有使用任何锁。java同步银行账户转账

class BankAccount 
    { 
     double balance; 

     public void synchronized deposit(double amount) 
     { 
      balance+=amount; 
     } 

     public void synchronized withdraw(double amount) 
     { 
     balance-=amount; 
     } 

     public void transferTo(BankAccount b, double amount) 
     { 
      this.withdraw(amount); 
      b.deposit(amount); 

     } 
    } 

请告诉我可能是transferTo()的问题。请原谅,请注意balance的限制检查。我实际上担心是否不将原子转移到原子会导致问题(死锁)。这种情况的一个例子会很好。

+0

那么一个错误是在那里的单词'双'。 – Antimony 2012-08-16 04:57:14

+0

为什么会出现双重问题? – 2012-08-16 05:15:45

+0

如果你没有得出结果,你可以得到一个舍入误差,有些人认为这是不可接受的。使用'长'美分或'BigDecimal'是一个很好的选择。我发现在大多数情况下,结果是四舍五入的。 – 2012-08-16 05:18:56

回答

1

除了采用双层,我看不出有任何特别的问题,但你必须记住的transferTo不是原子以后可能会导致问题。但是,您实际上正在使用锁。每个同步方法隐式使用一个锁。

0

您尽快使用锁你把​​块到位。在这种情况下,锁将通过正在修改的类对象获取,这就是您的代码工作正常的原因。

但是你transferTo方法可能并不像这里面的操作都正常工作是同步的,但不是整个交易。

希望这有助于!

+0

我实际上试图找出一种情况,其中不使transferTo方法原子化会导致问题。 – 2012-08-16 05:14:29

+0

@user从概念上讲,这不是问题,因为在reallife中,这种交易不是原子的。如果你的用户期望它是原子的,这只是一个问题。另外,它实际上锁定了实例,而不是类对象(我认为Bharat错过了) – Antimony 2012-08-16 06:23:31