[java] 스레드 데드락(Deadlock)과 대응 방법

스레드 데드락은 멀티스레드 프로그래밍에서 발생할 수 있는 심각한 문제입니다. 이러한 데드락 상황은 두 개 이상의 스레드가 서로가 각자 가지고 있는 자원을 점유하고 있어서 다음 단계로 진행할 수 없는 상태를 의미합니다.

데드락이 발생하는 경우

데드락은 일반적으로 다음과 같은 조건들이 동시에 충족될 때 발생합니다:

  1. 상호 배제(Mutual Exclusion): 자원은 한 번에 한 스레드만 사용할 수 있어야 합니다.
  2. 점유와 대기(Hold and Wait): 최소한 하나의 자원을 점유한 상태에서 다른 자원을 요청하고 기다리는 경우가 발생할 수 있습니다.
  3. 비선점(No Preemption): 다른 스레드가 점유한 자원을 강제로 뺏을 수 없어야 합니다.
  4. 순환 대기(Circular Wait): 각 스레드는 순환적으로 자원을 요구해야 합니다.

데드락 대응 방법

데드락을 예방하거나 해결하기 위해 여러 대응 방법이 존재합니다. 일반적인 대응 방법들은 다음과 같습니다:

  1. 상호 배제 방지: 자원의 공유를 허용하거나, 상호 배제를 사용하는 시나리오를 최소화합니다.
  2. 점유와 대기 방지: 자원을 요청할 때 이미 점유 중인 자원을 가지고 있지 않은 경우에만 요청을 허용합니다.
  3. 비선점 방지: 다른 스레드가 이미 점유 중인 자원을 강제로 뺏을 수 있도록 자원 할당 정책을 변경합니다.
  4. 순환 대기 방지: 자원 요청은 일정한 순서로 이루어지도록 합니다.

또한, 데드락 상황을 검출하고 대응하기 위해 다음과 같은 방법들도 사용됩니다:

  1. 자원 할당 그래프(Resouce Allocation Graph)를 사용하여 데드락 상태를 검출합니다. 이후, 상호 배제, 점유와 대기, 비선점, 순환 대기 중 어떤 조건이 성립하는지 확인하고 대응 방법을 선택합니다.
  2. 타임아웃(Timeouts)을 사용하여 점유한 자원을 일정 시간 동안 점유한 상태로 두지 않습니다.
  3. 프로세스 종료(Process Termination)를 통해 데드락을 해결할 수 있습니다. 그러나 이 방법은 다른 스레드에 의해 사용 중인 자원을 강제로 해제하기 때문에 주의해야 합니다.

데드락은 프로그램의 신뢰성을 저하시키는 심각한 문제이므로, 위에 언급한 대응 방법들을 적용하여 데드락을 피하고 해결할 필요가 있습니다.

자바에서 데드락 대응 방법 참고