첫째, 대부분의 클래스는 스레드로부터 안전 할 필요가 없습니다. YAGNI 사용 : 실제로 사용하고 테스트한다는 것을 알고있을 때만 스레드 안전성을 적용 하십시오 .
메소드 레벨의 내용은 [MethodImpl]
다음과 같습니다.
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
접근 자 (속성 및 이벤트)에서도 사용할 수 있습니다.
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
필드와 유사한 이벤트 는 기본적으로 동기화되지만 자동 구현 속성 은 그렇지 않습니다 .
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
개인적으로, 나는 MethodImpl
그것이 잠기 this
거나 typeof(Foo)
최선의 방법에 위배되는 구현을 좋아하지 않습니다 . 선호하는 옵션은 자신의 잠금을 사용하는 것입니다.
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
필드와 유사한 이벤트의 경우 잠금 구현은 컴파일러에 따라 다릅니다. 이전 Microsoft 컴파일러에서는 lock(this)
/ lock(Type)
-그러나 최신 컴파일러에서는Interlocked
업데이트를 사용 하므로 불쾌한 부분없이 스레드로부터 안전합니다.
이를 통해보다 세부적인 사용법이 가능하며 Monitor.Wait
/ Monitor.Pulse
etc를 사용하여 스레드간에 통신 할 수 있습니다 .
관련 블로그 항목 (나중에 다시 방문 )