[Concurrency] 데드락(deadlock)과 라이브락(live lock)

데드락과 라이브락은 둘다 Lock 기반의 동기화 기능을 사용할때 발생할 수 있는 동시성 버그를 말한다.



데드락

데드락은 lock으로 인한 대기가 "무한하게" 지속되는 상태를 말한다.

로직의 꼬임으로 인해 A 스레드가 lock을 점유한 상태에서 lock을 놓지 않고, 그것으로 인해 다른 B 스레드가 계속해서 무한 대기 상태에 빠지는 것이다.

이를 회피하기 위해서는 lock을 점유하는 시간을 최소한으로 하고, 사용했으면 lock을 바로바로 풀어주도록 하는 것이 좋다.

그렇게 할수 없는 상황이라면 뭐... 직접 보고 꼬인 실타래를 잘 푸는 수밖에 없다.




라이브락

라이브락은 Lock이 무한대기를 하지는 않는데, 의미없는 Lock 획득과 해제가 끝없이 반복돼서 헛도는 어정쩡한 상태를 말한다.

이것도 대충 데드락과 비슷한 동시성 버그다. 헛도는건 똑같다.

보통 데드락을 해결하려고 고치다가 라이브락이 되는 경우가 많다...

라이브락이 발생하는 상황이라면, 아마 코드 형태가 이상하게 되어있을 것이다.



참조
https://cheetile.tistory.com/entry/OS-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%AC%B8%EC%A0%9C-Race-Condition-Deadlock-Starvation-Livelock
https://stackoverflow.com/questions/6155951/whats-the-difference-between-deadlock-and-livelock
https://jojozhuang.github.io/programming/java-concurrency-dead-lock/