스레드 안전성에 대해서는 문서에 synchronized 키워드가 있는지 보면 알 수 있다고 하는데, 보통 Javadoc이 만드는 문서에는 synchronized 키드워가 들어가지 않는데, 거기에는 이유가 있다. synchronized 키워드는 메서드의 구현 상세에 해당하는 정보이며, 공개 API의 일부가 아니기 때문이다. 병렬적으로 사용해도 안전한 클래스가 되려면, 어떤 수준의 스레드 안전성을 제공하는 클래스 인지 문서에 명확하게 남겨야 한다.
- 변경 불가능 - 이 클래스로 만든 객체들은 상수다. 따라서 외부적인 동기화 메커니즘 없이도 병렬적 이용이 가능하다. String, Long, BigInteger 등이 그 예다.
- 무조건적 스레드 안전성 - 변경이 가능하지만 적절한 내부 동기화 메커니즘을 갖추고 있어서 외부적으로 동기화 메커니즘을 적용하지 않아도 병렬적으로 사용할 수 있다. Random, ConcurrentHashMap이 그 예다.
- 조건부 스레드 안전성 - 무조건전 스레드 안전성과 거의 같은 수준이나, 몇몇 스레드는 외부적 동기화가 없이는 병렬적으로 사용할 수 없다.
- 스레드 안전성 없음 - 해당 객체들은 변경이 가능하다. 이러한 객체들을 병렬적으로 이용하려면 메서드를 호출하는 부분을 클라이언트가 선택한 외부적 동기화 수단으로 감싸야 한다. synchronized를 써야 한다는 뜻인가..?
요약
모든 클래스는 자신의 스레드 안전성 수준을 문서로 분명히 남겨야 한다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[병행성]규칙72. 스레드 스케줄러에 의존하지 마라 (0) | 2017.05.08 |
---|---|
[병행성]규칙71. 초기화 지연은 신중하게 하라 (0) | 2017.05.08 |
[병행성]규칙69. wait나 notify 대신 병행성 유틸리티를 이용하라 (0) | 2017.05.08 |
[병행성]규칙68. 스레드보다는 실행자와 태스크를 이용하라 (0) | 2017.05.08 |
[병행성]규칙67.과도한 동기화는 피하라. (0) | 2017.05.08 |