取材均来自head first dp。
单例模式的懒汉式:
public class LazySingleton {
private static LazySingleton singleton = null;
private LazySingleton() {
super();
}
public LazySingleton getInstance(){
if(singleton == null){
singleton = new LazySingleton();
}
return singleton;
}
}
单例模式的勤汉式:
public class DiligentSingleton {
private static DiligentSingleton instance = new DiligentSingleton();
private DiligentSingleton(){}
private static DiligentSingleton getInstance(){
return instance;
}
}
差异:
1.当单例管理的资源很重,而这次执行过程中有可能没有用到它,就会造成资源浪费,所以优先考虑懒汉式,当使用时再进行初始化操作。
2.懒汉式处在并发环境中时,很可能出现意外,导致创建多个实例,从而造成错误,勤汉式依赖jvm加载这个类时马上初始化对象,可以规避并发问题。
多线程懒汉式:
public class MultithreadingSingleton {
//volatile防止编译器对初始化顺序进行重排
private volatile static MultithreadingSingleton instance = null;
private MultithreadingSingleton(){};
public static MultithreadingSingleton getInstance(){
if(instance == null){
synchronized(MultithreadingSingleton.class){
if(instance == null){
instance = new MultithreadingSingleton();
}
}
}
return instance;
}
}
基于类初始化的解决方案
public class InstanceFactory {
private static class InstanceHolder {
public static Instance instance = new Instance();
}
public static Instance getInstance() {
return InstanceHolder.instance ; //这里将导致InstanceHolder类被初始化
}
}