- 单例设计模式核心作用:确保一个类只有一个实例,并且提供一个访问该实例的全局访问点
- 常见的应用场景:
- 项目当中读取文件的类,一般只有一个对象,没必要每次使用配置文件数据的时候都要new一个对象去读。
- 网站的计数器,一般也是单例实现,否则难以同步。
- 应用程序的日志应用,一般也是采用单例实现的,因为共享的日志文件一直处于打开状态,只能有一个实例去操作,否则内容不好追加。
- 数据库连接池的设计一般也是采用单例模式。
- 在spring中,每个Bean默认就是单例
- 在servlet编程中,每个Servlet也是单例的
- 在springMVC框架/struts1框架中,控制器对象也是单例的
- 单例模式的优点:
- 由于单例模式只能生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在启动时直接产生一个单例对象,然后永驻内存的方式来解决
- 单例模式可以再系统全局设置访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有表的映射处理。
- 常见的5种单例模式的实现方式:
- 主要:
- 饿汉模式(线程安全,调用效率高。但是不能延时加载。)
- 懒汉模式(线程安全,调用效率不高。但是。可以延时加载。)
- 其他:
- 双重检测锁式(一般不建议使用,由于JVM底层内部模型原因,偶尔会有问题{具体什么原因,出什么问题还不懂。。。。})
- 静态内部类式(线程安全,调用效率高。可以延时加载)
- 枚举单例(线程安全,调用效率高,不能延时加载)
- 主要:
- 饿汉式实现
package org.test.singleton; /** * * @ClassName: SingletonDemo1 * @Description: 饿汉单例模式 * 1.私有无参构造 * 2.私有静态属性直接创建实例 * 3.提供开放的访问方法 * @author Administrator * @date 2017年3月30日 * */ public class SingletonDemo1 { //类初始化时立即加载这个对象,加载类时,是线程安全的 private static SingletonDemo1 instance = new SingletonDemo1(); private SingletonDemo1() { } public static SingletonDemo1 getInstance(){ return instance; } }
- 懒汉式实现
package org.test.singleton; /** * * @ClassName: SingletonDemo2 * @Description: 懒汉式单例 * 1.私有无参构造 * 2.私有静态属性不实例化 * 3.提供开放的访问方法访问的时候去实例化需要同步 * @author Administrator * @date 2017年3月30日 * */ public class SingletonDemo2 { private static SingletonDemo2 instance; private SingletonDemo2(){ } public static synchronized SingletonDemo2 getInstance(){ if (instance==null) { instance = new SingletonDemo2(); } return instance; } }
饿汉式虽然资源利用率高了但是每次或去实例化都要同步,并发效率低。如果创建一个对象代价很高可以使用懒汉式,反之调用非常频繁可以使用饿汉式。