「こんにちは、アミーゴ!」

「以前のレッスンでは、『ミューテックス』と『モニター』という言葉を時々使いましたが、今回はそれらが何を意味するのかを説明します。」

"ぜひ聞きたいです。"

ミューテックスは、スレッド/プロセスを同期するための特別なオブジェクトです。ミューテックスには、ビジーとフリーの 2 つの状態が考えられます。簡単に言えば、ミューテックスは、ビジー (true) とフリー (false) の 2 つの値を持つブール変数です。」

「スレッドがオブジェクトの所有権を取得したい場合、オブジェクトのミューテックスをビジーとしてマークします。そして、オブジェクトの処理が終了すると、そのミューテックスをフリーとしてマークします。」

「言い換えれば、ミューテックスはドアにある「ビジー/フリー」のサインのようなものですか?

「はい。そのようなミューテックスは Java のすべてのオブジェクトに関連付けられています。ミューテックスに直接アクセスできるのは Java マシンだけです。ミューテックスはプログラマには隠されています。」

「それではどうやって使うのですか?」

「Java では、モニターを通じてミューテックスを操作できます。」

「モニターは、ミューテックスの上に重ねられた特別なメカニズム (コードの一部) です。モニターは、ミューテックスとの適切な対話を保証します。オブジェクトをビジーとしてマークするだけでは十分ではありません。他のスレッドがそれを実行しようとしないようにすることが依然として必要です。ビジーオブジェクトを使用してください。」

「Java では、モニターはキーワード synchronized を使用して実装されます。」

「同期ブロックを作成すると、Java コンパイラーはそれを 3 つのコードに置き換えます。」

1)同期ブロックの先頭に、ミューテックスをビジーとしてマークするコードが追加されます。

2) 同期ブロックの最後に、ミューテックスを空きとしてマークするコードが追加されます。

3) 同期ブロックの前に、ミューテックスがビジーの場合にミューテックスが解放されるまでスレッドを待機させるコードが追加されます。

「おおよその仕組みは次のとおりです。」

コード 使い方 説明
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;

ミューテックスがビジーである限り、スレッドはスリープします
(ミューテックスが解放されるとループを終了します)。 ミューテックスをビジーとしてマークします。

doTask() を実行します。

ミューテックスを空きとしてマークする

「実際には、そこにあるロジックは異なり、より複雑です。しかし、これらは単なる詳細です。」

「詳細を教えてもらえますか?」

「正しい使い方を習得するまでは、細かいことにこだわっても意味がありません。」

「数レベル前に、遷移矢印付きのすべてのスレッド状態のリストと、この状態に影響を与えるメソッドのリストを渡しました。よく覚えていますか?」

「そうではないんです。すぐに忘れてしまうので……」

「実践が減れば減るほど、理論から得られる利益は減ります。」

「レベル 40 までに、これらすべての使い方を学びます。そして、これらすべてが実際にどのように機能するかを説明します。それまでは、すべてを適切に使用することを学びましょう。わかりましたか?」

「はい、ありがとう、エリー」