본문 바로가기

디자인 패턴

디자인 패턴 - 싱글톤 패턴(Singleton Pattern)

1. 정의

  • 클래스 인스턴스를 하나만 만들고, 메소드를 통한 인스턴스의 전역 접근을 제공한다.

2. 예시

  • 두 개의 주소가 같은지 확인한다.

3. 그림

4. 클래스 다이어그램

5. 코드

public class Client {
    public static void main(String[] args) {

        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        isSingleton(singleton1, singleton2);

        singleton2 = new Singleton();
        isSingleton(singleton1, singleton2);

    }

    private static boolean isSingleton(Object o1, Object o2) {
        if (o1 == o2) {
            System.out.println("싱글톤 입니다.");
            return true;
        }
        System.out.println("싱글톤 아닙니다.");
        return false;
    }
}
/* 출력
싱글톤 입니다.
싱글톤 아닙니다.
*/
public class Singleton {
    private static Singleton singleton;

    public static Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

https://github.com/kang-seongbeom/design_pattern

💡 Github에서 디자인 패턴 코드를 볼 수 있습니다.

6. 설명

  • 오직 하나의 인스턴스만을 생성해서 반환함

7. 참고

  • 멀티스레드에서 단 하나의 인스턴스를 보장 못할 수 있음

요청(인터럽트) 1번 스레드 2번 스테드 인스턴스

1번 스레드 요청 getInstacne()   null
2번 스레드 요청   getInstacne() null
  if(singleton == null)   null
1번 타임아웃   if(singleton == null) null
  singleton = new Singleton()   1번 스레드 인스턴스 생성
    singleton = new Singleton() 2번 스레드 인스턴스 생성
  • DCL(Double-Checked Locking)을 사용해 멀티스레드 문제를 해결할 수 있음
public class MultiThreadSingleton {
    private volatile static MultiThreadSingleton singleton;
    
    public static MultiThreadSingleton getInstance(){
        if(singleton == null){
            synchronized (MultiThreadSingleton.class){
                if(singleton == null){
                    singleton = new MultiThreadSingleton();
                }
            }
        }
        return singleton;
    }
}