방프리

24.04.23 Chapter4. 병렬 처리 (Item 41) 본문

C#/More Effective C#

24.04.23 Chapter4. 병렬 처리 (Item 41)

방프리 2024. 4. 23. 22:37

Item 41 : 락은 가능한 한 좁은 법위에 적용하라

private 접근제한자를 통해 멤버 변수를 관리할 범위를 최소화하는 것처럼 lock 또한 최소 단위로 관리해야 한다.
필자는 lock을 관리하는 총 3가지 방식을 제안한다

1. MethodImplAttribute를 사용해서 메서드 전체를 보호한다. 가장 드물게 사용

[MethodImpl(MethodImplOptions.Synchronized)]
public void IncrementTotal()
{
    total++;
}

 

2. 개발자에게 현재 타입이나 현재 객체에만 락을 걸도록 의무화한다. 즉, 모두가 lock(this)나 lock(MyType)을 사용하도록 권장한다. 하지만 위의 방식은 전 세계 개발자 모두가 가이드를 지켜야 하므로 수행되기 어려움

3. 가장 최선의 선택, 객체의 공유 리소스를 보호하기 위한 핸들을 만드는 것

// 기본 방법
private object syncHandle = new object();
public void IncrementTotal()
{
    lock (syncHandle)
    {
        //생략
    }
}

// 실제로 필요할 시점에 맞추어 동기화 객체를 생성하는 방법
private object syncHandle;
private object GetSyncHandle()
{
    System.Threading.Interlocked.CompareExchange(
        ref syncHandle, new object(), null);
    return syncHandle;
}

public void AnotherMethod()
{
    lock (GetSyncHandle())
    {
        //생략
    }
}
Comments