0

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

    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 原子化是否会导致问题(死锁)。这种情况的一个例子会很好。

4

3 回答 3

1

除了使用 double 之外,我没有看到任何特别的问题,尽管您必须记住 transferTo 不是原子的可能会在以后导致问题。但是,您实际上是在使用锁。每个同步方法都隐式使用锁。

于 2012-08-16T04:56:47.533 回答
0

您正在使用内部锁

于 2012-08-16T04:56:07.367 回答
0

一旦你把synchronized块放在适当的位置,你就在使用锁。在这种情况下,将在正在修改的类对象上获取锁,这就是您的代码可以正常工作的原因。

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

希望这可以帮助!!!

于 2012-08-16T04:58:02.510 回答