ahnuzfm 2020-07-30
单个实例
保证程序中只有一个实例
/* * 饿汉式 类加载到内存中,实例化一个单例,jvm保证线程安全 简单实用,推荐使用 Class.forName("") 唯一缺点: 不管用到与否,类装载时就完成实例化 (不用装载他干啥?) */ public class Mg01{ private static final Mg01 INSTANCE= new Mg01(); private Mg01(){} public static Mg01 getInstance(){ return INSTANCE; } } /** lazy loading 懒汉式 不安全 */ public class Mg03{ private static Mgr03 INSTANCE; private Mg03(){} public static Mr03 getInstance(){ if(INSTANCE == NULL){ INSTANCE = new Mg03(); } return INSTANCE; } } //加锁 没问题 但是颗粒度太大 public class Mg03{ private static Mgr03 INSTANCE; private Mg03(){} public static synchronized Mr03 getInstance(){ if(INSTANCE == NULL){ INSTANCE = new Mg03(); } return INSTANCE; } } /** 颗粒度小了 但是又出现 现场安全问题 */ public class Mg03{ private static Mgr03 INSTANCE; private Mg03(){} public static Mr03 getInstance(){ if(INSTANCE == NULL){ synchronized(mg03.class){ INSTANCE = new Mg03(); } } return INSTANCE; } } /** 双重检测 DCL 完美 */ public class Mg03{ //volatile 加上 不然会有指令重排问题 private static volatile Mgr03 INSTANCE; private Mg03(){} public static Mr03 getInstance(){ if(INSTANCE == NULL){ synchronized(mg03.class){ if(INSTANCE == NULL){ INSTANCE = new Mg03(); } } } return INSTANCE; } } //完美 另一种 静态内部类 public class Mg04{ private Mg04(){} private static class Mg04Holder{ private final static Mg04 instance = new Mg04(); } public static Mg04 getInstatnce(){ return Mg04Holder.instance; } } //枚举单例 最完美的 // 不仅可以解决线程同步,还可以防止反序列化 // 防止反序列化 完美的 原因是 枚举类没有构造方法 public enum Mg05{ INSTANCE; public void m(){} } //语法上最完美 枚举单例