두 쓰레드가 락을 잡고 서로 락이 풀리기를 대기한다면??? -> 또 다른 데드락이 발생
class SessionManager
{
// 클래스 각각 자신의 lock이 있다고 가정하자
static object _lock = new object();
public static void Test()
{
lock(_lock)
{
// 내가 lock을 잡은 상태로 다른 클래스의 lock잡는 함수를 호출
UserManager.TestUser();
}
}
public static void TestSession()
{
lock(_lock)
{
}
}
// ...
}
class UserManager
{
static object _lock = new object();
public static void Test()
{
lock(_lock)
{
SessionManager.TestSession();
}
}
public static void TestUser()
{
lock(_lock)
{
}
}
// ...
}
// 여기서 주의할 점은 Thread의 타이밍이 조금만 어긋나도 이러한 데드락은 발생하지 않는다
// 오히려 이런 부분이 데드락을 잡기를 어렵게 하는 부분이다.
static void Thread_1()
{
for(int i = 0; i < 100000; i++)
{
SessionManager.Test();
}
}
static void Thread_2()
{
for(int i = 0; i < 100000; i++)
{
UserManager.Test();
}
}
해결방법이 있나??
사실 일정시간을 대기하다가 lock을 못잡을 시 알려주는 코드가 있지만
위험을 피해가는 것이 불과하다.
오히려 이런 데드락이 발생하면 lock을 순서를 바꾸는 방향으로 해결하는게 나음. 따라서 데드락이 발견되고 해결하는 방향이 옳을 수 있음(미리 예방이 거의 불가능하다)