java同步银行账户转账

java同步银行账户转账,java,synchronization,Java,Synchronization,我试图为经典的银行账户转账问题编写同步代码。现在我正试图用解决方案来解决这个问题。在我在web上找到的任何解决方案中,传输方法都使用了两个锁,但我没有使用任何锁 class BankAccount { double balance; public void synchronized deposit(double amount) { balance+=amount; } public void s

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

    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()
有什么问题。请原谅在
余额
上遗漏了限额检查。事实上,我担心的是,如果不转移到atomic,是否会导致问题(死锁)。这种情况的一个例子会很好。

您正在使用。

除了使用double之外,我没有看到任何特殊的问题,不过您必须记住,转换为非原子可能会在以后导致问题。但是,实际上您正在使用锁。每个同步的方法都隐式地使用一个锁。

只要将
同步的
块放置到位,您就可以使用锁。在这种情况下,锁将通过正在修改的类对象获得,这就是代码工作正常的原因

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


希望这有帮助

其中一个错误是单词
double
。为什么double会有问题?如果不对结果进行四舍五入,可能会出现一些人无法接受的四舍五入错误。使用
long
cents或
BigDecimal
是一个不错的选择。我发现在大多数情况下,对结果进行四舍五入是您所需要的。我实际上是想找出一种情况,在这种情况下,不使transferTo方法原子化会导致问题。@从概念上讲,这不是问题,因为在现实生活中,这样的事务不是原子的。只有当你的用户希望它是原子的时候,这才是一个问题。另外,它实际上是锁定实例,而不是类对象(我认为Bharat错了)