1、单例模式
构造器私有
饿汉式
一开始就把对象创建好
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY ;
}
- 可能会浪费空间
懒汉式
调用的时候才创建对象
private static LazyMan lazyMan;
public static LazyMan getInstance(){
if(lazyMan==null){
lazyMan = new LazyMan();
}
return lazyMan();
}
- 并发的时候可能会失败
双重检测锁(DCL懒汉式)
private static LazyMan lazyMan;
public static LazyMan getInstance(){
if(lazyMan==null){
synchronized(LazyMan.class){
if(lazyMan==null){
lazyMan = new LazyMan();
}
}
}
return lazyMan();
}
不是原子性操作
- 分配内存空间
- 执行构造方法,初始化对象
- 把这个对象指向这个空间
有可能指定132或者123
加上原子性
private volatile static LazyMan lazyMan;
public static LazyMan getInstance(){
if(lazyMan==null){
synchronized(LazyMan.class){
if(lazyMan==null){
lazyMan = new LazyMan();
}
}
}
return lazyMan();
}
静态内部类
public class Holder
private Holder(){
}
public static Holder getInstance(){return InnerClass.HOLDER}
public static class InnerClass{
private final Holder HOLDER = new Holder();
}
枚举
有参构造