스레드 안전성에 대해서는 문서에 synchronized 키워드가 있는지 보면 알 수 있다고 하는데, 보통 Javadoc이 만드는 문서에는 synchronized 키드워가 들어가지 않는데, 거기에는 이유가 있다. synchronized 키워드는 메서드의 구현 상세에 해당하는 정보이며, 공개 API의 일부가 아니기 때문이다. 병렬적으로 사용해도 안전한 클래스가 되려면, 어떤 수준의 스레드 안전성을 제공하는 클래스 인지 문서에 명확하게 남겨야 한다.


  • 변경 불가능 - 이 클래스로 만든 객체들은 상수다. 따라서 외부적인 동기화 메커니즘 없이도 병렬적 이용이 가능하다. String, Long, BigInteger 등이 그 예다.
  • 무조건적 스레드 안전성 - 변경이 가능하지만 적절한 내부 동기화 메커니즘을 갖추고 있어서 외부적으로 동기화 메커니즘을 적용하지 않아도 병렬적으로 사용할 수 있다. Random, ConcurrentHashMap이 그 예다.
  • 조건부 스레드 안전성 - 무조건전 스레드 안전성과 거의 같은 수준이나, 몇몇 스레드는 외부적 동기화가 없이는 병렬적으로 사용할 수 없다. 
  • 스레드 안전성 없음 - 해당 객체들은 변경이 가능하다. 이러한 객체들을 병렬적으로 이용하려면 메서드를 호출하는 부분을 클라이언트가 선택한 외부적 동기화 수단으로 감싸야 한다. synchronized를 써야 한다는 뜻인가..?

요약

모든 클래스는 자신의 스레드 안전성 수준을 문서로 분명히 남겨야 한다. 


+ Recent posts