单例模式
单例模式优点
- 由于单例模式只生成一个实例,较少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其它依赖对象时,
则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存来解决。 - 单例模式可以在系统设置全局的访问点,优化资源共享访问,例如可以设计一个单例类,负责所有数据表的映射表处理。
常见的五中单例模式实现方式:
-
主要的两种
- 饿汉式(线程安全,调用效率高,但不能延时加载)
package com.kele; /**饿汉式单例模式 * @author 12402 */ public class SingleDemo01 { // 私有静态变量属性。 类初始化时,立即加载这个对象(没有延时加载的优势), private static SingleDemo01 instance = new SingleDemo01(); //构造器私有 private SingleDemo01(){ } // 方法没有同步,调用效率高 public static SingleDemo01 getInstance(){ return instance; } }
-
懒汉式(线程安全,调用效率不高,但能延时加载)
package com.kele; /**懒汉式单例模式 * @author 12402 */ public class SingleDemo02 { //类初始化时,不初始化这个对象(可以延时加载,真正用时才加载) private static SingleDemo02 instance; //构造器私有 private SingleDemo02(){ } // 方法同步,调用效率变低了 public static synchronized SingleDemo02 getInstance(){ if (instance == null){ // 真正用的时候再加载 instance = new SingleDemo02(); } return instance; } // 资源利用率高了,但是每次调用getinstance()方法是都需要同步,并发效率较低 }
-
其他
-
双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用,不举例)
-
静态内部类式(线程安全,调用效率高,并且可以延时加载)
package com.kele; /**静态内部类单例模式 * @author 12402 */ public class SingleDemo04 { private static class SingletonClassInstance{ private static final SingleDemo04 instance = new SingleDemo04(); } private SingleDemo04(){ } public static SingleDemo04 getInstance(){ return SingletonClassInstance.instance; } // 外部类没有static静态属性,不会像饿汉式那样立即加载对象 // 只要真正调用getInstance()方法时才会加载静态内部类,加载类时是线程安全的,instance是static final类型, // 保证了内存中只有这样一个实例存在,而且只能被赋值一次,所以是线程安全的 // 兼备了并发高效 调用,同事还能延时加载 }
-
枚举单例(线程安全,调用效率高,不可以延时加载)
package com.kele; /**枚举类单例模式 * @author 12402 */ public enum SingleDemo05 { // 这个枚举元素本身就是单例对象,不能延时加载 INSTANCE; // 添加自己需要的操作 public void singletonOperation(){ } }
-