ch. 4 객체 구성


컴포넌트의 스레드 안전성을 안정적으로 확보할 수 있고, 이와 함께 개발자가 코드를 작성하는 과정에서 실수를 한다 해도 스레드 안전성을 해치지 않도록 도와주는 클래스 구성 방법을 알아보자!

4-1 스레드 안전한 클래스 설계

클래스가 스레드 안전성을 확보하도록 설계하고자 할 때에는 다음과 같은 세 가지를 고려해야 한다.

  1. 객체의 상태를 보관하는 변수가 어떤 것인가?
  2. 객체의 상태를 보관하는 변수가 가질 수 있는 값이 어떤 종류, 어떤 범위에 해당하는가?
  3. 객체 내부의 값을 동시에 사용하고자 할 때, 그 과정을 관리할 수 있는 정책
@ThreadSafe
public final class Counter{
	@GuardedBy("this") private long value =0;
	
	public synchronized long getValue(){
		return value;
	}
	public synchronized long increment(){
		if(value == Long.MAX_VALUE){
			throw new IllegalStateException("counter overflow")
		}
		return ++value;
	}
}

동기화정책

객체 내부의 여러 변수가 갖고 있는 현재 상태를 사용하고자 할 때 값이 계속해서 변하는 상황에서도 값을 안전하게 사용할 수 있도록 조절하는 방법

동기화 정책 종류