双重检查锁定及单例模式
所有的编程语言都有一些共用的习语。了解和使用一些习语很有用,程序员们花费宝贵的时间来创建、学习和实现这些习语。问题是,稍后经过证明,一些习语并不完全如其所声称的那样,或者仅仅是与描述的功能不符。在 Java 编程语言中,双重检查锁定就是这样的一个绝不应该使用的习语。在本文中,Peter Haggar 介绍了双重检查锁定习语的渊源,开发它的原因和它失效的原因。
编辑注:本文在针对 Java 5.0 修订前参考了 Java 内存模型;关于内存排序的描述也许不再正确。尽管如此,在新的内存模型中,双重检查锁定习语仍旧是无效的。
单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的 Java 内存模型细节的原因,并不能保证这个双重检查锁定习语有效。它偶尔会失败,而不是总失败。此外,它失败的原因并不明显,还包含 Java 内存模型的一些隐秘细节。这些事实将导致代码失败,原因是双重检查锁定难于跟踪。在本文余下的部分里,我们将详细介绍双重检查锁定习语,从而理解它在何处失效。
![]()
![]()
回页首
![]()
![]()
回页首
![]()
![]()
回页首
![]()
![]()
回页首
![]()
![]()
回页首
![]()
![]()
回页首
![]()
![]()
回页首
![]()
Peter Haggar 是 IBM 在北卡罗来纳州的 Research Triangle Park 的一名高级软件工程师,他还是 Practical Java Programming Language Guide(Addison-Wesley 出版)一书的作者。此外,他还发表了很多篇关于 Java 编程的文章。他有着广泛的编程经验,曾致力于开发工具、类库和操作系统相关的工作。Peter 在 IBM 致力于研究新兴 Internet 技术,目前主要从事高性能 Web 服务方面的工作。Peter 经常在很多行业会议上作为技术发言人就 Java 技术发表言论。他已经为 IBM 工作了 14 年多,并获得了 Clarkson University 的计算机科学学士学位。您可以通过 haggar@us.ibm.com 与他联系。