javadoc이 기본 옵션에서 생성한 API 문서에는 synchronized 한정자가 포함되지 않는다. 메서드 선언에 synchronized 한정자 선언할지는 구현 이슈일 뿐 API에 속하지 않는다.
→ 이것만으로 그 메서드가 스레드 안전하다고 믿기 어려움
멀티스레드 환경에서도 API를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다.
불변 (immutable) @Immutable
무조건적 스레드 안전 (unconditionally thread-safe) @ThreadSafe
조건부 스레드 안전 (conditionally thread-safe) @ThreadSafe
무조건적 스레드 안전과 같으나 일부 메서드는 동시에 사용하려면 외부 동기화가 필요하다.
Collections.synchronized 래퍼 메서드가 반환한 컬렉션들이 여기에 속함
주의해서 문서화 해야함
/**
* synchronizedMap이 반환한 맵의 컬렉션 뷰를 순회하려면 반드시 그 맵의 락으로 사용해
* 수동으로 동기화하라.
* Map<K, V> m = Collections.synchronizedMap(new HashMap<>());
* Set<k> s = m.keySet(); // 동기화 블록 밖에 있어도 된다.
* ...
* synchronized (m) { // s가 아닌 m을 사용해 동기화해야 한다.
* for (K key : s) // 동기화 블록 안에 있어야 한다.
* Key.f();
* }
* 이대로 하지 않으면 동작을 예측할 수 없다.
*/
스레드 안전하지 않음 (not thread-safe) @NotThreadSafe
스레드 적대적 (thread-hostile)