"클래스가 인스턴스를 하나만 갖게 하고 전역 범위에서 이 인스턴스에 접근하는 단일 지점을 제공하기 위해 사용한다."
- GoF
대표적으로 java.lang.Runtime이 싱글톤을 구현하는데 코드는 다음과 같다.
또, 다음과 같이 생성 여부를 확인하는 코드를 작성할 수 있다.
package com.devjones.web.singleton;
public class Singleton {
private static Singleton instance;
private Singleton() {};
public static Singleton getInstance() {
if(instance == null) {
return instance = new Singleton();
}
return instance;
}
}
싱글톤은 특히 멀티스레드환경에서 단일객체가 보장되지 않는걸로 유명하다.
다음과 같이 synchronized 키워드를 통해 thread-safe한 코드를 작성하자.
package com.devjones.web.singleton;
public class Singleton {
private static Singleton instance;
private Singleton() {};
public static synchronized Singleton getInstance() {
if(instance == null) {
return instance = new Singleton();
}
return instance;
}
}
위 Runtime 클래스처럼 클래스로딩(getInstance 호출 전)과 동시에 객체를 생성할 수 있다.
물론 다음과 같이 정적블록(생성자 호출 전)을 사용해도 된다.
package com.devjones.web.singleton;
public class Singleton {
private static Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton() {};
public static synchronized Singleton getInstance() {
return instance;
}
}
double checked locking 을 통해 구현하는 방법도 있다.(생략)
마지막으로 열거타입과 싱글톤이다.
package com.devjones.web.singleton;
public enum SingletonEnum {
INSTANCE;
public void printHello() {
System.out.println("hello world");
}
}
사용은 다음과 같이..
package com.devjones.web.singleton;
public class Main {
public static void main(String[] args) {
SingletonEnum se = SingletonEnum.INSTANCE;
se.printHello();
}
}
결과:
hello world
'Java EE 7' 카테고리의 다른 글
EE.2.4 Containers (0) | 2020.10.29 |
---|---|
EE.2.4.2 Java EE Servers (0) | 2020.10.29 |