java同步银行账户转账
我试图为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
的限制检查。我实际上担心是否不将原子转移到原子会导致问题(死锁)。这种情况的一个例子会很好。
除了采用双层,我看不出有任何特别的问题,但你必须记住的transferTo不是原子以后可能会导致问题。但是,您实际上正在使用锁。每个同步方法隐式使用一个锁。
您尽快使用锁你把块到位。在这种情况下,锁将通过正在修改的类对象获取,这就是您的代码工作正常的原因。
但是你transferTo
方法可能并不像这里面的操作都正常工作是同步的,但不是整个交易。
希望这有助于!
我实际上试图找出一种情况,其中不使transferTo方法原子化会导致问题。 – 2012-08-16 05:14:29
@user从概念上讲,这不是问题,因为在reallife中,这种交易不是原子的。如果你的用户期望它是原子的,这只是一个问题。另外,它实际上锁定了实例,而不是类对象(我认为Bharat错过了) – Antimony 2012-08-16 06:23:31
那么一个错误是在那里的单词'双'。 – Antimony 2012-08-16 04:57:14
为什么会出现双重问题? – 2012-08-16 05:15:45
如果你没有得出结果,你可以得到一个舍入误差,有些人认为这是不可接受的。使用'长'美分或'BigDecimal'是一个很好的选择。我发现在大多数情况下,结果是四舍五入的。 – 2012-08-16 05:18:56