방프리
24.04.23 Chapter4. 병렬 처리 (Item 41) 본문
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())
{
//생략
}
}
'C# > More Effective C#' 카테고리의 다른 글
24.04.28 Chapter5. 동적 프로그래밍 (Item 44) (0) | 2024.04.28 |
---|---|
24.04.24 Chapter4. 병렬 처리 (Item 42) (0) | 2024.04.24 |
24.04.20 Chapter4. 병렬 처리 (Item 40) (0) | 2024.04.20 |
24.04.14 Chapter4. 병렬 처리 (Item 39) (1) | 2024.04.14 |
24.04.08 Chapter4. 병렬 처리 (Item 38) (0) | 2024.04.08 |
Comments