본문 바로가기

Reading/Effective Java

(65)
[Effective-Java] Item 84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라 여러 스레드가 실행 중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 결정하는데, 구체적 스케줄링 정책은 운영체제마다 다를 수 있다. 따라서 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램은 다른 플랫폼에 이식이 어렵다. 이식성이 좋은 프로그램을 작성하는 방법 실행 가능한 스레드의 평균적인 수를 프로세서 수보다 지나치게 많아지지 않도록 하자 실행 준비가 된 스레드는 맡은 작업을 완료할 때까지 계속 실행되도록 만들어야한다. 이렇게 한다면 os의 스레드 스케줄링 정책이 상이한 시스템에서도 동작이 크기 달라지지 않는다. 단, 여기서 알아야할 점은 전체 스레드 수와 실행 가능한 스레드 수는 다르다. 전체 스레드 수는 훨씬 많을 수 있고 대기 중인 스레드는 실행 가능하지 않으니까...
[Effective-Java] Item 83. 지연 초기화는 신중히 사용하라 지연 초기화(lazyinitialization): 필드의 초기화 시점을 그 값이 처음 필요할 때까지 늦추는 기법 값이 전혀 쓰이지 않으면 초기화도 결코 일어나지 않고 정적 필드와 인스턴스 필드 모두 사용할 수 있다. 최적화 용도와 클래스와 인스턴스 초기화 때 위험한 순환 문제도 해결해준다. 하지만 가능한 필요할 때 까지는 하지말자. 지연초기화도 트레이드 오프가 발생한다. 클래스 혹은 인스턴스 생성 시의 초기화 비용은 줄지만, 지연 초기화하는 필드에 접근하는 비용은 커진다. 지연 초기화 하려는 필드들 중 초기화가 이뤄지는 비율, 실제 초기화에 드는 비용, 초기화된 각 필드를 얼마나 빈번히 호출하냐 따라 지연 초기화가 실제로는 성능을 느려지게할 수 있다. 즉, 해당 클래스의 인스턴스 중 그 필드를 사용하는 ..
[Effective-Java] Item 82. 스레드 안전성 수준을 문서화하라 한 메소드를 여러 스레드가 동시 호출할 때 어떻게 동작하냐는 중요하다. API 문서에 아무 언급이 없으면 클래스 사용자는 여러가지 가정을 해야한다. 가정이 틀릴 경우 동기화를 충분히 하지 못하거나 지나치게 하는 상황을 초래할 수 있고 두 경우 다 심각한 오류로 이어질 수 있다. API 문서의 synchronized 한정자 API 문서에 synchronized 한정자가 보이는 메소드는 스레드 안전하다고 100% 확신할 수 없다. 자바독이 기본 옵션에서 생성한 API 문서에는 synchronized 한정자가 포함되지 않는다. 메소드 선언에 synchronized 한정자를 선언할지는 구현 이슈일 뿐 API에 속하지 않기 떄문이다. synchronized 유무로 스레드 안전성을 알수있다는 것은 모 아니면 도라는..
[Effective-Java] Item 81. wait와 notify보다는 동시성 유틸리티를 애용하라 갖고 있던 고유 락을 해제하고, 스레드를 잠들게 하는 wait와 잠들어 있던 스레드 중 임의로 하나를 골라 깨우는 notify는 synchronized 블록이나 메소드에서 호출되어야하고, 올바르게 사용하기 까다로우니 고수준 동시성 유틸리티를 사용하자. java.util.concurrent의 고수준 유틸리티는 세 범주로 나눌 수 있다. 그 중 하나는 아이템80에서 설명했던 실행자 프레임워크다. 이 외에 두 가지가 더 있다. 동시성 컬렉션(Concurrent Collection) 동시성 컬렉션은 List, Queue, Map 같은 표준 컬렉션 인터페이스에 동시성을 가미해 구현한 고성능 컬렉션으로, 높은 동시성에 도달하기 위해 동기화를 각자의 내부에서 수행한다. 따라서 동시성 컬렉션에서 동시성을 무력화하는 건..