자바 개발을 하면서 제일 많이 쓰는 패턴 중 하나가 싱글톤 패턴이다.
그리고 싱글톤 소스 또한 다양하게 작성한다.
----------------------------------------------------------------------------------
1)
public class Singleton{
private static final Singleton instance=new Singleton();
private Singleton(){}
public static final Singleton getInstance(){
return instance;
}
}
----------------------------------------------------------------------------------
아래 2번과 같은 경우는 멀티스레드 시 위험하다.
2)
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static final Singleton getInstance(){
if(instance==null)
instance=new Singleton();
return instance;
}
}
----------------------------------------------------------------------------------
아래 3번과 같은 경우는 안전하지만 성능상 1번이 제일 좋다.
3)
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static final Singleton getInstance(){
if(instance==null)
synchronized(Singleton.class){
instance=new Singleton();
}
return instance;
}
}
----------------------------------------------------------------------------------
아래 4번과 같은 경우는 싱글톤에서 직렬화를 처리하기 위한 방법이다. Serializable 을 구현하고 readResolve 메서드를 구현하고, 모든 인스턴스 필드를 transient 로 선언한다.
4)
public class Singleton implements Serializable{
private static final long serialVersionUID=6209266452691660409L;
private static final transient Singleton instance=new Singleton();
private Singleton(){}
public static final Singleton getInstance(){
return instance;
}
private Object readResolve(){
return instance;
}
}
----------------------------------------------------------------------------------
아래 5번과 같은 경우는 enum 을 사용한 구현방법이다. 직렬화가 자동으로 지원되며 인스턴스가 여러 개 생기지 않도록 지원한다.
5)
enum Singleton{
instance;
public void method(){}
}
그리고 싱글톤 소스 또한 다양하게 작성한다.
----------------------------------------------------------------------------------
1)
public class Singleton{
private static final Singleton instance=new Singleton();
private Singleton(){}
public static final Singleton getInstance(){
return instance;
}
}
----------------------------------------------------------------------------------
아래 2번과 같은 경우는 멀티스레드 시 위험하다.
2)
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static final Singleton getInstance(){
if(instance==null)
instance=new Singleton();
return instance;
}
}
----------------------------------------------------------------------------------
아래 3번과 같은 경우는 안전하지만 성능상 1번이 제일 좋다.
3)
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static final Singleton getInstance(){
if(instance==null)
synchronized(Singleton.class){
instance=new Singleton();
}
return instance;
}
}
----------------------------------------------------------------------------------
아래 4번과 같은 경우는 싱글톤에서 직렬화를 처리하기 위한 방법이다. Serializable 을 구현하고 readResolve 메서드를 구현하고, 모든 인스턴스 필드를 transient 로 선언한다.
4)
public class Singleton implements Serializable{
private static final long serialVersionUID=6209266452691660409L;
private static final transient Singleton instance=new Singleton();
private Singleton(){}
public static final Singleton getInstance(){
return instance;
}
private Object readResolve(){
return instance;
}
}
----------------------------------------------------------------------------------
아래 5번과 같은 경우는 enum 을 사용한 구현방법이다. 직렬화가 자동으로 지원되며 인스턴스가 여러 개 생기지 않도록 지원한다.
5)
enum Singleton{
instance;
public void method(){}
}
[출처] brogram.egloos.com/630779