억대 연봉을 위한 인간수업
반응형

멀티 스레드가 가능한 자바에서 singleton 패턴을 사용할 때, Thread safe singleton을 많이 사용한다.

Thread safe가 필요한 이유는 멀티 스레드를 구현할 때 스레드를 사용하는 도중 문제가 일어나지 않게 하기 위해서 이며, 동기화를 위해 사용한다. 이걸 패턴으로 구현한게 Thread safe singleton 이다.

 

Thread safe singleton

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

 

 

싱글톤 패턴의 특징인 singleton 인스턴스 선언 후, 해당 인스턴스 접근 시 값이 null인 경우 new로 초기화를 한 뒤 값을 리턴한다.

getInstance에 접근해서 인스턴스 값에 접근할 때 동기화를 위해 synchronized 키워드를 사용해 주는 게 포인트이다. 

 

근데, 이렇게 synchronized를 사용하는 경우 매번 getInstance에 접근하면 오버헤드가 발생한다. 이러면 초기화가 느린 상황이 발생하기 때문에 이를 방지하고자 DCL(Double checked Locking) 패턴을 사용한다.

 

 

Double checked Locking

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

Thread safe singleton에서 if문을 추가해 인스턴스가 null인 경우 synchronized가 되도록 만든 패턴이다. 이렇게 패턴을 사용하면 오버헤드를 줄일 수 있다. 

반응형

'Develop > Java' 카테고리의 다른 글

[Java] Lock에 대해서  (0) 2023.07.19
[Java] try와 catch  (0) 2023.07.18
[Java] this. 의미  (0) 2023.06.03
[Java] Concurrent HashMap과 Concurrent List  (0) 2023.05.29
[Java] Atomic과 CAS(Compare and swap)  (0) 2023.05.29
profile

억대 연봉을 위한 인간수업

@회뜨는참치

이 글이 당신에게 조금이라도 도움이 된다면 좋겠습니다.