次の方法で共有


Array.SyncRoot プロパティ

定義

Array へのアクセスを同期するために使用できるオブジェクトを取得します。

public:
 property System::Object ^ SyncRoot { System::Object ^ get(); };
public:
 virtual property System::Object ^ SyncRoot { System::Object ^ get(); };
public object SyncRoot { get; }
public virtual object SyncRoot { get; }
member this.SyncRoot : obj
Public ReadOnly Property SyncRoot As Object
Public Overridable ReadOnly Property SyncRoot As Object

プロパティ値

Object

Array へのアクセスの同期に使用できるオブジェクトです。

実装

次のコード例は、プロパティを使用して列挙全体の間に配列をロックする方法を SyncRoot 示しています。

Array^ myArray = gcnew array<Int32> { 1, 2, 4 };
try
{
    Monitor::Enter(myArray->SyncRoot); 
        
    for each (Int32 item in myArray)
        Console::WriteLine(item);
}
finally
{
    Monitor::Exit(myArray->SyncRoot);
}
Array myArray = new int[] { 1, 2, 4 };
lock(myArray.SyncRoot)
{
    foreach (Object item in myArray)
        Console.WriteLine(item);
}
let myArray = [| 1; 2; 4|]
lock myArray.SyncRoot (fun () ->
    for item in myArray do
        printfn $"{item}" )
Dim myArray As Array = New Integer() { 1, 2, 4 }
SyncLock(myArray.SyncRoot) 
    For Each item As Object In myArray
        Console.WriteLine(item)
    Next
End SyncLock

注釈

このプロパティは、インターフェイスを System.Collections.ICollection 実装します。

.NET クラスに基づいて Array 、プロパティを使用して独自の同期バージョンのコレクションを SyncRoot 提供します。

配列を使用するクラスは、プロパティを使用して独自の同期を SyncRoot 実装することもできます。 同期コードでは、コレクションを直接操作するのではなく、コレクションの SyncRoot に対して操作を行う必要があります。 こうすることにより、他のオブジェクトから派生したコレクションを適切に操作することができます。 具体的には、コレクションを同時に変更する可能性がある他のスレッドとの適切な同期が維持されます。 実装によっては、それ自体が SyncRoot 返される Array 場合があることに注意してください。

コレクションの列挙は、本質的にスレッド セーフな手続きではありません。 コレクションが同期されていても、他のスレッドがコレクションを変更する場合があり、このときは列挙子から例外がスローされます。 列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチします。

このプロパティ値を取得することは、O(1) 操作になります。

適用対象

こちらもご覧ください