using System;
namespace ServerCore
{
class Program
{
static int number = 0;
static object _obj = new object();
static void Thread_1()
{
for (int i = 0; i < 100000; i++)
{
Monitor.Enter(_obj); // 문을 잠구는 행위
{
number++;
}
Monitor.Exit(_obj); // 잠금을 풀어준다.
}
}
}
}
상호배제(Mutual Exclusive)
Monitor.Enter()와 Monitor.Exit() 사이에 있는 코드사이에는 들어올 수 가 없다.
문제점 : 코드가 길어진다면 관리가 힘들어질 수 있다.
for (int i = 0; i < 100000; i++)
{
Monitor.Enter(_obj); // 문을 잠구는 행위
{
number++;
return;
}
Monitor.Exit(_obj); // 잠금을 풀어준다.
}
이런 경우 잠금을 풀어줄 수가 없다.
즉, 데드락(DeadLock) 상태에 빠지게 된다.
try
{
Monitor.Enter(_obj);
{
number++;
return;
}
}
finally
{
Monitor.Exit(_obj);
}
이런식으로 해결이 가능하다.
하지만 대체로 잘 사용되지 않는 방법이고 lock 키워드를 사용한다.
lock(_obj)
{
number++;
}