-
饿汉式,效率高,不能延迟加载
public
class
ImageLoader{
private` `static` `ImageLoader instance =
newImageLoader;
private` `ImageLoader(){}
publicstatic
ImageLoader getInstance(){
return` `instance;
}
} -
懒汉式
public class SingleTon{
//类初始化,用到时才初始化,实现了延迟加载
private static SingleTon singleTon;
//构造器私有化
private SingleTon(){}
public static synchronized SingleTon getInstance(){
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
}
-
public class SingletonDemo5 {
private volatile static SingletonDemo5 SingletonDemo5;private SingletonDemo5() { } public static SingletonDemo5 newInstance() { if (SingletonDemo5 == null) { synchronized (SingletonDemo5.class) { if (SingletonDemo5 == null) { SingletonDemo5 = new SingletonDemo5(); } } } return SingletonDemo5; } }
-
静态内部类实现模式,可以延时加载
public class SingletonDemo3 { private static class SingletonClassInstance{ private static final SingletonDemo3 instance=new SingletonDemo3(); } private SingletonDemo3(){} public static SingletonDemo3 getInstance(){ return SingletonClassInstance.instance; }
-
枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)
public enum SingletonDemo4 {
//枚举元素本身就是单例
INSTANCE;
//添加自己需要的操作
public void singletonOperation(){
}
}
如何选用:
- -单例对象 占用资源少,不需要延时加载,枚举 好于 饿汉
- -单例对象 占用资源多,需要延时加载,静态内部类 好于 懒汉式
参考文档:
https://www.cnblogs.com/jie-y/p/10737744.html