• 멀티스레드 환경에서도 API 문서를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다.

스레드 안전성 순서

불변(immutable)

  • 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화도 필요 없다.
  • String, Long, BigInteger(아이템 7)가 대표적

무조건적 스레드 안전(unconditionally thread-safe)

  • 이 클래스의 인스턴스는 수정될 수 있으나, 내부에서 충실히 동기화하여 별도의 외부 동기화없이 동시에 사용해도 안전하다.
  • AtomicLong, ConcurrentHashMap이 여기에 속함

조건부 스레드 안전(conditionally thread-safe)

  • 무조건적 스레드 안전과 같으나, 일부 메소드는 동시에 사용하려면 외부 동기화가 필요하다.
  • Collections.synchronized 래퍼 메소드가 반환한 컬렉션들이 여기 속한다.
  • (이 컬렉션들이 반환한 반복자는 외부에서 동기화해야 한다.)

스레드 안전하지 않음(not thread-safe)

  • 이 클래스의 인스턴스는 수정될 수 있다.
  • 동시에 사용하려면 각각의(혹은 일련의) 메소드 호출을 클라이언트가 선택한 외부 동기화 매커니즘으로 감싸야 한다.
  • ArrayList, HashMap 같은 기본 컬렉션이 여기 속한다.

스레드 적대적(thread-hostile)

  • 이 클래스는 모든 메소드 호출을 외부 동기화로 감싸더라도 멀티스레드 환경에서 안전하지 않음
  • 이 수준의 클래스는 일반적으로 정적 데이터를 아무 동기화 없이 수정함
  • 동시성을 고려하지 않고 작성하다보면 우연히 만들어질 수 있음
  • 스레드 적대적으로 밝혀진 클래스나 메소드는 일반적으로 문제를 고쳐 재배포하거나 사용 자제 API로 지정한다.

+ Recent posts