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