-
스레드에서 발생하는 문제들Backend/Java and Trouble Shooting 2020. 2. 22. 21:43
스레드에서 다음과 같은 문제가 발생할 수 있다.
- 레이스 컨디션
- 데드록
- 스타베이션
- 라이브 록
- 다른 형태의 예측 불가 오류
1. 레이스 컨디션
멀티 스레드 환경에서 하나 이상의 '공유 데이터'를 처리할 때 아무런 록 처리를 하지 않을 경우, 동시에 여러 스레드에서 데이터를 수정해 버릴 수도 있다. 경우에 따라 동시에 스레드가 처리하러 들어왔을 때 데이터가 꼬여서 무한 대기하거나 무한 루프에 빠지는 경우를 레이스 컨디션 이라 한다.
2. 데드록
데이터를 안전하게 처리하기 위해서 거는 록에서 문제가 발생할 수도 있다. 두 개 이상의 스레드에서 이 록을 서로 풀리기만을 기다리는 상황을 데드록이라 한다.
-
스레드 1이 DataA에 록을 건 상태에서 변경 처리 후, DataB에 접근하려고 한다.
-
스레드 2이 DataB에 록을 건 상태에서 변경 처리 후, DataA에 접근하려고 한다.
두 스레드가 동시에 요청되어 서로 물고 물리는 상황이 발생하고, 둘 다 대기하고 있는 상태에 빠졌다.
"Dead Lock" 이 발생했구나!3. 스타베이션
데드록과 비슷하지만 원인은 다르다. 멈추어 있는 스레드가 이론적으로 수행은 할 수 있지만, CPU로 부터 일할 기회를 받지 못하는 경우를 스타베이션이라 한다. 스레드 우선순위가 다른 스레드 보다 낮으면 해당 스레드는 스타베이션에 빠질 수 있다. 일반적으로 스레드 우선순위는 건드리지 않는 것이 좋다.
4. 라이브 록
2개의 스레드가 서로 응답을 반복적으로 계속 주고받는 경우를 라이브 록이라 한다.
- 데드록은 CPU를 점유하지 않고 멈추어 버리지만, 라이브 록은 멈추지 않고 지속해서 수행하므로 CPU까지 점유할 확률이 높다. CPU 코어 하나를 모두 점유해 버릴 수 있어 CPU 사용량을 함께 모니터링 하는 것이 좋다.
참고 자료: 자바 트러블 슈팅. 이상민 지음
'Backend > Java and Trouble Shooting' 카테고리의 다른 글
스프링부트 + Oracle 메이븐 프로젝트 만들기 (0) 2020.03.17 Java의 메모리 영역 (0) 2020.02.23 스레드 덤프로 확인할 수 있는 문제 (0) 2020.02.23