본문 바로가기
728x90
반응형

Technology/Effective Java 3E57

Item 84: 프로그램의 동작을 스레드 스케줄러에 기대지 말라 스레드 스케줄러 여러 스레드가 실행 중이면 운영체제의 스레드 스케줄러가 어떤 스레드를 얼마나 오래 실행할지 정한다. 정상적인 운영체제라면 이 작업을 공정하게 수행하지만 구체적인 스케줄링 정책은 운영체제마다 다를 수 있다. 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다. 견고하고 빠릿하고 이식성 좋은 프로그램을 작성하는 가장 좋은 방법, 실행 가능한 스레드의 평균적인 수를 프로세서 수보다 지나치게 많아지지 않도록 하는 것이다. 실행 준비가 된 스레드들은 맡은 작업을 완료할 때까지 계속 실행되도록 만들자. 이런 프로그램이라면 스레드 스케줄링 정책이 아주 상이한 시스템에서도 동작이 크게 달라지지 않는다. 실행 가능한 스레드의 수와 전체 스레드 수는 구분해야 한다.. 2022. 2. 20.
Item 83: 지연 초기화는 신중히 사용하라 지연 초기화(lazy initialization), 필드의 초기화 시점을 그 값이 처음 필요할 때까지 늦추는 기법이다. 그래서 값이 전혀 쓰이지 않으면 초기화도 결코 일어나지 않는다. 이 기법은 정적 필드와 인스턴스 필드 모두에 사용할 수 있다. 지연 초기화는 주로 최적화 용도로 쓰이지만, 클래스와 인스턴스 초기화 때 발생하는 위험한 순환 문제를 해결하는 효과도 있다. 다른 모든 최적화와 마찬가지로 지연 초기화에 대해 해줄 최선의 조언은 "필요할 때까지는 하지 말라"다(아이템 67). 지연 초기화는 양날의 검이다. 클래스 혹은 인스턴스 생성 시의 초기화 비용은 줄지만 그 대신 지연 초기화하는 필드에 접근하는 비용은 커진다. 지연 초기화하려는 필드들 중 결국 초기화가 이뤄지는 비율에 따라, 실제 초기화에 .. 2022. 2. 20.
Item 82: 스레드 안전성 수준을 문서화하라 API 문서에 synchronized 한정자, API 문서에 synchronized 한정자가 보이는 메서드는 스레드 안전하다? 이 말은 몇 가지 면에서 틀렸다. 자바독이 기본 옵션에서 생성한 API 문서에는 synchronized 한정자가 포함되지 않는다. 메서드 선언에 synchronized 한정자를 선언할지는 구현 이슈일 뿐 API에 속하지 않는다. 따라서 이것만으로는 그 메서드가 스레드 안전하다고 믿기 어렵다. 스레드 안전성 수준, 멀티스레드 환경에서도 API를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다. 다음 목록은 스레드 안전성이 높은 순으로 나열한 것이다. 불변(immutable): 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화도 필요 없다... 2022. 2. 20.
Item 81: wait와 notify보다는 동시성 유틸리티를 애용하라 wait와 notifiy는 올바르게 사용하기가 아주 까다로우니 고수준 동시성 유틸리티를 사용하자. 자바 5에서 도입된 고수준의 동시성 유틸리티가 wait와 notify로 하드코딩해야 했던 전형적인 일들을 대신 처리해주기 때문이다. java.util.concurrent의 고수준 유틸리티는 세 범주로 나눌 수 있다. 실행자 프레임워크(executor framework) 동시성 컬렉션(concurrent collection) 동기화 장치(synchronizer) 실행자 프레임워크는 아이템 80에서 가볍게 살펴보았고, 동시성 컬렉션과 동기화 장치는 이번 아이템에서 살펴본다. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summar.. 2022. 2. 20.
728x90
반응형