阅读前须知:原文博客请访问 merengues.top
单例模式(singleton)保证一个类只有一个实例,并且提供了一个访问全局访问点。
使用时创建实例。
优点:第一次调用的时候才初始化,避免内存浪费。
缺点:必须加锁才能保证线程安全,加锁则会影响性能。
类加载时就创建实例。
优点:不用加锁就能保证线程安全,执行效率高。
缺点:类加载就初始化,内存浪费。
1)示例1
public class Singleton{ private static Singleton instance; private Singleton(){}; public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }线程不安全,避免使用。
2)示例2
public class Singleton{ private static Singleton instance; private Singleton(){}; public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }线程同步,线程安全,效率低,避免使用。
3)示例3
public class Singleton{ private static Singleton instance; private Singleton(){}; public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ instance = new Singleton(); } } return instance; } }线程不安全,会产生多个实例,不可用
1)示例1
public class Singleton{ private static Singleton instance = new Singleton; private Singleton(){}; public static Singleton getInstance(){ return instance; } }2)示例2
public class Singleton{ private static Singleton instance = null; static{ instance = new Singleton; } private Singleton(){}; public static Singleton getInstance(){ return instance; } }无线程安全问题,影响系统效率,不推荐
双重校验锁,线程安全,懒加载,推荐使用
静态内部类,线程安全,主动调用才示例化,懒加载效率高,推荐使用
枚举类型,无线程安全问题,避免序列化创建新实例,使用少;