java同步银行帐户转帐

时间:2012-08-16 04:50:56

标签: java synchronization

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

    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的限制检查。我实际上担心是否不会使transferTo原子会导致问题(死锁)。这种情况的一个例子很棒。

3 个答案:

答案 0 :(得分:1)

除了使用double之外,我没有看到任何特殊问题,但你必须记住,transferTo不是原子的,可能会在以后引起问题。但是,您实际上正在使用锁。每个synchronized方法都隐式使用锁。

答案 1 :(得分:0)

您正在使用intrinsic lock

答案 2 :(得分:0)

只要将synchronized块放在适当的位置,就会使用锁定。在这种情况下,将通过正在修改的类对象获取锁定,这就是您的代码正常工作的原因。

但是你的transferTo方法可能无法正常工作,因为其中的两个操作都是同步的,而不是整个事务。

希望这有帮助!!!