SMALL
Singleton Pattern
싱글턴은 자원 공유를 위해 객체 생성 개수를 1개로 제한합니다.
싱글턴은 다른 생성 패턴과 달리 하나의 객체만 생성을 제한하는 패턴입니다.
그리고 생성된 객체는 공유되어 어디서든 접근할 수 있습니다.
싱글턴 패턴은 다음과 같은 상황에서 매우 유용합니다
- 공유 자원 접근
- 복수의 시스템이 하나의 자원에 접근할 때
- 유일한 객체가 필요할 때
- 값의 캐시가 필요할 때
예시 코드
public class Config {
private static Config instance = null;
private Config() {
// private constructor
}
public static Config getInstance() {
if (instance == null) {
instance = new Config();
}
return instance;
}
}
위의 예제에서는 multi thread 환경에서 어떠한 thread에서 getInstance를 호출하여 instance를 생성하는 시점에
다른 thread가 해당 메서드를 호출하는 경우에 문제가 될 수 있습니다.
instance를 생성 중이긴 하지만, instance를 생성이 완료가 되지 않아서 null check 하는 로직에 true로 통과하여 싱글턴이 깨질 수 있습니다.
Multi Thread 환경에서의 Singleton
public class MultiThreadConfig {
private MultiThreadConfig() {}
private static class InnerClz {
private static final MultiThreadConfig INSTANCE = new MultiThreadConfig();
}
public static MultiThreadConfig getInstance() {
return InnerClz.INSTANCE;
}
}
내부 정적 클래스를 선언하여 그 내부 클래스에서 인스턴스를 생성하도록 하는 방식
MultiThreadConfig 클래스에는 InnerClz 클래스의 변수가 없기 때문에, static 멤버 클래스더라도, 클래스 로더가 초기화 과정을 진행할 때 InnerClz 클래스는 초기화되지 않는다.
InnerClz 클래스는 getInstance()가 호출됐을 때 비로소 JVM 메모리에 로드되고, 인스턴스를 생성하게 됩니다.
LIST
'DesignPattern' 카테고리의 다른 글
[DesignPattern] Builder Pattern ( 빌더 패턴 ) (0) | 2021.05.21 |
---|---|
[DesignPattern] Abstract Factory VS Factory Method 차이 (0) | 2021.05.15 |
[DesignPattern] Abstract Factory Pattern ( 추상 팩토리 패턴 ) (0) | 2021.05.13 |
[DesignPattern] Factory Method Pattern ( 팩토리 메소드 패턴 ) (0) | 2021.05.12 |
[DesignPattern] Factory Pattern (팩토리 패턴) (생성자 패턴) (0) | 2021.05.11 |