도당탕탕
Item82 : Thread Safety를 문서화하라. 본문
thread safety level를 명시할 것
- Immutable
- 인스턴스가 변하지 않는 경우, 예를 들어
String
,Long
,BigInteger
- 아무런 동기화과정이 필요 없음.
- 인스턴스가 변하지 않는 경우, 예를 들어
- Unconditionally thread-safe
- 인스턴스는 mutable이지만 외부적 동기화 없이 병렬로 사용될 수 있는 경우
- 예를 들어
AtomicLong
,ConcurrentHashMap
- Conditionally thread-safe
- 몇몇 함수에만 외부적 동기화가 필요한 경우
- 예를 들어
Collections.synchronized
wrapper에 의해 리턴되는 컬렉션 - 정확히 어떤 함수가 외부적 동기화를 필요로 하는지 명시해야 됨.
- Not thread-safe
- 인스턴스가 mutable이며, 모든 함수에서 외부적 동기화가 필요한 경우
- Thread-hostile
- 함수에 외부적 동기화를 처리하더라도 unsafe 한 경우
- 보통 동기화 없이 static data를 수정해서 발생
Denial of service 방지
- Denial of service란 클라이언트가 고의로 또는 실수로 특정 함수가 서비스를 거부하도록 하는 것
- 클래스를 다음처럼 정의해 두면, public lock을 클라이언트가 계속 점유할 수 있어서 DoS가 발생한다.
public Object lock = new Object(); public void foo() { ... }
- 반면 다음처럼 private lock을 사용하면 위 문제를 방지할 수 있다. 또한 final을 사용해서 lock객체를 임의로 변경하는 것을 막을 수 있다.
private final Object lock = new Object(); public void foo() { synchronized(lock) { ... } }
정리
- 모든 클래스는 분명하게 thread safety에 대해서 문서화할것
- Conditionally thread-safe 클래스들은 어느 함수 호출이 동기화가 필요하며 어떤 락을 획득해야하는지 명시해야함
- Unconditionally thread-safe 클래스들을 작성할때는 private final lock 객체를 사용하는것을 고려하라
'JAVA' 카테고리의 다른 글
Item84 : Thread Scheduler에 의존하지마라 (0) | 2023.02.07 |
---|---|
Item83 : 지연 초기화는 신중히 사용하라 (0) | 2023.02.07 |
Item81 : wait와 notify보다는 동시성 유틸리티를 애용하라 (0) | 2023.02.06 |
Item80 : Executor, Task, Stream 을 Thread 보다 선호하라. (0) | 2023.02.03 |
Item79 : 과도한 동기화는 피하라 (0) | 2023.02.03 |
Comments