본문 바로가기

Programming Theory/Design Pattern

Singleton Pattern

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


참고 : Head First Design Pattern