IT이야기

C# Java의 동기화된 키워드 버전?

cyworld 2022. 5. 22. 11:26
반응형

C# Java의 동기화된 키워드 버전?

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 */ }
}

필드 유사 이벤트의 경우 잠금 구현은 컴파일러에 따라 달라지며, 오래된 마이크로소프트 컴파일러에서는lock(this)/lock(Type)그러나 최신 컴파일러에서는 업데이트를 사용하기 때문에 고약한 부분 없이도 나사산이 안전하다.

이를 통해 보다 세분화된 사용 및Monitor.Wait/Monitor.Pulse기타 나사산 간 통신

관련 블로그 항목(더 늦게 다시 방문함)

static object Lock = new object();

lock (Lock) 
{
// do stuff
}

c#는 자바 고유의 "동기화" 키워드를 가지고 있는가?

아니, C#에서 넌 분명히lock비동기 스레드 간에 동기식으로 작업할 리소스. lock블록을 열어라. 방법 수준에서는 작동하지 않는다.

그러나, 기본적인 메커니즘은 그 이후로 유사하다.lock(이후로)를 호출하여 작업함.Monitor.Exit런타임에 .태양 문서에 따르면 자바도 같은 방식으로 작동한다.

전체 경로를 통해 다음 줄을 확인하십시오.[MethodImpl(MethodImplOptions.Synchronized)]처럼 보여야 한다

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

당신은 그것을 사용할 수 있다.lock대신 명세서이것은 두 번째 버전만 대체할 수 있을 것 같아.또한, 두 가지 모두synchronized그리고lock물체를 수술할 필요가 있다.

참조URL: https://stackoverflow.com/questions/541194/c-sharp-version-of-javas-synchronized-keyword

반응형