반응형
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 |