Java

Effective Java 제 11장 - 동시성

iksadnorth 2023. 8. 22. 23:08

해당 게시물은 책 'Effective Java'를 참고하고 작성했습니다.

공유 중인 가변 데이터는 동기화해 사용해라!
Synchronized 키워드로 데이터 변경은 하나의 쓰레드만 수행할 수 있도록 만들어라.

최대한 동기화 블럭 크기를 줄여라!
동기화 블럭을 크게 잡아두면 교착 상태에 놓일 확률이 크다.
뿐만 아니라 성능도 크게 저하되므로 되도록 최소한 사용하고 적은 범위에 적용해라!

wait, notify보다 동시성 유틸리티를 애용해라!
wait, notify는 매우 저수준의 쓰레드 처리 메서드다. 때문에 사용하기 굉장히 까다롭고 위험하다.
이것들을 쉽고 안전하게 사용할 수 있게 고수준 동시성 유틸리티를 만들어 놓았다.
java.util.concurrent에 이러한 고수준 유틸리티가 많이 구현되어 있으니 이러한 메서드를 사용해라!

스레드 안전성 수준을 문서화해라!
약간 난해한 부분이라 2회독에서 자세하게 다루기로 한다.
간단히 말하면 쓰레드에 안전 or 안전하지 못함으로 나누지 말고 세세하게
불변, 무조건적 스레드 안전, 조건부 스레드 안전, 스레드 안전하지 않음, 스레드 적대적 등으로 문서화하라고 한다.

지연 초기화는 신중히 사용해라!
동시성을 다룰 때, 필드의 초기화 시점은 엇갈릴 수 있다. 때문에 성능을 늘리기 위해서 지연 초기화를 사용해
스레드에 불안정한 상태로 만들바엔 Eager 초기화를 하고 동시성을 적용하는 것이 낫다.
그래도 무조건 사용해야 한다면 double-check 관용구를 사용해서 지연 초기화를 해라!