반응형
소개
lock 문은 지정된 개체에 대한 상호 배제 잠금을 획득하여 명령문 블록을 실행한 다음, 잠금을 해제한다. 잠금이 유지되는 동안 잠금을 보유하는 스레드(Thread)는 잠금을 다시 획득하고 해제할 수 있다. 쉽게 말해 다른 하나의 스레드가 잠금을 획득하면 다른 스레드는 기다리고 있다 잠금이 해제될 때까지 기다리고 잠금이 풀렸을 경우 또 다른 하나의 스레드가 잠금을 얻는 거다.
lock 문이 필요한 경우는 멀티스레드(Multi-Thread)인 경우 동일한 필드에 액세스 하여 잘못된 결과를 도출을 막기 위하여 사용된다. 이런 경우를 Thread-Unsafe 하다고 한다.
반응형
사용법
사용법은 아주 간단하다. lock 호출하여 브레이스로 감싸면 된다.
lock(x)
{
// code..
}
여기서 x는 참조 형식이며 보편적으로 object 타입의 private 필드를 사용한다. 간혹 this 키워드를 사용하여 lock(this)와 같이 사용하는데 이는 의도치 않게 Dead Lock(교착상태)을 발생시키거나 Lock Granularity를 떨어뜨리는 심각한 부작용을 야기할 수 있다. lock을 사용 시에는 필요한 부분만 Locking 해야 한다. lock 문 안에 오래 걸리는 작업이 진행되면 잠금 경합이 늘어나기 때문에 최대한 짧은 시간 동안 잠금을 유지하도록 해야 한다.
예시
lock 미사용
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Start");
Program program = new Program();
foreach (int idx in Enumerable.Range(0, 10))
{
new Thread((program.Working)).Start(idx.ToString());
}
Console.WriteLine("MAIN End");
}
public void Working(object name)
{
count++;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
Thread.Sleep(200);
}
}
Console.WriteLine(name);
}
}
[Output]
728x90
lock 사용
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Start");
Program program = new Program();
foreach (int idx in Enumerable.Range(0, 10))
{
new Thread((program.Working)).Start(idx.ToString());
}
Console.WriteLine("MAIN End");
}
public void Working(object name)
{
lock (lockObject)
{
count++;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
Thread.Sleep(200);
}
}
Console.WriteLine(name);
}
}
}
[Output]
반응형
'Programming > C# & .NET' 카테고리의 다른 글
[C#] JsonConvert null 해결방법 (1) | 2022.10.13 |
---|---|
[C#] Json 직렬화/역직렬화 속성 제외하는 방법 (1) | 2022.09.14 |
[C#] 멀티스레드 (Multi-Thread) (1) | 2022.08.02 |
[C#] 스레드(Thread) (1) | 2022.07.28 |
[C#] Sequence contains no elements 오류 해결 (1) | 2022.07.05 |
댓글