싱글턴 패턴이란
싱글턴 패턴은 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공합니다.
•
인스턴스가 절대 2개 이상이 되지 않도록 해 주는 싱글턴 패턴입니다.
•
연결 풀이나 스레드 풀과 같은 자원 풀을 관리하는 데 자주 사용합니다.
•
생성자를 private접근자로 제한하고 객체접근을 public static메소드를 통해 접근한다.
•
자원을 많이 잡아먹는 인스턴스에 유용하다.
•
싱글턴은 올바르게 구현하기가 어렵다.
•
싱글턴은 상속받기 어려워서
고전적인 싱글턴 패턴
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
Java
복사
고전적인 싱글턴 패턴
단점
•
멀티쓰레드 환경에서 레이스 컨디션 문제로 인해서 인스턴스가 하나가 아닌 2개가 생성될 수 있다.
조금 개선된 싱글턴 패턴
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
Java
복사
synchronized 메소드로 지정한 싱글턴 패턴
장점
•
synchronized예약어로 인해서 한개의 스레드가 작업을 마칠때 까지 인스턴스를 가져올 수 없기 때문에 하나의 인스턴스를 보장한다.
단점
•
동기화가 필요한 시점은 오로지 인스턴스의 생성을 진행할 때 뿐이기 때문에 매번 동기화를 하는것은 비효율적임
조금 더 개선된 싱글턴 패턴
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static synchronized Singleton getInstance() {
return uniqueInstance;
}
}
Java
복사
방법1 - 인스턴스를 처음부터 만들어준다.
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
Java
복사
방법2 - DCL을 사용하여 동기화 코드를 줄인다.
volatile
•
volatile keyword는 Java 변수를 Main Memory에 저장하겠다라는 것을 명시하는 것입니다.
•
매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것입니다.
•
또한 변수의 값을 Write할 때마다 Main Memory에 까지 작성하는 것입니다.