1. Singleton Pattern 이란?
1) class 가 1개의 instance만을 가지도록 보장
2) instance 에 대해 a global point of access 를 제공
2. 왜 필요한가?
아래 object들은 Singleton Pattern 이 필요하다.
thread pools, caches, dialog boxes,
preferences, registry settings, logging, device drivers 와 관련된 object
3. 어떻게 구현하는가?
* 위와 같이 설정 시 thread safe 하지 않은 문제가 있다.
복수개의 thread 에서 동시에 SingleTon.getInstance(); 를 호출할 경우 SingleTon instance가 복수개 생성될 수 있다.
4. thread safe 설정
1) 성능이 중요하지 않을 때
: method 앞에 synchronized 를 붙인다. synchronized 가 붙을 경우, 1번에 하나의 thread 만 해당 method를 호출할 수 있다. 모든 every thread 가 해당 method를 호출하기 전 자신의 차례를 기다린다. 그러나 성능상 좋지 않다.
2) class를 instance로 만들고, 메모리에 올려놓은 것에 큰 overhead 가 발생하지 않을 때
: JVM 에서 program을 기동할 때 instance를 만든다. thread가 호출하기 전에 instance를 미리 만들어놓는다. 그러나 class를 instance로 만들고, 메모리에 올려놓은 것에 overhead가 클 경우 자원을 효율적으로 사용하지 못하는 단점이 있다.
3) (추천) 성능도 중요하고, class를 instance로 만들고, 메모리에 올려놓은 것에 overhead가 클 때 : Double-Checked Locking
* volatile : 변수를 읽고 쓰는 것을 atomic action으로 만들어준다.
* atomic action
- 전체 다 실행되거나, 실행되지 않는 것으로 중간에 멈추는 것은 없다.
- 실행이 다 되기 전까지 side effect는 알 수 없다.
- thread safe
- memory consistency error risk를 줄여준다. (변수에 쓸때 subsequent read에 대한 happen-before relationship을 만든다.)
참고 : https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
'Programming Theory > Design Pattern' 카테고리의 다른 글
Builder pattern (0) | 2016.01.31 |
---|---|
시스템에 적용되는 대상들에 대한 정보를 쉽게 관리하기 (0) | 2014.09.17 |