次の実行ステートメントを検討してください。
(1) スレッド A: 特定のロック状態をチェックして失敗します (2) スレッド A: したがって、待機状態に移行しようとします (3) スレッド B: 特定のタスクを完了し、スレッド A が必要とするロック状態を変更します (4)スレッド B : シグナル notifyAll()
Java の VM が次の順序 (1)、(3)、(4)、(2) で実行するようにコードを並べ替えるかどうかを検討してください。私はそのような状態が可能であると信じており、そのような場合、通知するスレッドが他にないため、スレッド A が永久に待機状態になるため、問題が発生する可能性があります!
編集 1: ロックの目的で Synchronized ブロックを使用していません。むしろ、コードの一部をロックするために AtomicInteger を使用しています。アトミック変数 N を持つ RWLock クラスを考えてみましょう。リーダーとライターの数がロック状態になると、増加または減少します。この質問は、同期されたブロック/メソッドではなく、そのような状態に適用されます。