C #에는 자체 버전의 java “동기화 된”키워드가 있습니까?
즉 자바에서는 함수, 객체 또는 코드 블록에 다음과 같이 지정할 수 있습니다.
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
또는
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
답변
첫째, 대부분의 클래스는 스레드로부터 안전 할 필요가 없습니다. 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를 사용하여 스레드간에 통신 할 수 있습니다 .
답변
static object Lock = new object();
lock (Lock)
{
// do stuff
}
답변
C #에는 자체 버전의 java “동기화 된”키워드가 있습니까?
아니요. C #에서는 lock
비동기 스레드에서 동 기적으로 작업 할 리소스를 명시 적으로 제공 합니다. lock
블록을 엽니 다; 메소드 레벨에서는 작동하지 않습니다.
그러나 기본 메커니즘은 런타임에서 lock
호출하여 Monitor.Enter
(그리고 그에 따라 Monitor.Exit
) 작동 하므로 비슷 합니다. Sun 문서 에 따르면 Java도 동일한 방식으로 작동합니다 .
답변
전체 경로를 사용하여 [MethodImpl(MethodImplOptions.Synchronized)]
다음과 같이주의하십시오.
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
답변
lock
대신 문을 사용할 수 있습니다 . 나는 이것이 두 번째 버전 만 대체 할 수 있다고 생각합니다. 또한, 모두 기억 synchronized
하고 lock
필요 객체에서 작동 할 수 있습니다.