1、什么是单例模式:
一个类在任何情况下只有一个实例,并提供一个全局访问点
特点:构造方法私有化
2、单例模式有哪些:饿汉、懒汉、注册式单例
(1)饿汉模式
直接实例化一个对象
优点:执行效率高,可以直接创建实例
缺点:在一定情况下,会造成内存资源浪费
public class HungrySingleton { private static final HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return hungrySingleton; } }
(2)懒汉模式
在需要的时候创建实例
优点:合理的安排了资源
缺点:线程不安全(通过双重锁和内部类可以解决)
public class LazySingleton { public static LazySingleton lazySingLeton=null; private LazySingleton(){}; /** * 懒汉模式 * 优点:使用时创建,不浪费资源内存 * 缺点:线程不安全 * @return */ public static LazySingleton getInstance(){ if(null == lazySingLeton){ lazySingLeton = new LazySingleton(); } return lazySingLeton; } /** * 双重锁 * 优点:线程安全、性能高、使用时创建不浪费资源内存 * 缺点:代码不够优雅 * @return */ public static LazySingleton getInstanceSynchronized(){ if(null == lazySingLeton){ synchronized (LazySingleton.class){ if(null == lazySingLeton){ lazySingLeton = new LazySingleton(); } } } return lazySingLeton; } }
内部类方法
public class LazyInsideClassSingleton { private LazyInsideClassSingleton(){ if(ClassSingleton.LAZY_INSIDE_CLASS_SINGLETON != null){ System.out.println("不允许非法访问"); } }; public static LazyInsideClassSingleton getInstance(){ return ClassSingleton.LAZY_INSIDE_CLASS_SINGLETON; } private static class ClassSingleton{ public static LazyInsideClassSingleton LAZY_INSIDE_CLASS_SINGLETON = new LazyInsideClassSingleton(); } }
(3)注册单例
枚举模式:将每一个单例缓存到统一的容器内,通过统一标识获取单例
public enum EnumSingleton { INSTANCE; private Object data; public Object getData() { return data; } public void setData(Object data) { this.data = data; } public static EnumSingleton getInstance(){ return INSTANCE; } }