我尝试为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原子会导致问题(死锁)。这种情况的一个例子很棒。
答案 0 :(得分:1)
除了使用double之外,我没有看到任何特殊问题,但你必须记住,transferTo不是原子的,可能会在以后引起问题。但是,您实际上正在使用锁。每个synchronized方法都隐式使用锁。
答案 1 :(得分:0)
您正在使用intrinsic lock。
答案 2 :(得分:0)
只要将synchronized
块放在适当的位置,就会使用锁定。在这种情况下,将通过正在修改的类对象获取锁定,这就是您的代码正常工作的原因。
但是你的transferTo
方法可能无法正常工作,因为其中的两个操作都是同步的,而不是整个事务。
希望这有帮助!!!