본문 바로가기

Java EE 7

[자바] 싱글톤 : 자바SE

"클래스가 인스턴스를 하나만 갖게 하고 전역 범위에서 이 인스턴스에 접근하는 단일 지점을 제공하기 위해 사용한다."

- 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