Item 82 : 스레드 안전성 수준을 문서화하라
2021. 9. 19. 13:12
- 멀티스레드 환경에서도 API 문서를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다.
스레드 안전성 순서
불변(immutable)
- 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화도 필요 없다.
- String, Long, BigInteger(아이템 7)가 대표적
무조건적 스레드 안전(unconditionally thread-safe)
- 이 클래스의 인스턴스는 수정될 수 있으나, 내부에서 충실히 동기화하여 별도의 외부 동기화없이 동시에 사용해도 안전하다.
- AtomicLong, ConcurrentHashMap이 여기에 속함
조건부 스레드 안전(conditionally thread-safe)
- 무조건적 스레드 안전과 같으나, 일부 메소드는 동시에 사용하려면 외부 동기화가 필요하다.
- Collections.synchronized 래퍼 메소드가 반환한 컬렉션들이 여기 속한다.
- (이 컬렉션들이 반환한 반복자는 외부에서 동기화해야 한다.)
스레드 안전하지 않음(not thread-safe)
- 이 클래스의 인스턴스는 수정될 수 있다.
- 동시에 사용하려면 각각의(혹은 일련의) 메소드 호출을 클라이언트가 선택한 외부 동기화 매커니즘으로 감싸야 한다.
- ArrayList, HashMap 같은 기본 컬렉션이 여기 속한다.
스레드 적대적(thread-hostile)
- 이 클래스는 모든 메소드 호출을 외부 동기화로 감싸더라도 멀티스레드 환경에서 안전하지 않음
- 이 수준의 클래스는 일반적으로 정적 데이터를 아무 동기화 없이 수정함
- 동시성을 고려하지 않고 작성하다보면 우연히 만들어질 수 있음
- 스레드 적대적으로 밝혀진 클래스나 메소드는 일반적으로 문제를 고쳐 재배포하거나 사용 자제 API로 지정한다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 84 : 프로그램의 동작을 스레드 스케줄러에 기대지 말라 (0) | 2021.09.21 |
---|---|
Item 83 : 지연 초기화는 신중히 사용하라 (0) | 2021.09.20 |
Item 81 : wait와 notify보다는 동시성 유틸리티를 애용하라 (0) | 2021.09.19 |
Item 80 : 스레드보다는 실행자, 태스크, 스트림을 애용하라. (0) | 2021.09.17 |
Item 79 : 과도한 동기화는 피하라 (0) | 2021.09.16 |