Favicon

Lock statement

Peponi1/7/20252m

C#
SyntaxStatement

1. Introduction

lock 문은 하나의 스레드만 블록에 접근 가능하도록 하며, 다음과 같이 동작한다.

  1. 잠금을 획득
  2. lock 블록 실행
  3. 잠금 해제
  • 실행되는 동안 다른 스레드는 잠금이 해제될 때까지 대기

lock 블록에는 await 식을 사용할 수 없다. 또한, lock의 잠금 객체로 다음 유형은 사용하지 않도록 한다.

  • this
  • Type
  • string

2. Lock statement

lock 문은 다음과 같이 사용한다.

object _key = new();
 
lock (_key)
{
}

만약 하나의 변수에 멀티스레드 접근을 하는 경우, 아래와 유사한 결과를 얻을 수 있다.

public class Program
{
    private static object _key = new();
    private static bool _isLocked = false;
 
    static async Task Main(string[] args)
    {
        List<Task> tasks = new();
        for (int i = 0; i < 10; i++) tasks.Add(Task.Run(WithLock));
        await Task.WhenAll(tasks);
 
        Console.WriteLine();
 
        tasks = new();
        for (int i = 0; i < 10; i++) tasks.Add(Task.Run(WithoutLock));
        await Task.WhenAll(tasks);
    }
 
    public static void WithLock()
    {
        lock (_key)
        {
            _isLocked = !_isLocked;
            Console.WriteLine(_isLocked);
        }
    }
 
    public static void WithoutLock()
    {
        _isLocked = !_isLocked;
        Console.WriteLine(_isLocked);
    }
}
 
/* WithLock result
True
False
True
False
True
False
True
False
True
False
*/
 
/* WithoutLock result
True
False
False
False
True
False
True
False
True
True
*/

3. 참조 자료