0

次の実行ステートメントを検討してください。

(1) スレッド A: 特定のロック状態をチェックして失敗します (2) スレッド A: したがって、待機状態に移行しようとします (3) スレッド B: 特定のタスクを完了し、スレッド A が必要とするロック状態を変更します (4)スレッド B : シグナル notifyAll()

Java の VM が次の順序 (1)、(3)、(4)、(2) で実行するようにコードを並べ替えるかどうかを検討してください。私はそのような状態が可能であると信じており、そのような場合、通知するスレッドが他にないため、スレッド A が永久に待機状態になるため、問題が発生する可能性があります!

編集 1: ロックの目的で Synchronized ブロックを使用していません。むしろ、コードの一部をロックするために AtomicInteger を使用しています。アトミック変数 N を持つ RWLock クラスを考えてみましょう。リーダーとライターの数がロック状態になると、増加または減少します。この質問は、同期されたブロック/メソッドではなく、そのような状態に適用されます。

4

1 に答える 1

1

wait()/notifyAll() パターンを使用している場合は、両方の呼び出しでロック オブジェクトを同期する必要があります。これにより、提案された再注文が防止されます。

例えば

private final Object lock = new Object();

public void waiting()
{
  sychronized (lock)
  {
    while (waitCondition)
      lock.wait();
  }
}

public void notifying()
{
  sychronized (lock)
  {
    // change wait condition, probably

    lock.notifyAll();
  }
}
于 2013-10-05T08:55:38.803 に答える