Java 中的双重检查(Double-Check)

标签: java null initialization j2se 多线程 class
36966人阅读 评论(26) 收藏 举报
分类:

在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用。该模式的结构如下所示:

 

 

该模式是对下面的代码改进:

 

这段代码的目的是对 resource 延迟初始化。但是每次访问的时候都需要同步。为了减少同步的开销,于是有了双重检查模式。

在 Java 中双重检查模式无效的原因是在不同步的情况下引用类型不是线程安全的。对于除了 long 和 double 的基本类型,双重检查模式是适用 的。比如下面这段代码就是正确的:

 

上面就是关于java中双重检查模式(double-check idiom)的一般结论。但是事情还没有结束,因为java的内存模式也在改进中。Doug Lea 在他的文章中写道:“根据最新的 JSR133 的 Java 内存模型,如果将引用类型声明为 volatile,双重检查模式就可以工作了”,参见 http://gee.cs.oswego.edu/dl/cpj/updates.html

所以以后要在 Java 中使用双重检查模式,可以使用下面的代码:

 

 

当然了,得是在遵循 JSR133 规范的 Java 中。

所以,double-check 在 J2SE 1.4 或早期版本在多线程或者 JVM 调优时由于 out-of-order writes,是不可用的。 这个问题在 J2SE 5.0 中已经被修复,可以使用 volatile 关键字来保证多线程下的单例。

 

推荐方法 是Initialization on Demand Holder(IODH),

详见 http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

 

查看评论

JAVA 单例双重检查(double check)为什么不好用

JAVA 单例双重检查(double check)为什么不好用 在阅读之前,请先了解下线程并发涉及到的三个概念:原子性、可见性、有序性,可以看下这篇文章:http://www.cnblogs.co...
  • anjxue
  • anjxue
  • 2016-04-01 17:28:06
  • 2872

Java并发编程:volatile关键字解析 和双重检查(Double-Check)

转载:http://www.cnblogs.com/dolphin0520/p/3920373.html http://blog.csdn.net/dl88250/article/details/5...
  • fh09102103
  • fh09102103
  • 2015-10-02 16:55:31
  • 2882

Java使用double check(双重检查)实现单例模式的一个小细节

Java使用double check(双重检查)实现单例模式时,单例变量要使用volatile修饰
  • u010660307
  • u010660307
  • 2017-04-09 20:30:26
  • 951

java单例双重检查锁为什么需要加volatile关键字

原文地址:http://blog.csdn.net/jason0539/article/details/23297037/ 回复中的13楼 Re: 炸斯特 2015-09-04 10:49发表 [...
  • xiakepan
  • xiakepan
  • 2016-09-05 22:49:40
  • 2990

Java单例模式中双重检查锁的问题

单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,...
  • chenchaofuck1
  • chenchaofuck1
  • 2016-06-17 19:16:58
  • 25529

Java中有关volatile的几个小面试题

码农小二哥 2017-05-10 16:01 1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整...
  • u011277123
  • u011277123
  • 2017-05-16 09:58:18
  • 2562

java 双重检查锁定及单例模式

双重检查锁定及单例模式全面理解这一失效的编程习语Peter Haggar , 高级软件工程师, IBMPeter Haggar 是 IBM 在北卡罗来纳州的 Research Triangle Pa...
  • kufeiyun
  • kufeiyun
  • 2011-01-27 15:09:00
  • 17246

Double Checked Locking 模式

之前在使用Double Check Locking 模式时,发现自己还是不太理解。于是写个记录,其实很简单,一看就明白了。应用特别说明:1.Double Check Locking模式是singlet...
  • wwsoon
  • wwsoon
  • 2007-01-17 16:42:00
  • 7023

从单例模式的Double-Check看指令重排

晚上同学问了我一个问题,单例模式的Double-Check机制在多线程模式是否会出现问题。这个问题我当时有些琢磨不透,晚上翻阅书籍记录一下这个问题的收获。  public class Singlet...
  • u012308971
  • u012308971
  • 2017-07-31 20:20:33
  • 517

关于单例、关于DCL:Double Check Lock、关于volatile

Java程序员面试都会被问到单例模式,有的公司(如1.)还会问单例模式的各种实现。结论(1)单例的实现请直接看第4和第5。 (2)volatile总共实现了两个功能: a.多线...
  • fan2012huan
  • fan2012huan
  • 2016-12-04 17:54:15
  • 689
    公告
    个人资料
    等级:
    访问量: 602万+
    积分: 6万+
    排名: 43
    最新评论