Java银行帐户同步示例。无法了解解决方案的工作原理

时间:2012-04-16 21:49:53

标签: java synchronization account bank

http://i.stack.imgur.com/D01ja.png

所以,我正在阅读有关同步的PDF文件,其中显示了上述示例问题。稍后,提出以下内容,可能是一个解决方案:

class Account
{
  private double balance;
  public Account(double initialDeposit) {
    balance = initialDeposit;
  }
  public synchronized double getBalance() {
    return balance;
  }
  public synchronized void setBalance(double newBalance) {
    balance = newBalance;
  }
  public synchronized void deposit (double amt) {
   //essentially still multiple steps when in bytecode!
   balance += amt;
  }

我不明白这是如何解决这个问题的。也许这不是预期的,但似乎暗示了。我正在寻找一些关于它是否存在的确认。 }

3 个答案:

答案 0 :(得分:3)

synchronized关键字确保两个线程无法同时进入[同一对象]的同步块。

在您的情况下,不能同时在同一个对象上调用3个方法,因为每个方法在调用时都会对this保持锁定。

所以,balance += amt;不是原子的 - 它是同步的,因此在评估这个陈述期间,状态不可能发生变化。

答案 1 :(得分:1)

使用synchronized关键字的意义在于,一次只有一个线程可以访问该方法,并且图像上的架构变得不可能。

但是如下所述,setBalance方法的存在可以滥用类并获得不需要的输出。

答案 2 :(得分:0)

如果PDF提出最终解决方案,因为它完全无法解决显示图像的问题,我会感到惊讶! 也许它会向你展示一个天真的尝试来解决问题,通过一点点喷涂同步关键词?

我会继续阅读您的PDF - 并发布您的发现!