一、静态内部类,优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazyloading
class InternalSingleton{
privatestatic class SingletonHolder{
private final static InternalSingletonINSTANCE=new InternalSingleton();
}
privateInternalSingleton(){}
publicstatic InternalSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
因为当外部类加载时,内部类并没有加载,直到内部类使用时才加载。
推荐使用此方法,因为此方法既实现了惰性初始化,又保证了线程并发时可能会出现单例失效的错误问题。
二、恶汉,缺点:没有达到lazy loading的效果
class HungrySingleton{
private static HungrySingleton singleton=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return singleton;
}
}
三、懒汉,常用的写法
class LazySingleton{
privatestatic LazySingleton singleton;
privateLazySingleton(){
}
publicstatic LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
此方法在线程并发时会出现单例失效的情况
原帖地址:http://www.oschina.net/code/snippet_107039_6062