又见单例模式

Posted Draper的技术小站

tags:

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

单例模式怎么实现不说了,实现的方式有很多种,其中一种是双检锁,觉得都快被说烂了,没想到今天看到又被人说出花儿了,感觉真的是学海无涯

实现单例我们一般的关注点是在以下的几个方面

  1. 构造函数是私有的,不能通过 new 关键字来创建对象,一般是通过 getInstance 方法来获取对象

  2. 单例模式是否线程安全

  3. 是否支持迟加载

  4. getInstance 的性能是否足够高

今天让我出花的是主要是第四点

先上一下我们通常的单例模式

 
   
   
 
  1. public class Singleton {


  2. private volatile static Singleton instance;


  3. private Singleton() {}


  4. public static Singleton getInstance() {

  5. if (instance == null) {

  6. synchronized (Singleton.class) {

  7. if (instance == null) {

  8. instance = new Singleton();

  9. }

  10. }

  11. }

  12. return instance;

  13. }

  14. }

按常理来说这就足够了,但是...这居然还有优化的地方! 上代码

 
   
   
 
  1. public static Singleton getInstance() {

  2. Singleton temp = instance;

  3. if (temp == null) {

  4. synchronized (Singleton.class) {

  5. if (temp == null) {

  6. temp = new Singleton();

  7. instance = temp;

  8. }

  9. }

  10. }

  11. return instance;

  12. }

注意到第 2 行,把全局变量赋值给了一个局部变量,然后对这个局部变量进行校验,最后在第 7 行将创建出来的对象赋予全局变量 instance

为什么这么做

Using localRef, we are reducing the access of volatile variable to just one for positive usecase. If we do not use localRef, then we would have to access volatile variable twice - once

使用本地局部变量可以减少对 volatile 变量的访问,提高程序的性能

参考资料:Threadsafe Singleton Design Pattern Java

以上是关于又见单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式

常用代码片段

常用代码片段

没别的,见单干活

性能比较好的单例写法

片段作为 Android 中的单例