JUNGKIMHOON
[Java] Singleton pattern 본문
싱글턴 패턴?
단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.
하나의 인스턴스를 메로리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하도록 하여,
요청이 많은 곳에서 효율을 높일 수 있다.
Thread safe Lazy initialization 게으른 초기화
public class ThreadSafeLazyInitialization{
private static ThreadSafeLazyInitialization instance;
private ThreadSafeLazyInitialization(){}
public static synchronized ThreadSafeLazyInitialization getInstance(){
if(instance == null){
instance = new ThreadSafeLazyInitialization();
}
return instance;
}
}
synchronized 특성상 큰 성능저하가 발생한다. (권장 X)
Thread safe Lazy initialization + Double-checked locking 게으른 초기화의 성능저하 완화
public class ThreadSafeLazyInitialization {
private volatile static ThreadSafeLazyInitialization instance;
private ThreadSafeLazyInitialization(){}
public static ThreadSafeLazyInitialization getInstance(){
if(instance == null){
synchronized (ThreadSafeLazyInitialization.class) {
if(instance == null)
instance = new ThreadSafeLazyInitialization();
}
}
return instance;
}
}
첫 번째에서 성능저하 완화했지만 완벽한 방법은 아니다.
Initialization on demand holder idiom (holder에 의한 초기화)
public class Something {
private Something() {
}
private static class LazyHolder {
public static final Something INSTANCE = new Something();
}
public static Something getInstance() {
return LazyHolder.INSTANCE;
}
}
클래스 안에 클래스를 두어서 holder안에 선언된 instance가 static이기 떄문에 클래스 로딩시점에 한번 호출되고 final을 사용해 다시 값이 할당되지 않도록 만든다. (가장 일반적인 방법)
'Java' 카테고리의 다른 글
[Java] String, StringBuffer, StringBuilder (0) | 2020.10.18 |
---|
Comments