Search

Item 84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라

생성일
2023/08/24 03:25
챕터
11장 -동시성

요약

멀티 스레딩 환경

스케줄링을 직접 관리하자
여러 스레드를 실행시키면 운영체제에서 어떤 스레드를 얼마나 오래 실행시킬지 결정하는데, 이런 스케줄링 정책은 운영체제마다 달라질 수 있다.
성능이나 정확성이 스케줄러마다 달라지는 프로그램이라면, 다른 플랫폼에 이식하기에 어려워진다.
스레드 수 제한하기
견고하고 이식성 좋은 프로그램을 작성하는 좋은 방법은, 실행 가능한 스레드의 평균적인 수를 프로세서 수보다 지나치게 많아지지 않도록 하는 것이다.
실행 가능한 스레드의 수를 적게 유지하는 방법은 스레드가 작업을 완료한 뒤에 다음 일거리가 생길 때까지 대기 상태로 두는 것이다. 다시 말해 스레드가 당장 처리해야할 작업이 없다면 실행하지 말자.
스레드 풀의 크기를 적절하게 설정하고 작업을 짧게 유지하되, 너무 짧으면 작업을 분배하는 작업이 오히려 성능을 떨어뜨릴 수 있다.
바쁜 대기(busy waiting) 상태
공유 객체의 상태가 바뀔 때까지 쉬지 않고 검사하는 바쁜 대기 상태를 만들지 말자.
스레드를 바쁜 대기 상태로 만드는 것은 스레드 스케줄러에 영향을 많이 받고 프로세서에 큰 부담을 주어 다른 유용한 작업의 수행 기회를 박탈한다.
하나 이상의 스레드가 필요도 없이 실행 가능한 상태로 둔다면 성능과 이식성이 떨어질 것이다.
Thread.yield
Thread.yield를 사용하지 말자.
Thread.yield를 사용하여 성능이 개선될 수는 있지만, 이식성은 그렇지 않다. 다른 환경의 JVM에서는 오히려 성능이 떨어질 수도 있다.
Thread.yield는 테스트할 방법도 없다.
스레드 우선순위
스케줄링을 위해 스레드 우선순위를 조절하는 방법도 있지만, 이 역시 자바에서 이식성이 가장 나쁜 특성 중 하나다.
다른 환경에서는 스레드가 어떤 우선순위를 가질지 알 수 없다.
스레드 응답 불가 문제가 있다면 우선순위를 조절할게 아니라 진짜 문제를 찾아 해결하자.