[java] 데드락(Deadlock)이란 무엇인가?

데드락은 멀티스레드 프로그래밍에서 발생할 수 있는 상태로, 두 개 이상의 스레드가 서로 상대방이 가진 자원을 기다리는 상태에서 무한정 대기하는 현상을 말합니다. 이 상태에서는 어떤 스레드도 진행할 수 없으며, 프로그램은 더 이상 실행되지 않습니다.

데드락은 일반적으로 네 가지 조건이 동시에 충족될 때 발생합니다:

  1. 상호 배제(Mutual Exclusion): 자원은 여러 개의 스레드가 동시에 접근할 수 없어야 합니다.
  2. 점유 대기(Hold and Wait): 한 스레드가 자원을 점유한 상태에서 다른 스레드가 필요한 자원을 대기하고 있어야 합니다.
  3. 비선점(No Preemption): 다른 스레드가 이미 점유한 자원을 강제로 빼앗을 수 없어야 합니다.
  4. 환형 대기(Circular Wait): 스레드 간에 환형으로 자원을 점유한 상태에서 대기하는 순환이 형성되어야 합니다.

데드락은 시스템의 성능을 저하시키고, 심각한 경우에는 시스템이 완전히 멈추는 결과를 초래할 수 있습니다. 따라서 데드락을 피하기 위해서는 스레드가 자원을 점유할 때 순서를 지정하거나, 자원을 점유하기 전에 필요한 자원을 모두 확보하는 등의 방법을 사용할 수 있습니다.

또한, Java에서는 java.util.concurrent 패키지에 있는 LockCondition을 사용하여 데드락을 피할 수 있는 동기화 기능을 제공합니다. 이들은 우선순위와 타임아웃을 설정하여 데드락이 발생하지 않도록 도움을 줍니다.

더 자세한 내용은 다음 참조를 참고하시기 바랍니다: