1. 单例模式
-
单例模式存在的意义
1. 一个class只有一个对象,减少了内存开支
2. 避免对资源多重占用
-
适用于单例模式的场景
1. 频繁创建及销毁的对象,例如工具类 2. 不变的对象 3. 重量级对象,例如JDBC连接,httpClient等
-
单例模式的使用
1. 饿汉式
/** * 恶汉式 * 优点:类加载时就完成了实例化,避免了线程同步问题。 * 缺点:static一直强引用这对象,直至类被销毁对象才会被销毁。可能造成内存浪费 */ public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } }
2. 饿汉式(双重检查)
/** * 懒汉式(双重检查) * 优点:线程安全,延迟加载,效率较高 */ public class Singleton { private static volatile Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
3. 懒汉式
/** * 静态内部类 * 原理:采用类加载的机制保证实例化的线程安全。当需要对象时,调用 getInstance 方法时才会加载 SingletonInstnce 类,完成实例化。 * 优点:线程安全,延迟加载 */ public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } }
4. 枚举
/** * 枚举 * 原理:借用枚举来实现单例,不仅能避免线程问题,还能防止反序列化重新创建新的对象。 */ public enum Singleton { INSTANCE; public void whateverMethod() { } }