Thread dump(Javacore) 분석 – Dead Lock
Locking에 의해서 발생 할 수 있는 또 다른 문제는 dead lock 현상입니다. 두개 이상의 Thread가 서로 lock을 잡고 기다리는 “환형대기조건”이 성립되었을 때 서로 lock이 풀리지 않고 무한정 대기하는 현상을 이야기 합니다.
그림 1 을 보면 Thread1 은 methodA를 수행하고 있는데, synchronized methodB를 호출하기 전에 Thread2가 methodB가 끝나기를 기다리고 있습니다. 마찬가지로 Thread2는 Thread3가 수행하고 있는 methodC가 끝나기를 기다라고 있고, methodC 에서는 Thread1에서 수행하고 있는 methodA 가 끝나기를 기다리고 있습니다. 즉 각각의 메소드들이 서로 끝나기를 기다리고 있는 “환형 대기조건”이기 때문에 이 application의 3개의 쓰레드들은 프로그램이 진행되지 않게 됩니다.
[그림1]. 환형 대기조건에 의한 deadlock
이러한 “환형대기조건”에 의한 deadlock은 Thread Dump를 추출해 보면 그림2와 같은 패턴을 띄우고 있으며 시간이 지나도 풀리지 않습니다.
[그림 2]. DeadLock이 걸렸을 때 시간진행에 따른 Thread의 상태
[그림 3]. Deadlock이 걸린 IBM AIX Thread Dump
DeadLock의 검출은 Locking Condition을 비교함으로써 검출 할 수 있으며, 최신 JVM들에서는 Thread Dump 추출 시 만약 DealLock이 있다면 해당 DeadLock을 찾아 주는 기능을 가지고 있습니다. 그림 3에서 1)항목을 보면 현재 8번 쓰레드가 잡고 있는 Lock은 10번과 6번 쓰레드가 기다리고 있음을 알 수 있으며, Lock은 OracleConnection에 의해서 잡혀 있음을 확인 할 수 있습니다.
그림 3의 2)번 항목을 보면 이 6번 쓰레드는 OracleStatement에서 Lock을 잡고 있는데, 이 Lock을 8번 쓰레드가 기다리고 있습니다.
결과적으로 6번과 8번은 서로 Lock을 기다리고 있는 상황이 되어 Lock이 풀리지 않는 Dead Lock 상황이 됩니다.
해결방안
Dead Lock의 해결 방안은 서로 Lock을 보고 있는 것을 다른 Locking Object를 사용하거나 Lock의 방향(Synchronized call의 방향)을 바꿔줌으로써 해결 할 수 있습니다. User Application에서 발생한 경우에는 synchronized method의 호출 순서를 “환형 대기조건”이 생기지 않도록 바꾸도록 하고, 위와 같이 Vendor들에서 제공하는 코드에서 문제가 발생한 경우에는 Vendor에 패치를 요청하여 해결 하도록 해야 합니다.