Effective Java ‐ Item 82⚠️ - dnwls16071/Backend_Summary GitHub Wiki
아이템 82 - 쓰레드 안전성 수준을 문서화하라.
- 하나의 메서드를 여러 메서드가 동시에 호출할 떄, 그 메서드가 어떻게 동작하느냐는 해당 클래스와 이를 사용하는 클라이언트 사이의 중요한 계약과 같다.
- 메서드 선언에 synchronized 키워드를 선언한 것만으로는 그 메서드가 쓰레드 안전(Thread-Safe)하다고 믿기 얼벼다.
- 멀티 쓰레드 환경에서도 API를 안전하게 사용하려면 클래스가 지원하는 쓰레드 안정성 수준을 정확히 명시해야 한다.
불변(immutable)
- 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화도 필요 없다.
- ex) String, Long, BigInteger
무조건적 스레드 안전(unconditionally thread-safe)
- 이 클래스의 인스턴스는 수정될 수 있으나, 내부에서 충실히 동기화하여 별도의 외부 동기화 없이 동시에 사용해도 안전하다.
- AtomicLong, ConcurrentHashMap
조건부 스레드 안전(conditionally thread-safe)
- 무조건적 스레드 안전과 같으나, 일부 메서드는 동시에 사용하려면 외부 동기화가 필요하다.
- Collections.synchronized 래퍼 메서드가 반환한 컬렉션들이 여기 속한다.
스레드 안전하지 않음(not thread-safe)
- 이 클래스의 인스턴스는 수정될 수 있다.
- 동시에 사용하려면 각각의 메서드 호출을 클라이언트가 선택한 외부 동기화 메커니즘으로 감싸야 한다.
- ex) ArrayList, HashMap
스레드 적대적(thread-hostile)
- 이 클래스는 모든 메서드 호출을 외부 동기화로 감싸더라도 멀티스레드 환경에서 안전하지 않다.
- 이 수준의 클래스는 일반적으로 정적인 데이터를 아무 동기화 없이 수정한다.
- 스레드 적대적으로 밝혀진 클래스나 메서드는 문제를 고쳐 재배포하거나 사용 자제(deprecated) API로 지정한다