liveness 최대로 높이기
데드락
데드락이 걸린 애플리케이션을 정상 상태로 되돌리려면 종료 후 재시작하는 수밖에 없다.
자바 애플리케이션에는 데드락을 자동으로 감지하고 빠져나오게 하는 매커니즘을 제공하지 않는다.
발생 케이스
락 순서에 의한 데드락
문제
두 개의 스레드가 서로 다른 순서로 동일한 락들을 확보하려 할 때 데드락이 발생할 수 있다.
여러 스레드가 락을 확보해야 할 때 모두 동일한 순서로 획득하는 경우 문제가 없다.
예를 들어
X 계좌 -> Y 계좌로 송금 하려는 요청과Y 계좌 -> X 계좌로 송금하려는 요청이 동시에 발생하였고 각각 첫 계좌부터 락을 잡기 시작한다면, 서로 두 번째 계좌의 락을 확보하지 못해 데드락이 발생할 것이다.
해결 방안
identityHashCode 메서드를 통해 두 객체 중 hashcode값이 작은 객체에 대한 락을 먼저 잡고 그 다음 객체에 대한 락을 잡도록 하여, 전역적으로 일관된 순서로 락을 잡도록 보장할 수 있다. 하지만 드문 경우에 hashcode 값이 동일하면서 데드락이 발생할 수 있다.
hashcode 값이 동일한 경우에는 여러 락을 임의의 순서로 확보하는 작업 자체에 대해 타이 브레이킹 락을 확보하여 한 번에 한 스레드만 여러 락을 잡을 수 있도록 할 수 있다.
유일하면서 불변인 값을 기준으로 락 순서를 일정하게 지정한다면 데드락을 방지할 수 있다.
Last updated