1、单例模式的核心作用
保证一个类只有一个实例,只能通过该类提供的公共方法访问到该实例。
2、单例模式的优点
单例模式只能生成一个实例对象,减少了系统性能的开销,当一个对象的产生需要很多的资源时,例如读取配置文件等,则可以通过在应用启动时产生一个单例的对象,然后常驻内存,从而减少了系统性能的开销。
3、单例模式常见应用场景
-WIndows系统的任务管理器就是一个典型的单例模式;
-项目中,读取配置文件的类,也是通过单例模式实现的,这样只需要创建一个该类的实例,就能完成配置文件的读取工作;
-数据库连接池一般也是通过采用单例模式设计的,避免每次都需要创建新的对象,减少资源的开销;
-Servlet编程中用到的Application 也是单例模式的典型应用;
4、常见的五种单例模式及实现方式
(一)饿汉式
饿汉式顾名思义,在类加载时就初始化了static变量,创建了单例对象,不管后面有没有应用到该对象。如果只是加载了该类,而不会调用getInstance()方法,甚至永远不会调用,则会造成资源浪费。但饿汉式因为是使用静态变量的原因,只有在类加
载时创建对象,不会发生并发访问下多创建对象的情况。所以饿汉式是线程安全的。
(二)懒汉式
懒汉式只有在第一次调用getInstance()方法时,才创建单例对象,提高了资源利用率。但同时懒汉式使用synchronized关键字保证并发时的同步,所以并发效率低。
(三)双重检测锁实现
双重检测锁实现结合了懒汉式和饿汉式的有点,保证了线程安全和懒加载,但因为编译器优化和JVM底层内部模型原因,可能会出现问题,不推荐使用。
(四)静态内部类实现方式
外部类没有static属性,不会像饿汉式那样在加载类时就初始化单例对象,只有在调用getInstance()方法时,才会加载静态内部类,而其instance变量是static final的保证只有一份实例存在,且只能被赋值一次。保证了线程安全性及延迟加载。
(五)枚举实现方式
利用枚举类本身就是单例的特性,实现单例模式。这种方法线程安全,调用效率高,并且可以天然的防止反射和反序列化漏洞,但不能延时加载。
(注:因为博主水平有限,可能存在错误的地方,欢迎大家指正)