Design Pattern
[Java, Singleton] 멀티스레드를 고려한 Singleton 패턴
uchacha
2023. 2. 22. 16:15
- @참고: https://javaplant.tistory.com/21
- 싱글톤 패턴이란
Singleton 패턴은 인스턴스를 불필요하게 생성하지 않고 오직 JVM내에서 한 개의 인스턴스만 생성하여 재사용을 위해 사용되는 디자인패턴이다.
6. LazyHolder Singleton 패턴 - 5에서 사용안하는 인스턴스를 만들어 놓는 문제를 개선
더보기
public class Singleton {
private Singleton(){}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
5. static 초기화를 이용한 Singleton 패턴 - 간결한 소스와 성능 개선
더보기
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
4. volatile 을 이용한 개선된 DCL Singleton 패턴 (jdk 1.5 이상에서 사용) - 3에서 인스턴스를 null 로 줄 수 있는 문제점 개선
더보기
public class Singleton {
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
(사용해선 안됨)3. DCL(Double-Checked-Locking) Singleton 패턴 - 2에서 생기는 lock 의 효율성을 개선
더보기
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2. synchronized 를 이용한 Singleton 패턴 - multi-thread 환경에서 1에서 두개의 인스턴스가 생길 가능성을 개선
더보기
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
1. 고전적 방식의 Singleton 패턴
더보기
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}