liveness 최대로 높이기

데드락

  • 데드락이 걸린 애플리케이션을 정상 상태로 되돌리려면 종료 후 재시작하는 수밖에 없다.

  • 자바 애플리케이션에는 데드락을 자동으로 감지하고 빠져나오게 하는 매커니즘을 제공하지 않는다.

발생 케이스

  • 락 순서에 의한 데드락

    • 문제

      • 두 개의 스레드가 서로 다른 순서로 동일한 락들을 확보하려 할 때 데드락이 발생할 수 있다.

      • 여러 스레드가 락을 확보해야 할 때 모두 동일한 순서로 획득하는 경우 문제가 없다.

      • 예를 들어 X 계좌 -> Y 계좌로 송금 하려는 요청Y 계좌 -> X 계좌로 송금하려는 요청이 동시에 발생하였고 각각 첫 계좌부터 락을 잡기 시작한다면, 서로 두 번째 계좌의 락을 확보하지 못해 데드락이 발생할 것이다.

    • 해결 방안

      • identityHashCode 메서드를 통해 두 객체 중 hashcode값이 작은 객체에 대한 락을 먼저 잡고 그 다음 객체에 대한 락을 잡도록 하여, 전역적으로 일관된 순서로 락을 잡도록 보장할 수 있다. 하지만 드문 경우에 hashcode 값이 동일하면서 데드락이 발생할 수 있다.

      • hashcode 값이 동일한 경우에는 여러 락을 임의의 순서로 확보하는 작업 자체에 대해 타이 브레이킹 락을 확보하여 한 번에 한 스레드만 여러 락을 잡을 수 있도록 할 수 있다.

    • 유일하면서 불변인 값을 기준으로 락 순서를 일정하게 지정한다면 데드락을 방지할 수 있다.

Last updated