单例模式你应该知道的几种写法

Posted 西厢夜雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式你应该知道的几种写法相关的知识,希望对你有一定的参考价值。

单例模式在23种设计模式中算是比较常用的了,在应用这个模式时,单例对象的类必须保证只有一个实例存在,而关于它本身也是细分了不同种类的实现(懒汉式、饿汉式、双重检查等等),本篇只是总结了几种常见的写法,权当笔记啦!

这是典型的饿汉式单例,Singleton类加载时就会创建instance实例,这样就需要提前开销一部分系统资源。如果该实例在后期未使用,岂不是浪费了系统资源。其它问题不存在

 private Singleton() {}   private static Singleton instance = new Singleton();   public static Singleton getInstance() {       return instance;   }

懒汉单例模式只有在第一次使用时才会初始化单例,一定程度上能节约资源,但反应会稍慢;通过 synchronized 关键字,保证了在多线程情况下单例的唯一性,但是在单例被第一次初始化后,再调用 getInstance() 方法还需要进行同步操作,这样会造成不必的系统开销。

private Singleton(){   }   private static Singleton instance;   public static synchronized Singleton getInstance(){       if (instance == null){           instance = new Singleton();       }       return instance;   }

双重检查锁定单例模式(Double Check Lock)在 getInstance() 中,首先对instance进行非空判断,避免多余的同步,这也解决了懒汉单例模式中每次同步的问题,接下来如果 instance为空则创建其实例,当然这一步需要保证同步操作。注意 instance = new Singleton();这行代码,它的执行可以分解为第三个步骤:

(1)为 instance 实例分配内存。

(2)执行 Singleton 构造函数来初始化 instance。

(3)将 instance 指向分配的内存。

但在JDK1.5前,上边的(2)(3)无法保证按顺序执行,如果按(1)(3)(2)顺序,假如A线程执行完(3),(2)未执行就被切换到B线程,因为步骤(3)已经在A线程执行,则B线程直接取走了认为非空 instance,这就导致双重检查锁定的判断失效。

在JDK1.5后,只要这样声明 instance 实例:private volatile static Singleton instance;即添加 volatile 修饰符,这样就可以保证 instance 每次都从主内存读取,避免了上边的问题,但会略影响性能。这种单例模式也是在第一次执行 getInstance() 时创建单例,但第一次反映稍慢。

private Singleton() { } private volatile static Singleton instance; public static Singleton getInstance(){   if (instance == null){       synchronized (Singleton.class){           if (instance == null){//两次判断了instance==null,所以称为双重检查               instance = new Singleton();           }       }   }   return instance; }

静态内部类单例模式:这种方式只有在的第一次调用getInstance()方法时,虚拟机才会加载 SingletonHolder 类,并初始化instance 实例,即保证了线程同步,也能保证单例的唯一性,相对双重检查锁定单例模式简单了许多,推荐使用这种方式来实现单例模式。

private Singleton(){} private static Singleton getInstance(){    return SingletonHolder.instance; } private static class SingletonHolder{    private static final Singleton instance = new Singleton(); }


以上是关于单例模式你应该知道的几种写法的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE面试题——Singleton单例模式的几种写法

茴香豆的“茴”有几种写法?单例模式你知道有几种写法?

单例模式(下)---聊一聊单例模式的几种写法

单例模式(下)---聊一聊单例模式的几种写法

单例模式的几种写法

你知道单例模式几种写法吗?