반응형

Singleton Pattern 이란?

  • 애플리케이션 내에서 어떤 클래스에 대해 인스턴스를 오직 하나만 생성하여 관리하는 패턴을 말한다.
  • 하나의 객체를 생성하여 사용하기 때문에 메모리 낭비를 방지할 수 있다.
  • 하나의 객체를 전역에서 사용하기 때문에 인스턴스의 데이터를 공유하기 쉽다.
  • 멀티 쓰레드 환경에서 동기화 처리가 쉽지 않아 하나의 객체만 생성하는 과정이 어렵다.

Eager Initialization

  • 애플리케이션 실행시 싱글톤 객체를 미리 생성하는 방식
  • 애플리케이션 내에서 항상 해당 싱글톤 객체를 사용해야 하거나 객체 생성 비용이 크지 않을 경우에 사용한다.
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

Lazy Initialization with synchronized method

  • 미리 싱글톤 객체를 생성하는 방식이 아닌, 싱글톤 객체를 사용하는 시점에 생성하는 방식
  • 사용 시점까지 객체 생성을 미루기 때문에 메모리를 효율적으로 사용할 수 있다.
  • 멀티 스레드 환경에서 객체를 하나만 올바르게 생성할 수 있도록 synchronized 키워드를 사용한다.
  • 이미 객체가 생성된 경우에는 Locking 과정이 필요 없고 생성된 객체만 리턴해주면 되는데, synchronized에 매번 Locking 과정이 수행되므로 오버헤드가 커진다는 단점이 존재한다.
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}

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

Lazy Initialization with Double-checked locking

  • 위 과정에서 synchronized에 의해 불필요하게 발생하는 오버헤드를 줄이기 위해 사용하는 방식
  • 객체가 생성되지 않은 경우에만 동시성 처리를 위해 Lock 과정을 수행하고, 객체가 생성된 경우에는 Lock 과정 없이 생성된 객체를 반환하여 퍼포먼스를 향상한 방식이다.
public class Singleton {
    private static volatile Singleton instance;
       
    private Singleton() {}

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

Lazy Initialization with Holder Class

  • 클래스 안에 Holder 클래스를 두어 JVM의 Class Loader 매커니즘을 활용하여 Lazy Initialization을 구현하는 방식
  • 중첩 클래스의 멤버 객체는 참조되기 전까지 초기화하지 않는 특징을 활용한다.
  • 가장 안정적인 방식
public class Singleton {
    private Singleton() {}

    public static Singleton getInstance() {
        return Holder.instance;
    }

    private static class Holder {
        private static final Singleton instance = new Singleton();
    }
}

참고

반응형

'Development > Java' 카테고리의 다른 글

[Java] Cipher(RSA, AES)  (0) 2022.04.27
[Java] Base64  (0) 2022.04.26
[Java] JUnit5  (0) 2021.12.08
[Java] JUnit4  (0) 2021.11.23
[Java] Hash Algorithm  (0) 2021.11.17

+ Recent posts