java设计模式 GOF23 01 单例模式

一.单利模式简介

单例模式能保证在一个JVM中,该对象只有一个实例存在

 

二.应用场景:

1)windows的任务管理器

2)读配置文件

3)网站计数器

4)数据库连接池

5) spring MVC控制对象

 

三.优点

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

 

四:五种实现方式:

  1)饿汉式(线程安全,调用效率高,但是不能延迟加载)

/* * 单例模式 * 饿汉式 * @author lz */
public class Test01 { private Test01() { } /* * 立即加载,线程安全,有可能浪费资源 */
    private static Test01 s = new Test01(); /* * 调用效率高 */
    public static Test01 getTest01() { return s; } }

 

   2)懒汉式 (可以延时加载,调用效率低)

/* * 单例模式 * 懒汉汉式 * @author lz */
public class Test02 { /* * 私有化构造器 */
    private Test02() { } private static Test02 s; /* * 延时加载,(懒加载) 需要用的时候再加载,调用效率低 * synchronized保证线程安全,不会重复加载 */
    public static synchronized Test02 getInstance() { if ( s==null ) { s = new Test02(); } return s; } }

  3)双重检测锁实现(一般用不到)

同步内容放在if下面,只在第一次调用时进行同步。但是由于编译器优化和jvm不支持会有问题

 

  4)静态内部类的实现方式 (调用效率高,可延时)

/* * 静态内部类实现单例模式 */
public class Test03 { /* * 类加载器加载Test03时不会加载内部类 */
    private static class classInstance { private static Test03 s = new Test03(); } /* * 调用时才初始化s,所以不会浪费资源 * 又因为内部类是static所以不会重复调用 */
    public static Test03 getInstance() { return classInstance.s; } private Test03() {} }

  5)枚举方式 (枚举天然单例)

/* * 枚举实现单例 * 避免反射和反序列化 * 但是没有延时加载 */
public enum Test04 { /* * 本身就是单例代表单例对象 */ INSTANCE; }

总结:

不需要延时时 枚举式好于饿汉式

需要延时时 静态内部类好于懒汉式

你可能感兴趣的:(java设计模式 GOF23 01 单例模式)