IT/Programming / / 2023. 4. 25. 15:48

<Effective Java> RULE 72 스레드 스케줄러에 의존하지 마라

반응형

 

스레드 스케줄러?

· 실행항 스레드가 많을 때, 어떤 스레드를 얼마나 오랫동안 실행 될 지 결정

 

정확성을 보장하거나 성능을 높이기 위해 스레드 스케줄러에 의존하는 프로그램은 이식성이 떨어진다.

 

안정적이고 즉각 반응하며 이식성이 좋은 프로그램을 만드는 방법은 실행 가능 스레드의 평균적 수가 프로세서 수 보다 너무 많이 가지지 않도록 하는 것이다.

 

실행 가능 스레드의 수를 일정 수준으로 낮추는 기법의 핵심은 각 스레드가 필요한 일을 하고 나서 다음에 할 일을 기다리게 만드는 것이다.

 

스레드는 필요한 일을 하고 있지 않을 때는 실행 중이어서는 안 된다.

 

실행자 프레임워크 관점

· 스레드 풀의 크기는 적절히 정하고, 태스크의 크기는 적당히 작게, 그리고 서로 독립적으로 만들라.규칙 68

// CountDownLatch의 잘못된 구현사례 - busy wait
public class SlowCountDownLatch{
    private int count;
    private SlowCountDownLatch(int count){
        if (count < 0)
            throw new IllegalArgumentException(count + " < 0");
        this.count = count;
    }
    
    public void await(){
        while(true){
            syncronized(this){
                if(count == 0) return;
            }   
        }
    }
    
    public syncronized void countDown(){
        if(count != 0) 
            count--;
    }
}
 

SlowCountDownLatch는 1000개의 스레드가 래치를 기다리도록 만들었을 때 2000배 가량 느리다.

바쁘게 대기하는 스레드를 이용하는 프로그램은 스케줄러 변화에 취약하다.

 

다른 스레드에 비해 충분한 CPU시간을 받지 못하는 스레드가 있는 탓에 겨우겨우 동작하느 ㄴ프로그램을 만나더라도, Thread.yield를 호출해서 문제를 해결하려고 하지 마라.

 

프로그램 구조를 바꿔서 병렬적으로 실행 가능한 스레드의 수를 줄이는것이 낫다.

 

스레드 우선순위를 변경하는 것은 자바 플랫폼에서 가장 이식성이 낮은 부분 중 하나다.

· 몇개의 스레드의 우선순위를 변경해서 속도를 향상시킬 필요는 없다.

 

결론

· 프로그램의 정확성을 스레드 스케줄러에 의존하지 말라.

ㄴ 그런 프로그램은 안정적이지도 않고 이식성이 보장되지 않는다.

ㄴ thread.yield나 스레드 우선순위에 의존하지 말라.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유