单例模式思想:构造器私有
饿汉式:在加载的时候就实例化 容易造成资源的浪费
//饿汉式单例
public class Hungry {
private Hungry() {
}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance() {
return HUNGRY;
}
}
懒汉式:线程不安全
//懒汉式单例
public class LazyMan {
private LazyMan() {
}
private static LazyMan lazyMan;
public LazyMan getInstance() {
if(lazyMan==null) {
lazyMan = new LazyMan();
}
return lazyMan;
}
}
DCL懒汉式:还是有问题指令重排导致出错
//懒汉式单例
public class LazyMan {
private LazyMan() {
}
private static LazyMan lazyMan;
// 双重检测锁模式 懒汉式单例 DCL懒汉式
public LazyMan getInstance() {
if(lazyMan==null) {
synchronized (LazyMan.class) {
if(lazyMan==null) {
lazyMan = new LazyMan(); // 不是原子性操作
/*
*1.分配内存空间
*2.执行构造方法,初始化对象
*3.把这个对象指向这个空间
*
* 123操作顺序
* 创建线程1有可能执行132顺序操作 暂时也行
* 但是创建线程2继续132就会报错 因为以为lazyMan!=null 会直接 return
* 此时lazyMan没有完成构造
*/
}
}
}
return lazyMan;
}
}
DCL懒汉式+volatile:
//懒汉式单例
public class LazyMan {
private LazyMan() {
}
private volatile static LazyMan lazyMan;
// 双重检测锁模式 懒汉式单例 DCL懒汉式
public LazyMan getInstance() {
if(lazyMan==null) {
synchronized (LazyMan.class) {
if(lazyMan==null) {
lazyMan = new LazyMan();
}
}
}
return lazyMan;
}
}
静态内部类:
//静态内部类
public class Holder {
private Holder() {
}
public static Holder getInstace() {
return InnerClass.HOLDER;
}
public static class InnerClass{
private static final Holder HOLDER = new Holder();
}
}
枚举:
//枚举 enum本身也是一个Class类
public enum EnumSingle {
INSTANCE;
public EnumSingle getInstance() {
return INSTANCE;
}
}
单例不安全可以通过反射进行破坏
但是反射不能破坏枚举的单例模式