单例模式
一、单例模式核心作用:
- 保证一个类只有一个实例,并提供一个访问该实例的全局访问点。
二、常见的五种单例模式实现方法
- 主要
- 懒汉式:(线程安全,调用效率高,不能延时加载)
- 饿汉式:(线程安全,调用效率不高,可以延时加载)
- 其他
- 双重检测锁:(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
- 静态内部类:(线程安全,调用效率高,可以延时加载)
- 枚举单例:(线程安全,调用效率高,不能延时加载)
/** * 饿汉式 */ public class SingletonDemo01 { //1.私有构造器 private SingletonDemo01(){ } //2. 提供静态属性,直接new对象 private static SingletonDemo01 instance = new SingletonDemo01(); //类初始化时,立即加载,所以叫饿汉式。 // 但是如果不使用这个对象,则白白加载了,浪费资源,所以最好能延时加载。 //3. 提供一个公开访问的方法 public static SingletonDemo01 getInstance(){ return instance; } //这里不需要使用“Synchronized”, 因为类初始化的时候对象被创建,加载类的时候线程是必然安全的。 } //由于方法没有同步,调用效率高!
/** * 懒汉式 */ public class SingletonDemo01 { //1.私有构造器 private SingletonDemo01(){ } //2. 类初始化时,不初始化对象,等到方法被调用的时候才创建(延时加载) private static SingletonDemo01 instance; //3. 提供一个公开访问的方法 public static synchronized SingletonDemo01 getInstance(){ if (instance == null){ instance = new SingletonDemo01(); } return instance; } //这里必须使用“Synchronized”! 因为对象在方法被调用的时候才创建,如果不小心被多个线程同时调用,则出现多个对象,所以要加锁。 } //由于方法同步,调用效率低!
/** * 双重检测锁模式
* 调用效率高,也可以延时加载。但是由于JVM底层设计的问题,偶尔会数据出错,不建议使用。 * 基本思想是把同步放到if内部,提高执行效率,这样不用每次获取对象的时候都同步,只有第一次的时候需要同步。 */
/** * 静态内部类实现 */ public class SingletonDemo01 { //1、私有化构造器 private SingletonDemo01(){ } //2、构造静态内部类,New对象 private static class SingletonClassInstance{ private static final SingletonDemo01 instance = new SingletonDemo01(); } //3、构造公共访问方法。只有调用这个方法的时候,才会加载到这个内部类,所以实现了延时加载 //同时由于加载类是天然的线程安全,所以在加载内部类的时候也一样,实现了线程安全 //只有在调用这个方法的时候才加载,所以调用效率也不错 public static SingletonDemo01 getInstance(){ return SingletonClassInstance.instance; } }
/** * 枚举实现单例 * 枚举本身就是单例,所以实现比较简单。但不能延时加载。 */ public enum SingletonDemo01 { /** * 定义一个枚举元素,他就代表了Singleton的一个实例。 */ INSTANCE; /** * 单例可以有自己的操作 */ public void singletonOperation(){ //功能处理 } }
浙公网安备 33010602011771号