[java] 스레드 데드락(Deadlock)과 대응 방법
스레드 데드락은 멀티스레드 프로그래밍에서 발생할 수 있는 심각한 문제입니다. 이러한 데드락 상황은 두 개 이상의 스레드가 서로가 각자 가지고 있는 자원을 점유하고 있어서 다음 단계로 진행할 수 없는 상태를 의미합니다.
데드락이 발생하는 경우
데드락은 일반적으로 다음과 같은 조건들이 동시에 충족될 때 발생합니다:
- 상호 배제(Mutual Exclusion): 자원은 한 번에 한 스레드만 사용할 수 있어야 합니다.
- 점유와 대기(Hold and Wait): 최소한 하나의 자원을 점유한 상태에서 다른 자원을 요청하고 기다리는 경우가 발생할 수 있습니다.
- 비선점(No Preemption): 다른 스레드가 점유한 자원을 강제로 뺏을 수 없어야 합니다.
- 순환 대기(Circular Wait): 각 스레드는 순환적으로 자원을 요구해야 합니다.
데드락 대응 방법
데드락을 예방하거나 해결하기 위해 여러 대응 방법이 존재합니다. 일반적인 대응 방법들은 다음과 같습니다:
- 상호 배제 방지: 자원의 공유를 허용하거나, 상호 배제를 사용하는 시나리오를 최소화합니다.
- 점유와 대기 방지: 자원을 요청할 때 이미 점유 중인 자원을 가지고 있지 않은 경우에만 요청을 허용합니다.
- 비선점 방지: 다른 스레드가 이미 점유 중인 자원을 강제로 뺏을 수 있도록 자원 할당 정책을 변경합니다.
- 순환 대기 방지: 자원 요청은 일정한 순서로 이루어지도록 합니다.
또한, 데드락 상황을 검출하고 대응하기 위해 다음과 같은 방법들도 사용됩니다:
- 자원 할당 그래프(Resouce Allocation Graph)를 사용하여 데드락 상태를 검출합니다. 이후, 상호 배제, 점유와 대기, 비선점, 순환 대기 중 어떤 조건이 성립하는지 확인하고 대응 방법을 선택합니다.
- 타임아웃(Timeouts)을 사용하여 점유한 자원을 일정 시간 동안 점유한 상태로 두지 않습니다.
- 프로세스 종료(Process Termination)를 통해 데드락을 해결할 수 있습니다. 그러나 이 방법은 다른 스레드에 의해 사용 중인 자원을 강제로 해제하기 때문에 주의해야 합니다.
데드락은 프로그램의 신뢰성을 저하시키는 심각한 문제이므로, 위에 언급한 대응 방법들을 적용하여 데드락을 피하고 해결할 필요가 있습니다.