멀티쓰레드 코드 만지다가 프로그램이 그냥 멈춰버리는 상황을 겪었어요. 에러도 안 나고 그냥 아무것도 안 하고 대기만 하더라고요. 선배가 데드락(deadlock, 교착상태) 같다고 하는데, 왜 이런 게 생기는 건지 원리가 궁금합니다.


제 코드가 대충 이런 식이었어요. 락을 두 개 쓰는데 쓰레드마다 잡는 순서가 달랐던 것 같아요.


// 쓰레드 A
lockA.acquire()
lockB.acquire()

// 쓰레드 B
lockB.acquire()
lockA.acquire()


이렇게 하니까 둘이 서로 상대방이 가진 락 기다리면서 영원히 멈추더라고요. 검색하니까 데드락 발생 4대 조건(상호배제, 점유대기, 비선점, 순환대기) 이런 게 나오던데 솔직히 용어만 봐서는 잘 와닿지가 않아요. 이 조건들이 실제로 무슨 뜻인지랑, 이걸 깨서 예방하는 현실적인 방법이 뭐가 있는지 초보도 알아듣게 설명 좀 부탁드려요.