본문 바로가기
Programming/C# & .NET

[C#] lock 문 사용법

by Kor-IT 2022. 8. 3.
반응형

C# lock 문

 

소개

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]

lock 문 미사용 결과

 

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]

lock 문 사용 결과

 

반응형

댓글