1. 序章

このチュートリアルでは、モニターとは何か、およびJavaでモニターを使用する方法を学習します。

2. モニターとは?

モニターは、スレッドが以下を持つことを可能にする同期メカニズムです。

  • 相互排除ロックを使用して、特定の時点でメソッドを実行できるスレッドは1つだけです。
  • cooperation wait-set を使用して、スレッドに特定の条件が満たされるのを待機させる機能

この機能が「モニター」と呼ばれるのはなぜですか? は、スレッドが一部のリソースにアクセスする方法を監視しているためです。

モニターは、PBが書いた論文で、70年代初頭に正式に関心の対象となりました。 ハンセンは共有クラスと名付けました。 その後、CAR Hoareは、論文 Monitors – Operating System Structuring Concept を執筆し、モニターの概念をさらに発展させました。 このホワイトペーパーでは、同期の形式を紹介し、セマフォを使用した実装モデルを提案しました。

3. モニター機能

モニターは、並行プログラミングに3つの主要な機能を提供します。

  • 重要なコードセクションに相互に排他的にアクセスできるのは、一度に1つのスレッドだけです。
  • モニターで実行されているスレッドは、特定の条件が満たされるのを待っている間、ブロックされる可能性があります
  • 待機している条件が満たされたときに、1つのスレッドが他のスレッドに通知できます

4. Javaはどのようにモニターを実装しますか?

クリティカルセクションは、異なるスレッドを介して同じデータにアクセスするコードの一部です。

Javaでは、synchronizedキーワードを使用してクリティカルセクションをマークします。 これを使用して、メソッド(同期メソッドとも呼ばれます)またはコードのより小さな部分(同期ステートメント)をマークできます。

どちらのアプローチを優先するかについては反対意見があります。メソッドの同期は通常推奨されるより単純なアプローチですが、同期されたステートメントはセキュリティの観点からより適切な選択です。

Javaでは、モニターとすべてのオブジェクトまたはクラスの間に論理的な接続があります。 したがって、それらはインスタンスと静的メソッドもカバーします。 相互排除は、すべてのオブジェクトとクラスに関連付けられたロックで実現されます。 このロックは、mutexと呼ばれるバイナリセマフォです。

4.1. 建物と排他的な部屋のアナロジー

Javaによる監視メカニズムの実装は、エントリセット待機セットの2つの概念に依存しています。 文献では、著者は建物と専用の部屋のアナロジーを使用してモニターメカニズムを表現しています。 この例えでは、一度に1人だけが専用の部屋にいることができます。

したがって、この例えでは:

  • モニターは2つの部屋と廊下を含む建物です
  • 同期されたリソースは「専用ルーム」です
  • 待機セットは「待合室」です
  • エントリーセットは「廊下」です
  • スレッドは専用の部屋に行きたい人です

専用の部屋に入るときは、まず廊下(エントリーセット)に行き、スケジューラーを待ちます。 したがって、スケジューラーはその人を選び、専用の部屋に送ります。

JVMのスケジューラーは、優先度ベースのスケジューリングアルゴリズムを使用します。 2つのスレッドの優先度が同じ場合、JVMはFIFOアプローチを使用します。

したがって、スケジューラーがその人を選ぶと、彼は専用の部屋に入ります。 この部屋で特定の状況が発生している可能性があるため、外に出て専用の部屋が再び利用可能になるのを待つ必要があります。 したがって、その人は待合室に行き着きます(待機セット)。 その結果、スケジューラーはこの人が後で専用の部屋に入るようにスケジュールします。

また、同じアナロジーを使用して、このプロセス中にスレッドが実行するステップに言及することも重要です。

  • 建物に入る–モニターに入る
  • 専用ルームに入る–モニターを取得する
  • 専用の部屋にいる–モニターを所有している
  • 専用の部屋を出る–モニターを解放する
  • 建物を出る–モニターを出る。

幸い、Javaはほとんどの作業をバックグラウンドで実行し、マルチスレッドアプリケーションを処理するときにセマフォを作成する必要はありません。 したがって、必要なのは synchronized キーワードでクリティカルセクションをラップすることだけで、それは一時的にモニター領域になります。

4.2. wait()および notify()

wait()およびnotify()は、スレッド間のコラボレーションを可能にする同期ブロックで使用されるJavaの主要なメソッドです。

wait()は、呼び出し元のスレッドにモニターを解放し、他のスレッドがこのモニターに入り、notify()を呼び出すまでスリープ状態になるように命令します。  また、 notify()は、特定のオブジェクトで wait()を呼び出した最初のスレッドをウェイクアップします。

5. 結論

この記事では、モニターの概念について説明した後、Javaでの実装について説明しました。

私たちが学んだように、それはsynchronizedキーワードの背後に隠されているコア同期メカニズムです。 これは待機セットとエントリセットに依存しており、これがどのように機能するかを簡単な例えで説明しました。

また、waitメソッドとnotifyメソッドの使用法についても説明しました。