연쇄 창업을 위한 인간수업
반응형

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

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

 

1. Thread safe singleton

<java />
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) 패턴을 사용한다.

 

 

2. Double checked Locking

<java />
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

연쇄 창업을 위한 인간수업

@회뜨는참치

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