メソッド(インスタンスまたは静的)がそのメソッド内でスコープされた変数のみを参照する場合、各スレッドには独自のスタックがあるため、スレッドセーフです。
この場合、複数のスレッドがThreadSafeMethod
問題なく同時に呼び出すことができます。
public class Thing
{
public int ThreadSafeMethod(string parameter1)
{
int number; // each thread will have its own variable for number.
number = parameter1.Length;
return number;
}
}
これは、メソッドがローカルスコープの変数のみを参照する他のクラスメソッドを呼び出す場合にも当てはまります。
public class Thing
{
public int ThreadSafeMethod(string parameter1)
{
int number;
number = this.GetLength(parameter1);
return number;
}
private int GetLength(string value)
{
int length = value.Length;
return length;
}
}
メソッドが(オブジェクト状態)プロパティまたはフィールド(インスタンスまたは静的)にアクセスする場合は、ロックを使用して、別のスレッドによって値が変更されないようにする必要があります。
public class Thing
{
private string someValue; // all threads will read and write to this same field value
public int NonThreadSafeMethod(string parameter1)
{
this.someValue = parameter1;
int number;
// Since access to someValue is not synchronised by the class, a separate thread
// could have changed its value between this thread setting its value at the start
// of the method and this line reading its value.
number = this.someValue.Length;
return number;
}
}
メソッドに渡された、構造体でも不変でもないパラメーターは、メソッドのスコープ外の別のスレッドによって変更される可能性があることに注意してください。
適切な並行性を確保するには、ロックを使用する必要があります。
詳細については、lockステートメントのC#リファレンスとReadWriterLockSlimを参照してください。
ロックは、一度に1つずつ機能を提供する場合に役立ち、
ReadWriterLockSlim
複数のリーダーと単一のライターが必要な場合に役立ちます。