14

同期ブロック内の while ループ内で wait() を呼び出す必要があるというパラダイムが提唱されています。

私の質問は、waiting() スレッドがロックを取り戻す方法です。

// Thread 1
    synchronized (mon) {
     while (!condition) 
          mon.wait();

    // Do something
    }

//Thread 2
    synchronized (mon) {//set condition appropriately
            mon.notify();
    }

スレッド 1 が最初に実行され、条件の待機を開始するとします。ロックを解除し、スレッド 2 がロックを取得して条件を設定し、スレッド 1 に通知します。これで、スレッド 1 がロックを取得し、条件を確認して、「何かを実行」の実行を開始します。

私の質問は、スレッド 1 が while 条件から実行を開始することを通知されたとき、Synchronized(mon) を持っていたコード行が二度と実行されない場合、スレッド 1 はどのようにロックを取得するのでしょうか? ロックを Thread 1 に戻す内部ダイナミクスは何ですか?

4

4 に答える 4

8

Thread1 がスレッドが wait メソッドを終了する前にロックを取得する必要があることを通知された場合、Object#wait の Java ドキュメントを参照してください。

その後、スレッドTはこのオブジェクトの待機セットから削除され、スレッドのスケジューリングが再度有効になります。次に、オブジェクトを同期する権利を求めて、通常の方法で他のスレッドと競合します。オブジェクトの制御を取得すると、そのオブジェクトに対するすべての同期要求は、現状維持、つまり、wait メソッドが呼び出された時点の状況に復元されます。その後、スレッドはメソッドTの呼び出しから戻ります。waitしたがって、 waitメソッドから戻ると、オブジェクトとスレッドの同期状態は 、メソッドが呼び出されTたときとまったく同じになります。wait

于 2013-05-26T15:09:17.573 に答える
7

synchronized(mon)実行する必要がある式ではありません。

これは、ソース コード内の構文要素であり、コードのラップされたセクションは、関連付けられたロックmonが現在のスレッドによって取得された後にのみ実行する必要があることをコンパイラ (およびランタイム) に通知します。 from" 同期ブロックの前のコード行。

wait()ロックを解放し、戻る前に再取得する必要があります。

于 2013-05-26T15:09:30.303 に答える
0

スレッド 1 が通知されると、すぐにロックを取得し、//Do somethingを実行し始めます。

スレッド 1 が待機するときは、一時的にロックを解放するだけであり、スレッドに通知されると、再びロックを取得でき、同期を実行する必要はありません(...)。

于 2013-05-26T15:16:05.370 に答える