[java] 자바의 동기화 키워드의 C # 버전?

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.Pulseetc를 사용하여 스레드간에 통신 할 수 있습니다 .

관련 블로그 항목 (나중에 다시 방문 )


답변

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필요 객체에서 작동 할 수 있습니다.


답변