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