单例模式一般用于内存占据较大、初始化过程复杂对象的延迟按需初始化,从而减少程序运行的资源开销。
在过往的单例模式应用中一般使用volatile + DCL双检模式来编写,高并发下存在单例对象可以引用(即判null返回的是true)但是存在初始化失效或者部分初始化的问题;
/**
* volatile + DCL 实现单例模式(懒汉式)
*/
@Deprecated
public class MySingleton{
private volatile static MySingleton mySingleton;
private MySingleton(){
//初始化 ....
}
public static MySingleton getInstance(){
if (mySingleton == null){
synchronized (MySingleton.class){
if(mySingleton == null){
mySingleton = new MySingleton();
}
}
}
}
return mySingleton;
}
JMM 5.0后一般使用 延迟初始化占位类模式,进行单例模式的应用,利用静态内部类调用时初始化,达到按需懒加载;
/**
* 延迟初始化占位类模式 实现单例懒加载,可以达到同样效果,更加安全,且容易理解(推荐)
*/
public class ResouceFactory{
private static class ResourceHolder{
public static Resource resource = new Resource();
}
public static Resource getResource(){
return ResourceHolder.resource;
}
}
class Resource{
public Resource(){
//初始化构造...
}
}