02 Aug 2023 EffectiveJava
API문서에서 아무런 언급도 없으면 그 클래스 사용자는 나름의 가정을 해야만 한다.
만약 그 가정이 틀리면 클라이언트 프로그램은 동기화를 충분히 하지 못하거나 지나치게 한 상태이며, 두 경우 모두 심각한 오류로 이어질 수 있다.
스레드 안정성 문서화
API 문서에 synchronized 한정자가 보이는 메서드는 스레드 안전하다는...
01 Aug 2023 EffectiveJava
wait와 notify는 Object 객체의 메서드로 스레드를 제어하는 기능이다.
wait() : wait()을 호출하면 현 스레드의 객체의 lock을 풀고 대기상태에 들어가면서 제어권을 다른 쓰레드에게 양보하게 됩니다. synchronized 블럭 내에서만 호출이 가능하며, 객체에 락이 걸려있지 않을 경우 에러를 발생합니다.
notify() : 대기하고 있는 스레드중 임의의...
31 Jul 2023 EffectiveJava
실행자 프레임워크(ExecutorService)
이 책의 2판이 나오기 앞서 java.util.concurrent 패키지가 등장했다.
이 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다.
실행자 프레임워크는 클라이언트가 요청한 작업을 백그라운드 스레드에 위임해 비동기적으로 처리하는데, 앞서 구현한 초판의 코드보다 모든 면에서 뛰어난 작업...
29 Jul 2023 EffectiveJava
저번 Item에서는 충분하지 못한 동기화의 피해를 다뤘다면, 이번엔 반대의 상황을 다뤄보자.
과도한 동기화
과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 예측할 수 없는 동작을 낳기도 한다.
응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안된다.
재정의할 수 있는 메서드나,...