核心思想:构造器私有化。
饿汉式:
//饿汉式单例模式
public class Hungry {
private Hungry(){}
private final static Hungry hungry=new Hungry();
public static Hungry getHungry(){
return hungry;
}
}
缺点:
消耗内存过高
在反射下是不安全
懒汉式(线程不安全)
public class LazMan {
private LazMan(){}
public static LazMan lazman;
public static LazMan lazMan(){
if (lazman==null){
lazman=new LazMan();
}
return lazman;
}
}
缺点:
在多线程下不安全
在反射下不安全
懒汉式(线程安全)
//懒汉式单例
public class LazMan {
private LazMan(){}
public volatile static LazMan lazman;
public static LazMan lazMan(){
if (lazman==null){
synchronized (LazMan.class){
if (lazman==null){
lazman=new LazMan();
}
}
}
return lazman;
}
}
缺点:
在反射下不安全
内部类单例
//静态内部类单例
public class Holder {
private Holder(){}
public static Holder getHolder(){
return InnerClass.holder;
}
private static class InnerClass{
private final static Holder holder=new Holder();
}
}
缺点:
在反射下不安全
为什么反射可以破解:
使用反射可以直接修改内部的权限
直接可以把构造器公开
解决:
使用枚举,因为反射不能破坏枚举
public enum EnumSingle {
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}