`
zzg
  • 浏览: 124854 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

双重检查成例在Java 编译器

阅读更多
《java与设计模式》中谈到了这样一种情况:在Singleton模式的使用中,存在一种错误的技巧,即“双重检查成例”,代码如下所示:

//Broken multithread version
public class ResourceObject {

 private static ResourceObject obj=null;
 //unnormal private constructor
 private ResourceObject()
 {}
 
     //double-check locking method
 public static ResourceObject getResourceObject()
 {
  if(obj == null)//first check position
  {
   //more than one thread will get here
   synchronized(ResourceObject.class)
   {
    //only one thread every single time here
    if(obj == null)//second check here
    {
     obj=new ResourceObject();
    }
   }
  }
  return obj;
 }
 //other functions and members
}

两次检查看似可以省去不必要的同步开销,但是对于java编译器来说这种技巧并不成立。原因在于,java编译器会优化生成的中间代码,导致 ResourceObject类的初始化与变量obj的赋值之间的顺序变得不可预料。在单线程的情况下,这不会导致程序错误,而且也没有同步问题。但是在 多线程的情况下,在前一个线程执行完赋值语句,然后进行剩下的初始化时,后一个线程就会获得未初始化完的对象实例,此时调用ResourceObject 类的方法,就有可能使用初始化过程中未初始化完的类成员,造成程序崩溃。鉴于这一切行为都是无法预测的,双重检查是不建议在java中使用的。

分享到:
评论

相关推荐

    Java与模式(含示例代码)

    15.9 附录:双重检查成例的研究.....243 15.10 给读者的一点建议...................247 第16 章 专题:单例模式与MX 记录 ....... 249 16.1 问题与解决方案.........................249 16.2 目录服务与MX 记录......

    遗传算法的成功实例 运行成功

    在这个实例中,遗传算法被用来优化BP神经网络的权重和阈值,以提升其预测或分类的准确性。 BP(Backpropagation)神经网络是一种广泛使用的多层前馈神经网络,通过反向传播误差来调整权重。然而,BP网络的训练过程...

    中国法制史形考任务5.pdf

    7. **法廷成例**:秦朝的法廷成例称为“廷行事”,它相当于现代的判例法,对于同类案件有一定的指导作用。 8. **官吏考核**:秦朝对官吏的考核内容是“五善五失”,即五个优点和五个过失,以此评估官员的工作表现。...

    面向模式的软件体系结构(卷2):用于并发与网络化对象的模式

    本书重点介绍与这些问题领域对应的16个模式和一个成例。同时辅以大量模式示例和已知应用,帮助读者理论联系实际。本书四位作者均为国际公认的软件开发专家,在模式、面向对象架构、面向对象的分布式系统、设计模式等...

    清朝的法律制度.pptx

    律例中的“例”不仅仅是皇帝的诏令,也包括了批准的法令和成例,随着时间推移,例的地位逐渐超越了正律,形成了每五年小修、十年大修的编例制度。乾隆时期,律例的重要性更加凸显,明确规定在有例的情况下不再使用律...

    面向模式的软件体系结构(卷1):模式系统

    第2 ~ 4 章讲解模式编目,分别阐述了架构模式、设计模式和成例;第5 章揭示如何将模式组织成模式系统及其重要性;第6 章探讨将模式融入软件架构的方法;第7 章概述模式的历史、相关著作及模式界;第8 章展望模式...

    面向模式的软件架构模式系统 卷1

    第2 ~ 4 章讲解模式编目,分别阐述了架构模式、设计模式和成例;第5 章揭示如何将模式组织成模式系统及其重要性;第6 章探讨将模式融入软件架构的方法;第7 章概述模式的历史、相关著作及模式界;第8 章展望模式...

    Verilog模块例化小工具

    用于Verilog代码中模块的例化,可直接先将module部分转换成例化后的语句,并且实现代码对齐。使用MATALB2019a的APPdesigner编写

    第十章清朝法律制度(上).pptx

    “例”不仅是皇帝的诏令,也包含经皇帝批准的法令和成例。自雍正五年起,律文被确立为不可轻易更改的成法,通过编例进行适时调整。乾隆时期确立了“条例五年一小修,十年一大修”的制度,条例逐渐超越正律,成为法律...

    2013高考语文 命题作文“说格”导写作文素材

    2. **阻碍与限制**:“格”有时候成为我们前进道路上的障碍,如“格于成例”表示被既定的规矩束缚。在快速发展的现代社会,勇于挑战成规,敢于破格,往往能推动社会的进步。这要求我们在面对挑战时,要有打破陈规的...

    教育课件完美版高考历史新增分大一轮人教通史课件:第五单元 中华文明的辉煌与危机 单元综合提升 .pptx

    - 宋元明清:法典与案例相结合,案件成例发展,司法与行政逐渐结合。 2. 宋元明清时期的“商业革命” - 特征:商业活动的时间和空间限制被打破,草市完善,纸币使用,大城市出现,海外贸易繁荣。 - 明清时期:...

    贵州省贵阳市2018届中考语文专题3词语解释精练练习

    3. 有例可援:意味着有先例或成例可以参考,用以支持或辩解某一行为或决定。 4. 鸿鹄之志:出自《史记·陈涉世家》,比喻高远的志向,就像天鹅翱翔天际一样。 5. 垂手:两手自然下垂,常用来形容恭敬或无所作为的...

    不定方程和解不定方程应用题经典.doc

    解答的实话,要先设法消去其中的一个未知数,将方程组简化成例 1 那样的不定方程。5x + 7y + 3z = 25 3x - y - 6z = 2 由①×2 + ②,得 13x + 13y = 52 X + y = 4 把③式变形,得 y = 4 - x。因为 x、y、z 都是正...

Global site tag (gtag.js) - Google Analytics