C#의 lock 키워드는 스레드 간 동기화를 위해 사용되는 기능입니다. 여러 스레드가 동일한 리소스(예: 객체, 변수)에 동시에 접근할 때 데이터 무결성을 보장하고 데이터 경쟁 상태(Race Condition)를 방지합니다.
lock (object)
{
// 보호할 코드
}
using System;
using System.Threading;
class Program
{
private static int counter = 0;
static void Main()
{
Thread t1 = new Thread(IncrementCounter);
Thread t2 = new Thread(IncrementCounter);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine($"최종 Counter 값: {counter}");
}
static void IncrementCounter()
{
for (int i = 0; i < 10000; i++)
{
counter++;
}
}
}
//출력 예시 (실행마다 달라짐):
최종 Counter 값: 15783
using System;
using System.Threading;
class Program
{
private static int counter = 0;
private static readonly object lockObject = new object();
static void Main()
{
Thread t1 = new Thread(IncrementCounter);
Thread t2 = new Thread(IncrementCounter);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine($"최종 Counter 값: {counter}");
}
static void IncrementCounter()
{
for (int i = 0; i < 10000; i++)
{
lock (lockObject)
{
counter++;
}
}
}
}
//최종 Counter 값: 20000
lock은 멀티스레드 프로그래밍에서 가장 간단하고 안전한 동기화 방법 중 하나입니다. 하지만 더 정교한 동기화가 필요한 경우, Monitor나 다른 동기화 도구를 고려할 수 있습니다.