[java] 데드락의 발생 조건은?

데드락이 발생하기 위해선 다음과 같은 4가지 조건이 동시에 성립해야 합니다.

  1. 상호 배제 (Mutual Exclusion): 자원은 동시에 한 스레드만이 사용할 수 있어야 합니다. 다른 스레드가 이용하려면 기다려야 합니다.
  2. 점유와 대기 (Hold and Wait): 최소한 하나의 자원을 점유한 상태에서 다른 자원을 기다려야 합니다. 기다리면서 점유하고 있는 자원은 다른 스레드에게도 사용될 수 있으므로 교착 상태가 될 수 있습니다.
  3. 비선점 (No Preemption): 다른 스레드가 점유한 자원을 선점하려고 할 수 없습니다. 자원을 돌려받을 때까지 기다려야 합니다.
  4. 순환 대기 (Circular Wait): 두 개 이상의 스레드가 서로 자원을 대기하며 원형으로 연결된 구조가 형성되어야 합니다.

이렇게 상호 배제, 점유와 대기, 비선점, 순환 대기 네 가지 조건이 동시에 발생하면 데드락이 발생할 수 있습니다. 이러한 조건을 방지하기 위해서는 다양한 동기화 기법을 사용하거나 스레드의 동작을 잘 조정하여야 합니다. 데드락이 발생했을 때는 보통 시스템을 재부팅하여 상황을 해결하게 됩니다.

참고 자료: