반응형
멀티 스레드가 가능한 자바에서 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 |