次の方法で共有


Lock クラス

定義

注意

このプレビュー API を使用するには、プロジェクト ファイル内の EnablePreviewFeatures プロパティを True に設定することで、プロジェクトでプレビュー機能を有効にする必要があります。 詳細については、「https://aka.ms/dotnet-preview-features」を参照してください。

異なるスレッド間のコード領域で相互除外を実現するためのメカニズムを提供します。

public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
継承
Lock
属性

注釈

クラスを Lock 使用すると、リソースへの同時アクセスを防ぐために、プロセスのスレッド間で相互に排他的なアクセスを必要とするコードの領域 (一般にクリティカル セクションと呼ばれます) を定義できます。 を Lock 入力および終了できます。ここで、開始と終了の間のコード領域は、ロックに関連付けられている重要なセクションです。 ロックに入ったスレッドは、ロックを終了するまでロックを保持または所有していると言われます。 最大 1 つのスレッドは、任意の時点でロックを保持できます。 スレッドは複数のロックを保持できます。 スレッドは、再帰的になど、終了する前に複数回ロックを入力できます。 ロックをすぐに入力できないスレッドは、ロックを入力できるまで、または指定したタイムアウトが切れるまで待機できます。

メソッドまたは TryEnter メソッドをEnter使用してロックを入力する場合:

  • ブロックを使用して C# などの例外が発生した場合でも、スレッドが でロック Exittry/finally 終了していることを確認します。
  • ロックが C# async メソッドで入力および終了されている場合は、入り口と終了の間にがないことを await 確認します。 ロックはスレッドによって保持され、 に続く await コードは別のスレッドで実行される可能性があります。

C# キーワード (keyword)などの返された Lock.Scope を自動的に破棄する言語コンストラクトで メソッドを使用EnterScopeするか、C# usinglock キーワード (keyword)を使用することをお勧めします。例外の場合はロックが終了します。 これらのパターンには、 と Exitを使用Enter/TryEnterするよりもパフォーマンス上の利点がある場合もあります。 次のコード フラグメントは、ロックを開始および終了するためのさまざまなパターンを示しています。

public sealed class ExampleDataStructure
{
    private readonly Lock _lockObj = new();

    public void Modify()
    {
        lock (_lockObj)
        {
            // Critical section associated with _lockObj
        }

        using (_lockObj.EnterScope())
        {
            // Critical section associated with _lockObj
        }

        _lockObj.Enter();
        try
        {
            // Critical section associated with _lockObj
        }
        finally { _lockObj.Exit(); }

        if (_lockObj.TryEnter())
        {
            try
            {
                // Critical section associated with _lockObj
            }
            finally { _lockObj.Exit(); }
        }
    }
}

C# lock キーワード (keyword)を使用する場合や、ロックを開始および終了する場合、式の型は正確に System.Threading.Lockである必要があります。 式の型が や のようなTジェネリック型などのObject他の型である場合は、代わりに互換性のない別の実装 (などMonitor) を使用できます。 詳細については、関連する コンパイラ スペックレットを参照してください。

Interrupt は、ロックの入力を待機しているスレッドを中断できます。 Windows STA スレッドでは、ロックを待機すると、待機中に同じスレッドで他のコードを実行できるメッセージ ポンプが許可されます。 待機の一部の機能は、カスタム SynchronizationContextによってオーバーライドできます。

注意

ロックに入るスレッド (再帰的になど) は、ロックを完全に終了し、他のスレッドがロックに入ることができるように、同じ回数だけロックを終了する必要があります。 を保持 Lockしている間にスレッドが終了すると、 の Lock 動作は未定義になります。

注意事項

コード パスで、スレッドが終了する前に複数のロックを入力する可能性がある場合は、同じスレッドで 2 つのロックに入る可能性があるすべてのコード パスが同じ順序で入力されるようにします。 そうしないと、デッドロックが発生する可能性があります。 たとえば、あるコード パス スレッドT1では、両方を終了する前にロックL2L1を入力し、別のコード パス スレッドT2では両方のロックを逆の順序で入力するとします。 そのシナリオでは、次の順序のイベントが発生する可能性があります。enters L1T2 entersL2、enters、 T1 enter L2 および waits、 T2 enter L1 および waits T1 を試みます。 と の間T1T2には解決できないデッドロックがあり、将来いずれかのロックを入力しようとする他のスレッドもハングします。

コンストラクター

Lock()

Lock クラスの新しいインスタンスを初期化します。

プロパティ

IsHeldByCurrentThread

ロックが現在のスレッドによって保持されているかどうかを示す値を取得します。

メソッド

Enter()

ロックを入力し、必要に応じてロックを入力するまで待機します。

EnterScope()

ロックを入力し、必要に応じてロックを入力するまで待機します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
Exit()

ロックを終了します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
TryEnter()

待機せずにロックの入力を試みます。

TryEnter(Int32)

ロックの入力を試み、必要に応じて、ロックを入力できるようになるまで、指定したミリ秒数待機します。

TryEnter(TimeSpan)

ロックの入力を試み、ロックを入力できるまで、または指定したタイムアウトが切れるまで、必要に応じて待機します。

適用対象