본문 바로가기
asp.net

[.net] lock

by TTTGGG 2025. 2. 27.
728x90
반응형
SMALL

 lock은 다중 스레드 환경에서 여러 스레드가 동시에 같은 코드 블록을 실행하지 못하도록 막아주는 기능

 즉, lock을 사용하면 한 번에 하나의 스레드만 특정 코드 블록을 실행할 수 있도록 보장하며, 타이머 중복 실행이나 데이터 경합을 방지할 수 있음

 lock을 사용하지 않으면 클라이언트 A와 B가 동시에 호출하면 중복되어 실행될 가능성이 있음 

 

// 스레드 A가 lock이 걸린 블록을 실행하는 동안, 스레드 B, C는 실행을 대기
// 스레드 A가 블록을 빠져나가야만 스레드 B 또는 C가 실행 가능

private static readonly object _lock = new object();

public void SomeMethod()
{
    lock (_lock) // 하나의 스레드만 실행 가능
    {
        Console.WriteLine("스레드가 이 블록을 실행 중...");
        Thread.Sleep(2000); // 2초 대기 (다른 스레드는 이 블록을 실행하지 못함)
        Console.WriteLine("스레드가 블록을 빠져나옴");
    }
}

 

 lock을 사용할 때 주의할 점

  - lock에 사용할 객체는 static readonly object가 가장 적합

    private static readonly object _lock = new object();

  - lock 블록 안에는 최소한의 코드만 포함할 것

    DB 조회, 파일 I/O 등 시간이 오래 걸리는 작업은 lock 블록 밖에서 실행해야 함

    lock을 길게 유지하면 다른 스레드가 오랫동안 대기해야 하므로 성능이 저하될 수 있음

  - lock을 과도하게 사용하지 말 것

    lock을 과도하게 사용하면 병렬 처리 성능이 저하될 수 있음 

    동시 실행이 문제되는 경우에만 lock을 사용해야 함 

728x90
반응형
LIST