9

Thread.currentThread().yield()これはスレッド スケジューラへの通知であり、CPU サイクルが同じ優先度の他のスレッドに割り当てられる可能性があることを理解しています。私の質問は次のとおりです。現在のスレッドがいくつかのオブジェクトと呼び出しをロックしている場合、yield()そのロックはすぐに失われますか? そして、スレッド スケジューラが、CPU サイクルを割り当てるスレッドが存在しないことを発見すると、呼び出したスレッドは、yield()以前に失ったオブジェクトをロックするために再び戦いますか??

javadoc やフォーラム [http://www.coderanch.com/t/226223/java-programmer-SCJP/certification/does-sleep-yield-release-lock] には 50 ~ 50 の回答がありませんでした。

yield()同じ優先度のスレッド(スレッド2としましょう)が同じオブジェクトを操作したい場合、スレッドスケジューラが最終的にスレッド2にカップを割り当てる可能性があるため、(スレッド1としましょう)ロックを解放する必要があると思います。

4

3 に答える 3

14

いいえThread.yield()、そうではありませんObject.wait()。スレッドの切り替えを許可するために制御を放棄するだけです。プログラムの並行性には影響しません。

yield 後にスケジューラがどのスレッドを実行するかは保証されません。

于 2012-05-21T05:01:43.857 に答える
10

Java 言語仕様
17.3 Sleep と Yield Thread.sleep も Thread.yield も同期セマンティクスを持たないことに注意することが重要です
特に、コンパイラは、Thread.sleep または Thread.yield を呼び出す前に、レジスタにキャッシュされた書き込みを共有メモリにフラッシュする必要はなく、Thread.sleep または Thread を呼び出した後に、レジスタにキャッシュされた値を再ロードする必要もありません。 。収率。

私のコメント:

Java の初期の頃、並列実行は実際にはサポートされておらず、並行 (グリーン スレッド) のみがサポートされていたためyield()、現在のスレッドが中断され、jvm は別のスレッドを選択して再開していました。今日でyieldは、通常、トレッド スケジューリングは OS レベルで行われるため、あまり意味がありません。

したがって、これyieldは現在のスレッドが休息を求めているという JVM への単なるヒントであり、何をすべきかを決定するのはスレッド スケジューラ次第です。 yield同期セマンティックはありません。スレッドがロックを保持している場合、それは引き続き保持されます。

于 2012-05-21T05:13:24.113 に答える
0

Object クラスの待機メソッドのみが、現在のインスタンスの固有のロックを解放します (スレッドは他のロックを取得している可能性がありますが、それらは解放されません)。yield、sleep、join はロックを気にしません。ただし、join はもう少し特別です。完了を待っているスレッドによって行われたすべての変更を確実に見ることができます。

于 2012-08-07T12:40:43.350 に答える