他の質問は、言語が何を言っているかに焦点を当てていwait
ますnotify
が、それはあなたの質問の内容ではないようです...実装の詳細であり、したがってJVM固有のミューテックスについて話します。
そのため、JVM を選択する必要があります。openjdk (ソースはこちらから入手可能) を選択しましょう。これらすべてを (最終的に) 処理するコードは、hotspot/src/share/vm/runtime/objectMonitor.cpp
.
これは、待機セットとエントリ セットの 2 つのデータ構造を維持します。待機中のスレッドは待機セットに追加されてパークされますが、モニターを取得しようとするスレッドはエントリ セットに追加されてからパークされます。スレッドnotify
では、待機セットから取得され、エントリ セットに追加されます。スレッドがロックを解除すると、エントリ セットがある場合はスレッドをアンパークします。これらのセットは実際にはキュー (リンクされたリスト) として実装されるため、FIFO ベースで処理されることに注意してください。
したがって、この特定のケースでは、実装は、オブジェクトのモニターを待機することと、オブジェクトのモニターを取得しようとすることを同様の方法で扱います。
しかし、これは 1 つの JVM の 1 つの実装にすぎません (他の人も同様のことをしている可能性がありますが)。したがって、これに依存することはできません。では、なぜ知りたいのかという質問だと思います。それがただの好奇心である場合は、openjdk コードを調べてください。魅力的です。この情報をコードで使用する予定がある場合は、使用しないでください。
アップデート
「公園」と言ってもあまり意味がないことに気づきました。PlatformEvent
スレッドをパークするコードはプラットフォーム固有です (そして、ParkEvent
拡張する というオブジェクトに実装されます)。私が見ているopenjdkのバージョンでは、Linux用のパークコードはで見つけることができhotspot/src/os/linux/vm/os_linux.cpp
、これは呼び出しpthread_mutex_lock(_mutex)
ます...あなたの質問への答えとして、はい呼び出し待機は私のマシンでミューテックスを取るかもしれません。これよりも多くのことが起こり、この点に到達するのを妨げる可能性があることに注意してください.