- 정의 -
해당 클래스의 인스턴스가 하나만 생성되고 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴
헤드퍼스트 디자인 패턴 책에서 소개해준 싱글톤 패턴에는 여러 생성 문법이 있었지만 책에서 추천하는 예시 코드입니다
1. 인스턴스를 미리 만들지 않고 필요할 때 생성하는 코드
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class){
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
단순히 static으로 선언하여 get으로 인스턴스를 가져오는 경우는 멀티쓰레딩 환경에서 싱글턴 패턴을 적용하다 보면 큰 문제가 있습니다(하나만 생성되어야 할 인스턴스가 두 개 생성될 수도 있다)
그래서 DCL(Double Checking Locking) 방식을 써서 getInstance에서 동기화 영역을 줄일 수 있습니다
하지만 이 방법 역시 단점이 있습니다 멀티코어 환경에서 동작할 때 하나의 cpu를 제외하고는 다른 cpu가 lock에 걸린다고 합니다
2. 인스턴스를 처음부터 생성하는 코드
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
pubilc static Singleton getInstance() {
return uniqueInstance;
}
}
애플리케이션에서 반드시 Singleton의 인스턴스를 생성해야 하고 그 인스턴스를 항상 사용한다면 또는 인스턴스를 실행 중에 수시로 만들고 관리하기가 어렵다면 처음부터 Singleton인스턴스를 생성하는 것도 좋은 방법입니다
클래스가 로딩될 때 JVM에서 Singleton의 유일한 인스턴스를 생성해줍니다 JVM에서 유일한 인스턴스를 생성하기 전에는 그 어떤 스레드도 uniqueInstance 정적 변수에 접근할 수 없습니다
추가로 알아야 할 것
Voliate
멀티 쓰레딩환경에서 동기화를 해주는 키워드이다
java 변수를 메인 메모리에 저장하겠다라는 것을 명시하는 키워드라고 합니다
Multi Thread 환경에서 하나의 Thread만 read & write 하고 나머지 Thread가 read 하는 상황에서 가장 최신의 값을 보장합니다.
tutorials.jenkov.com/java-concurrency/volatile.html
을 참조하였습니다
'Programming > 디자인 패턴' 카테고리의 다른 글
커맨드 패턴 (Command) (0) | 2021.02.09 |
---|---|
팩토리 메서드 패턴 (Factory Method), 추상 팩토리 패턴 (Abstract Factory) (0) | 2021.02.03 |
데코레이터 패턴 (Decorator) (0) | 2021.02.02 |
옵저버 패턴 (Observer) (0) | 2021.01.29 |
스트래티지 패턴 (Strategy) (0) | 2021.01.28 |
댓글