본문 바로가기
Programming/디자인 패턴

싱글턴 패턴 (Singleton)

by Teshub 2021. 2. 4.

- 정의 -

해당 클래스의 인스턴스가 하나만 생성되고 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴

헤드퍼스트 디자인 패턴 책에서 소개해준 싱글톤 패턴에는 여러 생성 문법이 있었지만 책에서 추천하는 예시 코드입니다

 

1. 인스턴스를 미리 만들지 않고 필요할 때 생성하는 코드

public class Singleton {

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

단순히 static으로 선언하여 get으로 인스턴스를 가져오는 경우는 멀티쓰레딩 환경에서 싱글턴 패턴을 적용하다 보면 큰 문제가 있습니다(하나만 생성되어야 할 인스턴스가 두 개 생성될 수도 있다)

그래서 DCL(Double Checking Locking) 방식을 써서 getInstance에서 동기화 영역을 줄일 수 있습니다

하지만 이 방법 역시 단점이 있습니다 멀티코어 환경에서 동작할 때 하나의 cpu를 제외하고는 다른 cpu가 lock에 걸린다고 합니다

 

2. 인스턴스를 처음부터 생성하는 코드

public class Singleton {

	private static Singleton uniqueInstance = new Singleton();
    
    private Singleton() {}
    
	pubilc static Singleton getInstance() {
    
    	return uniqueInstance;
    }
}

 

애플리케이션에서 반드시 Singleton의 인스턴스를 생성해야 하고 그 인스턴스를 항상 사용한다면 또는 인스턴스를 실행 중에 수시로 만들고 관리하기가 어렵다면 처음부터 Singleton인스턴스를 생성하는 것도 좋은 방법입니다

클래스가 로딩될 때 JVM에서 Singleton의 유일한 인스턴스를 생성해줍니다 JVM에서 유일한 인스턴스를 생성하기 전에는 그 어떤 스레드도 uniqueInstance 정적 변수에 접근할 수 없습니다 

 

 

추가로 알아야 할 것

Voliate

멀티 쓰레딩환경에서 동기화를 해주는 키워드이다

java 변수를 메인 메모리에 저장하겠다라는 것을 명시하는 키워드라고 합니다

Multi Thread 환경에서 하나의 Thread만 read & write 하고 나머지 Thread가 read 하는 상황에서 가장 최신의 값을 보장합니다.

 

tutorials.jenkov.com/java-concurrency/volatile.html

을 참조하였습니다

728x90

댓글