动机:
在软件系统中,经常需要一些这样特殊的类,必须保证它在系统中只有一个实例。才能保证它的逻辑正确性、及良好的效率。
方案一:
public class Singleton1 {
private Singleton1(){
}
private static Singleton1 singleton;
public static Singleton1 getInstance(){
if(singleton==null){
singleton=new Singleton1();
}
return singleton;
}
}
这种在单线程程序中是没什么问题的,可以传入参数,但多线程程序中,则可能会创建出2个或多个对象。
方案二:
public class Singleton2 {
private static Singleton2 singleton=new Singleton2();
private Singleton2(){
}
public static Singleton2 getInstance(){
return singleton;
}
}
这种基本上解决了多线程的问题,但是不能传入参数。
方案三:
public class Singleton3 {
private static class Singleton3Holder{
private static Singleton3 singleton=new Singleton3();
}
private Singleton3(){
}
public static Singleton3 getInstance(){
return Singleton3Holder.singleton;
}
}
方案四:
public class Singleton4 {
private Singleton4(){
}
private static Singleton4 singleton=null;
public static Singleton4 getInstance(){
if(singleton==null){
sychronized (Singleton4.class){
if(singleton==null){
singleton=new Singleton4();
}
}
}
return singleton;
}
}