5장 - 싱글턴 패턴
- Created
- 2022년 9월 3일 PM 8:29
싱글턴 패턴이란#

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