2

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;
  }

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

4

3 回答 3

3

synchronized关键字是确保两个线程不能同时进入同步块[在同一个对象上] 。

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

因此,尽管如此,balance += amt;它不是原子的 - 它是同步的,因此在评估此语句期间状态不可能发生变化。

于 2012-04-16T21:53:52.180 回答
1

使用 synchronized 关键字的要点是一次只有一个线程可以访问该方法,并且图像上的模式变得不可能。

但正如下面所讨论的,setBalance 方法的存在使得滥用类并获得不希望的输出成为可能。

于 2012-04-16T21:54:41.623 回答
0

如果 PDF 提议将其作为最终解决方案,我会感到惊讶,因为它完全无法解决您的图像显示的问题!也许它向您展示了一种天真的尝试来解决问题,通过喷洒同步关键字来解决问题?

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

于 2012-04-16T22:39:39.747 回答