c# - 자바의 동기화 된 키워드의 C # 버전?


C #에서 자체 "동기화 된"Java 키워드가 있습니까?

즉 java에서 함수, 객체 또는 코드 블록 중 하나를 지정할 수 있습니다.

public synchronized void doImportantStuff() {
   // dangerous code goes here.
}

또는

public void doImportantStuff() {
   // trivial stuff

   synchronized(someLock) {
      // dangerous code goes here.
   }
}

Answers



첫 번째 - 대부분의 클래스는 스레드로부터 안전 할 필요가 없습니다. 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 하거나 typeof(Foo) 잠그는 것처럼 MethodImpl 의 구현을 좋아하지 않는다. 이것은 모범 사례에 위배된다. 기본 옵션은 자체 잠금을 사용하는 것입니다.

private readonly object syncLock = new object();
public void SomeMethod() {
    lock(syncLock) { /* code */ }
}

필드와 같은 이벤트의 경우 잠금 구현은 컴파일러에 따라 다릅니다. 구형 Microsoft 컴파일러에서는 lock(this) / lock(Type) . 그러나 최신 컴파일러에서는 Interlocked 업데이트를 사용 하므로 더러운 부분없이 스레드로부터 안전합니다.

이렇게하면보다 세부적인 사용이 가능하며 Monitor.Wait / Monitor.Pulse 등을 사용하여 스레드간에 통신 할 수 있습니다.

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




static object Lock = new object();

lock (Lock) 
{
// do stuff
}



C #에는 "동기화 된"Java 키워드가 포함되어 있습니까?

아니요. C #에서는 비동기 스레드에서 동 기적으로 작업 할 리소스를 명시 적으로 lock . lock 은 블록을 엽니 다. 메서드 수준에서는 작동하지 않습니다.

그러나 런타임시 Monitor.Enter (및 이후 Monitor.Exit )를 호출하여 lock 작동하므로 기본 메커니즘이 비슷합니다. Java는 Sun 과 동일한 방식으로 작동합니다.




대신 lock 문을 사용할 수 있습니다. 나는 이것이 단지 두 번째 버전을 대체 할 수 있다고 생각한다. 또한 synchronizedlock 은 모두 객체에서 작동해야한다는 것을 기억하십시오.




전체 경로를 사용하여 [MethodImpl(MethodImplOptions.Synchronized)] 와 같이 표시되어야합니다.

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]