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