单例模式
方式七种
其中
饿汉 –> 饿汉变种--> 静态内部类
懒汉 线程不安全 --> 懒汉 线程安全–> 双重校验锁
枚举法 网上最推荐的。stackoverflow 上点赞最多的….因为双重校验锁有反射存在的问题
关键单词
instance
enum
synchronized
应该先从饿汉模式开始看, 线程安全。
饿汉 ,
// #饿汉
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
这两种没什么区别,只不过放在了 静态块
//# 饿汉变种
public class Singleton{
private Singleton instance=null;
static{
instance=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return this.instance;
}
}
内部静态类
//【推荐】5 静态内部类,前两种是只要singleton 被装载,那么instance就被实例化
// 而这种方法使用调用getInstance 才会被装载,从而实例化instance。
//目的,实例化instance 消耗资源大,希望延迟加载
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
饿汉式
// #懒汉 线程不安全
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance{
if(instance == null){
instance=new Singleton();
}
return instance;
}
}
// #懒汉 线程 安全 效率低
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance{
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
//【推荐】 双重校验锁
public class Singleton{
private static Singleton instance=null;
private Singleton(){}
public static final Singleton getInstance(){
if(instance==null)
{
synchronized(Singleton.class)
{
if(Singleton==null)
instance=new Singleton();
}
}
}
}
//双重校验锁仍然是有缺点的,极力推荐 enum法
//https://www.jianshu.com/p/1f856daa39c7
枚举
//【推荐】6 、 大神 枚举法 !!! 可以避免 多线程同步问题,还能防止反序列化重新创建对象
public enum Singleton{
INSTANCE;
public void whaterverMethod(){
}
}
//因为JVM会保证enum不能被反射并且构造器方法只执行一次。
//https://837062099.iteye.com/blog/1454934
//枚举的本质 是枚举 对象! ,http://c.biancheng.net/view/1100.html
//https://www.cnblogs.com/alter888/p/9163612.html
//枚举实现原理 , 会生成相关的类,集成