Singleton?
왜 디자인 패턴을 쓰는지는 링크를 참조해주세요!
- Singleton(싱글톤) 패턴 : Application에서 Instance를 하나만 만들어 사용하기 위한 패턴이다.
- 외부에서 객체를 생성하는 것을 막기 위한 패턴
- Use Case는 DB에 연결할 때, jdbc 라이브러리를 통해서 연결하는데 중복 Connection은 피하기 위해서 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package pattern;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
|
cs |
1. 싱글톤 패턴 코드
싱글톤 패턴 고찰
- 장점만을 생각해보자. 너무나 좋지 않은가? 단일 객체 생성을 보장한다니!!!!!!
- But, 장점만 쳐다보면 실력이 늘 수 없다. -> 단점을 찾아내볼까?
* 멀티쓰레드 환경에서 Singleton Class에 대하여 getInstance 메서드 가 동시에 일어난다고 생각해볼까?
-> 결국 다중 객체 생성을 허용한다...
* 한번 개선해볼까? 괜찮을 것 같은데?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package pattern;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
|
cs |
2. synchronized 키워드를 적용한 싱글톤 패턴
- 다시 생각해보자. 과연 괜찮을까?
- synchronized 키워드는 성능이 정말 안좋다...
* 조금만 더 생각해보자!!! 거의 다 왔다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package pattern;
public class Singleton {
private static volatile Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
|
cs |
3. volatile 키워드를 적용하고, 클래스 로딩시 객체를 한번 생성한다!
- volatile : Java 변수를 CPU Cache에 저장된 값으로 접근하는 것이 아니라 Main Memory에서 바로 읽자!
- DataBase 접근의 경우, 아주아주 중요한 요소이기 때문에 Main Memory에서 바로 읽어도 괜찮다
* 하지만, Enum을 활용한 방법도 가능하더라~!
package singleton;
public enum Driver {
INSTANCE;
private final String name = "This is JDBC Driver";
public String getName() {
return name;
}
}
4. enum을 활용해서, 단일 요소로 인스턴스를 생성하게만 한다!
- enum은 정해진 인스턴스들을 접근할 때 객체를 처음 생성한다!
- 따라서, 인스턴스가 1개만 주어진다면, 역시나 멀티쓰레드에 대한 접근도 방지할 수 있다.
=> 기본 생성자 Blocking, Driver.INSTANCE로만 접근가능
* 반드시 정답이 있는 패턴은 없다.
* 한계점이 존재한다면, 조금만 더 생각해서 개선해보는 습관은 정말 중요한 것 같다
참고
Interview Question For Beginner
Java volatile이란?
What is an Efficient way to implement Singleton Pattern in java?
'Developer > Design Pattern' 카테고리의 다른 글
Template Method Pattern - 템플릿 메소드 패턴 (0) | 2019.06.09 |
---|---|
Observer Pattern - 옵저버 패턴 (0) | 2019.06.09 |
Visitor Pattern - 비지터 패턴, 방문자 패턴 (2) | 2019.05.26 |
Strategy Pattern - 스트레지 패턴, 전략 (0) | 2019.05.26 |
Design Pattern - 소개 (2) | 2019.05.24 |