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

キーワードは、synchronized2 つのスレッドが [同じオブジェクト上の] 同期ブロックに同時に入ることができないようにすることです。

あなたの場合、3 つのメソッドを同じオブジェクトで同時に呼び出すことはできません。これはthis、呼び出されたときにそれぞれがロックを保持しているためです。

それにもかかわらず、balance += amt;アトミックではありません。同期されているため、このステートメントの評価中に状態が変化することはありません。

于 2012-04-16T21:53:52.180 に答える
1

synchronized キーワードを使用するポイントは、一度に 1 つのスレッドのみがメソッドにアクセスでき、イメージのスキーマが不可能になることです。

ただし、以下で説明するように、setBalance メソッドが存在すると、クラスを悪用して望ましくない出力を取得する可能性があります。

于 2012-04-16T21:54:41.623 に答える
0

あなたの画像に表示されている問題を完全に解決できないため、PDFが最終的な解決策としてそれを提案している場合、私は驚くでしょう! たぶん、同期されたキーワードを少しスプレーすることで、問題を解決しようとする素朴な試みを示しているのでしょうか?

私はあなたのPDFを読み続けます-そしてあなたの発見を投稿してください!

于 2012-04-16T22:39:39.747 に答える