这两天在看开源项目时,发现Event Bus和Universalimageloader中写单例模式都是Double Check的形式。平时总是看到各种各样的单例模式,如,饿汉式,懒汉式等等。其中大多存在问题。今天记录一种比较优秀的单例模式的写法------Double Check。以后我准备就用这种方法了。(虽然还有其他优秀的方式,比如内部静态类,枚举)

先上代码:

public class ImageLoader {private volatile static ImageLoader instance;// Returns singleton class instancepublic static ImageLoader getInstance() {if (instance == null) {synchronized (ImageLoader.class) {if (instance == null) {instance = new ImageLoader();}}}return instance;}
}

这是EventBus中的代码。其中两次检查是否instance == null,第一个是为了避免每次都加锁,毕竟这有一定的开销。第二个是为了避免同步问题,比如十个线程同时调用getInstance()方法,都执行了第一步检查instance == null,并且其中一个线程成功获得了锁(执行了synchronized语句),接下来如果没有再一次判断instance == null,则十个线程将生成10对象,这违背了单例的初衷。

上述代码除了有两次检查instance == null,另一个特点是变量instance的类型声明中添加了volatile,因为像下面这种创建对象的语句并不是原子操作,volatile可以使其成为原子操作,避免同步问题。

instance = new ImageLoader();

虽说部分JVM没有完全volatile,但是目前主流的JVM貌似已经都支持了,所以这个问题一般可以忽略。

参考:

http://www.zhihu.com/question/29971746

https://www.v2ex.com/t/193589#reply15

Double Check形式的单例模式相关推荐

  1. Eureka源码-double check单例模式运用

    1.在看源码之前,首先先解释一下什么是double check,以及单例模式中为什么需要double check来进行单例模式的创建? double check,也叫双重检测,主要利用两次的判断进行校 ...

  2. 为什么单例模式中的Double Check要加volatile

    对于单例模式的详细内容,请参考我的上一篇文章 https://blog.csdn.net/Jarvenman/article/details/100136562 在单例模式中,有一种写法叫Double ...

  3. 您能看出这个Double Check里的问题吗?(解答)

    问题请参考:您能看出这个Double Check里的问题吗? 已经很有很多朋友得到了结果,是由于m_categories过早初始化,而导致double check的验证条件被破坏(或者说,满足). p ...

  4. 您能看出这个Double Check里的问题吗?

    昨天在做code review时看到一位同事写了这样的代码.这段代码的目的使用Double Check的做法来保证线程安全的延迟加载.但是我看到这代码之后发现了一个问题,这个问题不是第一次出现.因此, ...

  5. double check java_由java double check说起

    引子 在java中,为了保证某种资源只被初始化一次,我们通常会将其放入同步代码块中,如: public synchronized Resource getResource(){ if (resourc ...

  6. 单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)...

    首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked lockin ...

  7. 为什么单例模式需要double check

    2019独角兽企业重金招聘Python工程师标准>>> 最近被多线程问题(multi-thread issue)弄昏了头.以前虽然也知道系统里要考虑多线程问题,也无数次见到doubl ...

  8. 单例模式之双重检查锁(double check locking)的发展历程

    不安全的单例 没有注意过多线程安全问题的时候,我们的单例可能是这样的: public final class Singleton {private static Singleton instance; ...

  9. Java中如何将以byte数组给出的数据转换为double数组形式

    1 致谢 感谢陈玮学长的代码  由于学习了他的代码 我才最终得出了正确的结论 2 问题描述 今天编程的时候遇到1个问题 需要从一个二进制文件中读取double[]的数据 我们使用的编程语言是Java语 ...

最新文章

  1. 最全Python算法实现资源汇总!
  2. 【Linux 内核】进程优先级与调度策略 ② ( 获取调度策略对应的进程优先级函数 | sched_get_priority_max 函数 | sched_get_priority_min 函数 )
  3. php.ini权限,php开启与关闭错误提示适用于没有修改php.ini的权限_PHP
  4. 中国电梯市场产量规模与盈利趋势分析报告2022-2028年
  5. Fashion-MNIST数据集发布一周年,论文引用量超250篇
  6. lhgselect 联动选择下拉菜单 v1.0.0 (2011-06-13)
  7. FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeExcepti
  8. 理解x86架构的捷径
  9. jbpm6 mysql_JBPM6把默认的H2数据库替换成mySql
  10. 阿里实习转正面试收获总结
  11. 初识CornerNet
  12. vue动态路由变化页面不重新加载问题,实现方式比较简单,就是有点鸡贼
  13. Leo写的前言 自由与规则—— 程序员羊皮卷 连载 8
  14. 灰色系统预测模型GM(1,1),GM(1,n)及Matlab实现
  15. C++最长公共子序列问题(LCS)(递归+迭代)
  16. Web 服务系列标准和规范
  17. 本以为PlusFo是个青铜,没想到竟是个王者
  18. Java中关于队列与栈的区别
  19. HCIP网络配置(MGRE+OSPF+优化)
  20. 【毕业设计】61-基于单片机的超声波测距仪设计(原理图、仿真工程、答辩论文、答辩PPT、开题报告、任务书)

热门文章

  1. ###好好好###异质信息网络分析与应用综述(石川)--阅读
  2. JS基础之数组--概述、创建数组的几种方式、数组的特点、数组的常用方法、数组的解构赋值、数组高级API
  3. 无座火车票为什么不能半价?
  4. webrtc视频引擎之video_render(视频渲染)介绍
  5. 留言赠书|GitHub收获1W星标《迁移学习导论》重新整理升级
  6. 苹果4s怎么越狱教程_苹果iOS 11.4-11.4.1越狱发布:附越狱教程
  7. ceph管理界面calamari(未成功)
  8. CSS进阶班笔记(五)
  9. python非线性可分支持向量机模型(实现iris分类)
  10. python3下载m3u8转mp4_Python3.6:根据m3u8下载mp4视频