DeadLock 이라고 하는 것은, lock을 하고 난 이후에 unlock() 처리를 안해준 것을 말한다.
이러한 DeadLock은 앞서 말했다싶이 lock과 unlock의 짝을 못맞춰 줄 때 일어나지만, 이것은 일부에 불과하다.
그래서 DeadLock이 발생하는 또다른 예시를 들어 볼까 한다.
다음 코드를 살펴보게되면 싱글톤 패턴을 통해서 하나의 인스턴스를 가지고 있는 두개의 클래스를 만들어 주었다.
그런데 해당 클래스는 서로 참조하여 ProcossSave() 메소드 에서는 UserManager에 mutex를 가지고 AccountManager에서도 lock 가진다.
그리고 ProcessLogin() 메소드 에서도 AccountManager에 mutex와 UserManager의 mutex를 가진다.
여기서 main을 보면 thread 를 통해서 두개를 각각의 스레드 환경에서 실행하고 있다.
여기서 문제가 발생하게 된다.
일단 싱글톤으로 선언한 두개의 클래스는 인스턴스가 하나이기 때문에 가지고 있기 때문에 메소드를 통해서 가져오는 mutex 객체는 같은 것이다.
여기서 mutex가 두개기 때문에 만약 한쪽의 쓰레드가 AccountManager의 mutex를 가져가고 다른 한쪽의 쓰레드가 UserManager mutex를 가져가게 되면 문제가 되게 된다.
지금 메소드를 살펴보면 한쪽 LockGuard를 한 후에, 다른 한쪽 LockGuard를 하고 있다. 이 말은 하나의 쓰레드에서 두 쪽 모두의 LockGuard를 실행 해야 한다는 것이다.
그런데 위에서 말했던 상황은 각각 하나씩 가지고 있기 때문에 두번째 LockGuard를 하기 위해서 두 쓰레드 모두 무한정 기다리고 있다는 것이된다.