Lock 이해하기

Icarus_w·2022년 12월 28일
0
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++;
}
profile
하루에 하나

0개의 댓글

관련 채용 정보