单利模式
保证一个类仅有一个实例,提供了唯一的全局访问点,控制全局访问;控制实例数量,节约了资源,对于频繁创建和销毁的对象,提高系统性能。
如线程池、打印机和显卡等的设备驱动。
要点
- 私有构造方法,避免被外部实例化
- 静态公开的获取唯一实例的方法
- 私有内部实例(对外部不可见,避免修改)
几种实现方式
- 饿汉
类加载时就初始化(创建时机不可控,线程安全) - 懒汉
线程不安全的懒汉模式:多线程下严格来说不是单例
线程安全的懒汉模式:每次获取实例都会竞争锁,效率低
懒汉模式在第一次调用时才初始化 - 双重校验锁 DCL double-checked locking
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
- 静态内部类
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }