一种设计模式,用该模式设计的类,只能创建出一个实例
场景: Spring: 一个Component就只有一个实例JavaWeb: 一个Servlet只有一个实例文件系统: 一个操作系统只能有一个文件系统用到较多的单例模式实现方式:饿汉式、懒汉式、双重检测锁、静态内部类。
实现要点: 隐藏构造器static Singleton实例暴露实例的获取方法 追求的目标 线程安全调用效率高延迟加载双重检测锁是懒汉式的优化,避免每次实例化都会同步(synchronized)耗时,加入两个if判断。
/** * @description: 双重检测锁,适用于JDK1.5之后的版本 * @author: huang xin * @create: 2018-10-25 21:29 */ public class DoubleCheckSingleton { private DoubleCheckSingleton(){} /* * 需要使用volatile * 保证所有的写(write)都将先行发生于读(read) * */ private static volatile DoubleCheckSingleton singleton; /* * 只在第一次实例化进入锁 * 优点:可以达到延迟加载的要求,调用效率高 * */ public static DoubleCheckSingleton getInstance(){ if (singleton == null){ //第一次检测;存在实例就不进入 synchronized (DoubleCheckSingleton.class){ if (singleton == null){ //第二次检测:防止B线程在获得A线程释放的锁后重入 singleton = new DoubleCheckSingleton(); } } } return singleton; } }