이펙티브 자바 아이템84 : 프로그램의 동작을 스레드 스케줄러에 기대지 말라.

박상준·2024년 7월 27일
0

이펙티브 자바

목록 보기
19/19

스레드 스케줄러?

  • 여러 스레드가 실행 중인 경우 작동한다.
  • 스레드의 실행 시간과 순서를 결정한다.

운영체제별 차이점

  • 정상적인 OS : 공정한 스레드 실행을 보장하지만
  • 구체적인 스케줄링 정책은 사실 OS 마다 상이할 수도 ㅣㅇㅆ다.
  • 그래서..

프로그램 설계시 주의

  1. 스레드 스케줄러 정책에 의존하는 프로그램을 짜는 것은 노노
    • 플랫폼 간의 이식성을 확보해야한다.
  2. 정확성과 성능이 스케줄러에 좌우되는 것은 좋지 못한 프로그래밍 방식이다

어떤것이 견고하고 빠른 .. 이식성 좋은 프로그램일까?

  1. 실행 가능한 스레드 수의 관리

    • 목표 : 프로세서 의 수보다 지나치게 많아지지 않도록 유지해야 한다.
    • 효과 : 스레드 스케줄러의 부담을 줄여야한다.

  2. 스레드 실행 방식

    1. 원칙 : 실행 준비된 스레드는 작업 완료까지 계속적으로 실행한다.
    2. 결과 : 다양한 스케줄링 정책에서도 일관된 동작을 보장한다.

스레드 수 구분

  1. 실행 가능한 스레드 수는
    1. 현재 실행 중이거나 실행 대기 중인 스레드임
  2. 전체 스레드의 수
    1. 프로그램 내의 모든 스레드 포함함
    2. 실행 가능한 스레드보다 훨씬 많을 수 있음
  3. 대기 중인 스레드
    1. 실행 가능한 상태가 아니다.
    2. 전체 스레드 수에는 포함되지만, 실행 가능한 스레드 수에는 미포함이다.

실행 가능한 스레드 수 관리

  • 작업 완료 후에 대기 상태 전환함.
  • 원칙으로는 당장 처리할 작업이 없다면, 실행되지 않아야 한다.

바쁜 대기(busy waiting) 회피

  • 정의
    • 공유 객체의 상태 변화를 지속적으로 검사하는 상태임.
  • 바쁜 대기
    • 스레드가 원하는 조건이 만족될 때까지 계속해서 검사하면서 대기하는 상태를 말함.
  • 문제점
    1. 스레드 스케줄러의 변덕에 취약하다.
    2. 프로세서에 큰 부담을 준다.
    3. 다른 유용한 작업의 실행 기회를 박탈한다.

잘못된 구현방식

public class SlowCountDownLatch {
    private int count;
    
    public SlowCountDownLatch(int count) {
        if (count < 0)
            throw new IllegalArgumentException(count + " < 0");
        this.count = count;
    }
    
    public void await() {
        while (true) {
            synchronized(this) {
                if (count == 0)
                    return;
            }
        }
    }
    
    public synchronized void countDown() {
        if (count != 0)
            count--;
    }
}
  • await 에서 에서
    • 빠른 대기 상태를 유발함.
    • CPU 자원이 낭비
  • 비효율적인 동기화
    • 매 반복마다 동기화 블록 진입과 탈출

결론

  • 뭔 소리를 주저리하는지..
  • 그냥 스레드 우선순위는 OS 혹은 스레드 스케줄러마다 다르다. 의존하지 말고, 스레드 우선순위를 제어하려고 하지말고, 의존도 하지말것.
profile
이전 블로그 : https://oth3410.tistory.com/

0개의 댓글