요약
- 싱글턴 패턴
- 문제를 해결하는 적절한 방법 선택하기
- 멀티스레딩 문제 해결 방법 3가지
- 싱글턴에 동기화 문제, 클래스 로딩 문제, 리플렉션, 직렬화 역직렬화 문제가 있음
- 디자인 도구상자 안에 들어가야 할 도구들
메모
문제를 해결하는 적절한 방법 선택하기
- 멀티스레딩 문제 해결하는 3가지 방법에 각각 장단점이 있음.
- getInstance() 메소드를 동기화하는 방법
- 항상 올바른 결과가 나옴
- 초콜릿 보일러의 경우, 속도 문제가 그리 중요하지 않기에 이 방법을 써도 괜찮음
- 인스턴스를 시작하자 만드는 방법
- 초콜릿 인스턴스는 어짜피 항상 필요하기에 정적으로 초기화하는 것도 괜찮은 방법임.
- 표준적인 패턴에 익숙한 개발자는 이상하게 보일 수 있지만 지금 상황에서는 메소드 동기화 방법이나 이 방법이나 그리 크게 차이나지는 않을 것으로 보임
- DCL을 쓰는 방법
- 속도 문제가 중요하지 않은 상황이기에 굳이 DCL을 쓸 필요까지는 없어보임.
- 반드시 자바 5 이상 버전에서만 쓸 수 있다는 점을 고려해야 함.
- 클래스 로더마다 서로 다른 네임스페이스를 정의하기에 클래스 로더가 2개 이상이라면 같은 클래스를 여러 번(각 클래스 로더마다 한 번씩) 로딩할 수 있음.
- 싱글 턴을 이런 식으로 로딩하면 인스턴스가 여러 개 만들어지는 문제가 발생할 수 있음.
- 따라서, 클래스 로더가 여러 개라면 싱글턴을 조심해서 사용해야 함.
- 클래스 로더를 직접 지정하면 이 문제를 피할 수 있음.
- 리플렉션, 직렬화, 역직렬화도 싱글턴에서 문제가 될 수 있음. → 이 부분도 염두에 둘 필요가 있음.
- 동기화 문제, 클래스 로딩 문제, 리플렉션, 직렬화와 역직렬화 문제 등은 enum으로 싱글턴을 생성해서 해결할 수 있음.
public enum Singleton {
UNIQUE_INSTANCE;
// 기타 필요한 필드
}
public class SingletonClient {
public static void main(String[] args) {
Singleton singleton = Singleton.UNIQUE_INSTANCE;
// 여기서 싱글턴 사용
}
}
- 우리가 앞서 SingleTon 클래스에 getInstance() 메소드로 클래스를 만들고 동기화한 일은 싱글턴이 어떻게 작동하는지 확실히 이해하려고 싱글턴의 작동 원리를 하나하나 따라가 본것임
- 이제 enum을 배웠으니, 싱글턴이 필요할 때면 바로 enum을 쓰면됨.
디자인 도구상자 안에 들어가야 할 도구들
- 싱글턴 패턴 : 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공함.