Monitor クラス
オブジェクトへのアクセスを同期する機構を提供します。
この型のすべてのメンバの一覧については、Monitor メンバ を参照してください。
System.Object
System.Threading.Monitor
NotInheritable Public Class Monitor
[C#]
public sealed class Monitor
[C++]
public __gc __sealed class Monitor
[JScript]
public class Monitor
スレッドセーフ
この型は、マルチスレッド操作に対して安全です。
解説
Monitor クラスは、オブジェクトのロックをシングル スレッドに付与してオブジェクトへのアクセスを制御します。オブジェクトをロックすると、通常クリティカル セクションと呼ばれる、コード ブロックへのアクセスを制限できます。あるスレッドがオブジェクトのロックを所有している間、他のスレッドはそのロックを取得できません。 Monitor を使用して、ロックの所有者が実行しているアプリケーション コードのセクションに、他のスレッドがアクセスできないようにすることもできます。ただし、これは、他のスレッドがロックされた別のオブジェクトを使用してコードを実行していない場合に限ります。
メモ 値型ではなく、オブジェクト (つまり参照型) をロックするには Monitor を使用します。詳細については、「 Enter 」および概念に関するトピック「 Monitor 」を参照してください。
Monitor には次の機能があります。
- 必要に応じてオブジェクトに関連付けられます。
- 非バインドです。つまり、任意のコンテキストから直接呼び出すことができます。
- Monitor クラスのインスタンスは作成できません。
同期するオブジェクトごとに次の情報が保持されます。
- 現在ロックを保持しているスレッドへの参照。
- 実行待ちキューへの参照。実行待ちキューにはロックの取得が準備できたスレッドが格納されます。
- 待機キューへの参照。このキューには、ロックされたオブジェクトの状態が変更されたことの通知を待機しているスレッドが格納されます。
同期するオブジェクトにアクセスするスレッドが実行できるアクションについて、次の表で説明します。
アクション | 説明 |
---|---|
Enter, TryEnter | オブジェクトのロックを取得します。このアクションは、クリティカル セクションの先頭もマークします。他のスレッドは、ロックされた別のオブジェクトを使用してクリティカル セクションで命令を実行している場合を除き、クリティカル セクションに入ることはできません。 |
Wait | オブジェクトのロックを解放して、他のスレッドがオブジェクトをロックしたりオブジェクトにアクセスできるようにします。呼び出し元のスレッドは、他のスレッドがオブジェクトにアクセスしている間待機します。パルス シグナルを使用して、オブジェクトの状態が変更されたことを待機中のスレッドに通知します。 |
Pulse (シグナル)、 PulseAll | 1 つ以上の待機中のスレッドにシグナルを送ります。このシグナルが、ロックされたオブジェクトの状態が変更されたことを待機中のスレッドに通知すると、ロックの所有者はロックを解放する準備をします。待機中のスレッドはオブジェクトの実行待ちキューに入り、最終的にオブジェクトのロックを受け取ることができます。ロックを取得したスレッドは、必要な状態に達しているかどうかを確認するためにオブジェクトの新しい状態をチェックできます。 |
Exit | オブジェクトのロックを解放します。このアクションは、ロックされたオブジェクトによってプロテクトされるクリティカル セクションの末尾もマークします。 |
Enter メソッドと Exit メソッドを使用して、クリティカル セクションの先頭と末尾をマークします。クリティカル セクションが連続する命令のセットである場合は、 Enter メソッドで取得したロックにより、ロックされたオブジェクトで囲まれたコードを 1 つのシングル スレッドだけが実行できるようになります。この場合は、 try ブロックにこれらの命令を置いて、 Exit 命令を finally ブロックに置くことをお勧めします。この機能は、通常、クラスの静的メソッドまたはインスタンス メソッドへのアクセスを同期するために使用されます。インスタンス メソッドに同期されたスレッド アクセスが必要な場合は、現在のインスタンスをロックするオブジェクトとして使用して、 Enter メソッドと、対応する Exit メソッドを呼び出します。1 つのスレッドだけが現在のインスタンスのロックを保持できるため、このメソッドを実行できるのは、一度に 1 つのスレッドだけです。静的メソッドは、現在のインスタンスの Type をロックされたオブジェクトとして使用するのと同じ方法でプロテクトされます。 Enter メソッドと Exit メソッドにより提供される機能は、C# lock ステートメントで提供される機能と同じです。
クリティカル セクションの範囲がメソッド全体にわたる場合、前のロック機能は System.Runtime.CompilerServices.MethodImplAttribute をメソッドに配置し、 MethodImplAttribute のコンストラクタの Synchronized 値を指定して実行できます。この属性を使用する場合は、 Enter ステートメントと Exit ステートメントは不要です。この属性によって、現在のスレッドはメソッドから制御が戻るまでロックを保持します。ロックがすぐに解放できる場合は、この属性ではなく、 Monitor クラスまたは C# lock ステートメントを使用します。
特定のオブジェクトをロックおよび解放する Enter ステートメントと Exit ステートメントは、メンバの境界またはクラスの境界、またはその両方を超えることはできますが、この方法はお勧めできません。
同期対象のオブジェクトを選択する場合は、プライベート オブジェクトまたは内部オブジェクトだけをロックする必要があります。外部オブジェクトをロックすると、デッドロックが発生します。これは関連のないコードが別の目的のために同じオブジェクトのロックを選択するためです。
必要条件
名前空間: System.Threading
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: Mscorlib (Mscorlib.dll 内)
参照
Monitor メンバ | System.Threading 名前空間 | Thread | スレッド処理 | Monitor