DeadLock

원래벌레·2022년 4월 10일
0

💎 DeadLock

  • 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를 하기 위해서 두 쓰레드 모두 무한정 기다리고 있다는 것이된다.

profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글