Item 72. 스레드 스케줄러에 의존하지 마라.
플랫폼(OS) 환경에 따라서 스레드 우선순위를 정하는 정책이 달라질 수 있기 때문에 실행 결과가 달라질 수 있다. 정확성을 보장하거나 성능을 높이기 위해 스레드 스케줄러 에 의존하는 프로그램은 이식성이 떨어진다.
안정적이고, 즉각 반응하며(responsive) 이식성이 좋은 프로그램을 만드는 가장 좋은 방법은, 실행 가능 스레드의 평균적 수가 프로세스서 수보다 너무 많아 지지 않도록 하는 것이다.
스레드 관리 방안
- 스레드 풀 : 실행 가능 스레드의 평균적 수가 프로세스서 수보다 너무 많아 지지 않도록 구성
- 스레드 : 필요 없는 일을 하고 있을 때, 실행되지 말아야 함.
- 태스크 : 적정한 태스크의 크기를 유지하고 서로 독립적으로 구성, 너무 작아지면 태스크를 실행하는 오버헤드(context switching)가 성능에 악영향을 끼침
- 바쁘게 대기 하는 스레드를 피하라.
public class SlowCountDownLatch{ private int cout; public SlowCountDownLatch(int count){ if(count < 0) throw new IllegalArgumentException(count + " < 0"); this.count = count; } public void await(){ /** * 1,000개의 스레드가 아래의 코드로 인해 기다리면, 2,000배 가량 느려짐 */ while(true){ synchronized (this){ if(count == 0) return; } } } public synchronized void countDown(){ if(count != 0) count --; } }
- 스레드 우선순위 :
Thread.yield
나 다른 여타의 스레드 우선순위 변경 기법을 사용하지 말자. 플랫폼에 종속적이기 때문에 별 효과가 없다. 프로그램의 구조를 변경해서 실행 가능한 스레드의 수를 줄이는 것이 더 좋은 방법이다.(스레드 우선순위는 자바 플랫폼에서 가장 이식성이 낮은 부분임) - 스레드 병행 테스트 :
Thread.yield
대신Thread.sleep(1)
사용
결론
- 플랫폼에서 제공하는 스레드 스케줄러에 의족적인 코드를 작성하지 말자.
- 스레드 우선순위를 조작하는 함수에 의존적에게 코드를 작서하지 말자.