메소드 (인스턴스 또는 정적)가 해당 메소드 내에서 범위가 지정된 변수 만 참조하는 경우 각 스레드에는 자체 스택이 있으므로 스레드 안전합니다.
이 경우 여러 스레드가 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;
}
}
구조체 나 불변이 아닌 메서드에 전달 된 모든 매개 변수는 메서드 범위 밖의 다른 스레드에 의해 변경 될 수 있습니다.
적절한 동시성을 보장하려면 잠금을 사용해야합니다.
자세한 정보는 잠금 문 C # 참조 및 ReadWriterLockSlim을 참조 하십시오 .
lock 은 대부분 한 번에 하나의 기능을 제공하는 데 유용하며
ReadWriterLockSlim
여러 독자와 단일 작성자가 필요한 경우 유용합니다.