본문 바로가기
공부/디자인 패턴

5. Singleton Pattern (Head First Design Patterns)

by 김주현3902 2024. 10. 22.

Singleton Pattern은 오직 단 하나만 존재하는 인스턴스를 생성하는 것이다.

 

간단한 방법은 해당 클래스의 생성자를 private으로 설정하고 자기 자신의 인스턴스 객체를 클래스 변수로 갖는 것이다.

다음으로, getInstance 메소드에서는 인스턴스가 이미 생성된 상태라면 이를 반환하고 없다면 new로 생성하여 저장한다.

 

하지만, 만약 A와 B가 동시에 Singleton 클래스에 접근한다고 할 때,

A가 인스턴스의 존재 여부 if문에 통과한 후, 인스턴스 생성 전에  B가 바로 if문에 접근한다면 B또한 통과할 것이다.

그렇게 되면 A와 B는 각각 다른 인스턴스를 가지게 될 것이고, singleton pattern이 무너지게 된다.

따라서 getInstance 메소드는 동기화 되어있어야 한다.

이때, getInstance는 매 순간 동기화될 필요 없이, 인스턴스 객체가 아직 존재하지 않은 경우에만 동기화 하면 된다. 

public class Singleton {
    private static Singleton uniqueSingleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (uniqueSingleton == null) {
            synchronized (Singleton.class) {
                if (uniqueSingleton == null) {
                    uniqueSingleton = new Singleton();
                }
            }
        }
        return uniqueSingleton;
    }
}

 

 

현재 인스턴스가 존재하지 않는다면, 동기화 작업 후 다시 인스턴스의 존재 여부를 확인한 후 new로 생성한다.

public class SingletonSimulation {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println("singleton1 = " + singleton1);
        System.out.println("singleton2 = " + singleton2);
    }
}

싱글톤을 두 번 생성해도 같은 인스턴스가 생성되는 것을 확인할 수 있다.