관리 메뉴

JUNGKIMHOON

[Java] Singleton pattern 본문

Java

[Java] Singleton pattern

JUNGKIMHOON 2020. 10. 19. 16:55

java

싱글턴 패턴?

단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.

하나의 인스턴스를 메로리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하도록 하여,

요청이 많은 곳에서 효율을 높일 수 있다.

 

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을 사용해 다시 값이 할당되지 않도록 만든다. (가장 일반적인 방법)

 

 

 

참고: jeong-pro.tistory.com/86

'Java' 카테고리의 다른 글

[Java] String, StringBuffer, StringBuilder  (0) 2020.10.18
Comments