- 浏览: 23410 次
- 来自: 上海
文章分类
最新评论
双重检查锁定失效问题,一直是JMM无法避免的缺陷之一.了解DCL失效问题, 可以帮助我们深入JMM运行原理.
要展示DCL失效问题, 首先要理解一个重要概念- 延迟加载(lazy loading).
要展示DCL失效问题, 首先要理解一个重要概念- 延迟加载(lazy loading).
非单例的单线程延迟加载示例:
private Resource res = null;
public Resource getResource() {
//普通的延迟加载
if (res == null)
res = new Resource();
return res;
}
}
非单例的多线程延迟加载示例:
Class Foo {
private Resource res = null;
public synchronized Resource getResource() {
//获取实例操作使用同步方式, 性能不高
if (res == null)
res = new Resource();
return res;
}
}
非单例的DCL多线程延迟加载示例:
Class Foo {
private Resource res = null;
public Resource getResource() {
if (res == null) {
//只有在第一次初始化时,才使用同步方式.
synchronized(this) {
if(res == null) {
res = new Resource();
}
}
} // end if null
return res;
}
}
Double-Checked Locking看起来是非常完美的。但是很遗憾,根据Java的语言规范,上面的代码是不可靠的。
出现上述问题, 最重要的2个原因如下:
1, 编译器优化了程序指令, 以加快cpu处理速度.
2, 多核cpu动态调整指令顺序, 以加快并行运算能力.
问题出现的顺序:
return res;
}
}
非单例的DCL多线程延迟加载示例:
Class Foo {
private Resource res = null;
public Resource getResource() {
if (res == null) {
//只有在第一次初始化时,才使用同步方式.
synchronized(this) {
if(res == null) {
res = new Resource();
}
}
} // end if null
return res;
}
}
Double-Checked Locking看起来是非常完美的。但是很遗憾,根据Java的语言规范,上面的代码是不可靠的。
出现上述问题, 最重要的2个原因如下:
1, 编译器优化了程序指令, 以加快cpu处理速度.
2, 多核cpu动态调整指令顺序, 以加快并行运算能力.
问题出现的顺序:
1, 线程A, 发现对象未实例化, 准备开始实例化
2, 由于编译器优化了程序指令, 允许对象在构造函数未调用完前, 将共享变量的引用指向部分构造的对象, 虽然对象未完全实例化, 但已经不为null了.
3, 线程B, 发现部分构造的对象已不是null, 则直接返回了该对象.
不过, 一些著名的开源框架, 包括jive,lenya等也都在使用DCL模式, 且未见一些极端异常.
说明, DCL失效问题的出现率还是比较低的.
接下来就是性能与稳定之间的选择了?
DCL的替代Initialize-On-Demand:
public class Foo {
// 私有静态内部类, 只有当有引用时, 该类才会被装载
private static class LazyFoo {
public static Foo foo = new Foo();
}
public static Foo getInstance() {
return LazyFoo.foo;
}
}
维基百科的DCL解释:
http://en.wikipedia.org/wiki/Double-checked_locking
DCL的完美解决方案:
http://www.theserverside.com/patterns/thread.tss?thread_id=39606
2, 由于编译器优化了程序指令, 允许对象在构造函数未调用完前, 将共享变量的引用指向部分构造的对象, 虽然对象未完全实例化, 但已经不为null了.
3, 线程B, 发现部分构造的对象已不是null, 则直接返回了该对象.
不过, 一些著名的开源框架, 包括jive,lenya等也都在使用DCL模式, 且未见一些极端异常.
说明, DCL失效问题的出现率还是比较低的.
接下来就是性能与稳定之间的选择了?
DCL的替代Initialize-On-Demand:
public class Foo {
// 私有静态内部类, 只有当有引用时, 该类才会被装载
private static class LazyFoo {
public static Foo foo = new Foo();
}
public static Foo getInstance() {
return LazyFoo.foo;
}
}
维基百科的DCL解释:
http://en.wikipedia.org/wiki/Double-checked_locking
DCL的完美解决方案:
http://www.theserverside.com/patterns/thread.tss?thread_id=39606
发表评论
-
多语言编程
2009-04-14 02:10 0计算机语言就像鲨鱼,要是保持静止就会死。和现实生活中的语言一样 ... -
SchemaSpy
2009-04-17 02:35 0SchemaSpy: Graphical Database S ... -
微软架构师分类参考
2009-04-24 07:22 1114企业架构师EA(Enterprise Architec ... -
Java Memory Model(JMM)
2009-07-27 01:41 915内存模型 (memory model)内 ... -
进程间通信方式
2009-09-16 06:33 1484Windows下的进程间通信方式: 文件映射、共享内存、管道( ... -
多语言编程
2009-04-14 02:10 565计算机语言就像鲨鱼,要是保持静止就会死。和现实生活中的语言一样 ... -
SchemaSpy
2009-04-17 02:35 280SchemaSpy: Graphical Database S ... -
微软架构师分类参考
2009-04-24 07:22 0企业架构师EA(Enterprise Architec ... -
Double-Checked Locking失效问题
2009-07-27 01:33 0双重检查锁定失效问题, ... -
Java Memory Model(JMM)
2009-07-27 01:41 0内存模型 (memory model)内 ... -
进程间通信方式
2009-09-16 06:33 0Windows下的进程间通信方式: 文件映射、共享内存、管道( ... -
多语言编程
2009-04-14 02:10 0计算机语言就像鲨鱼,要是保持静止就会死。和现实生活中的语言一样 ... -
SchemaSpy
2009-04-17 02:35 0SchemaSpy: Graphical Database S ... -
微软架构师分类参考
2009-04-24 07:22 0企业架构师EA(Enterprise Architec ... -
Double-Checked Locking失效问题
2009-07-27 01:33 0双重检查锁定失效问题, ... -
Java Memory Model(JMM)
2009-07-27 01:41 0内存模型 (memory model)内 ... -
进程间通信方式
2009-09-16 06:33 0Windows下的进程间通信方式: 文件映射、共享内存、管道( ... -
用户需求和产品需求
2009-09-02 10:34 1394需求获取和分析是软件开发至关重要的一环,对于一个大的软件项目来 ...
相关推荐
C++ and the Perils of Double-Checked Locking 关于单例模式C++实现的一些问题
C++ and the Perils of Double Checked Locking.zip
在做角色权限,通过tree控件展示权限列表的时候,用:default-checked-keys绑定数据,这个属性不能实现双向绑定,只能用于初始化选择状态。如果想双向绑定只能使用组件的方法setCurrentKey来实现。想直接绑定数据来的...
C++ 怎么解决 单例模式的线程安全问题
这个小程序涉及到了以下知识点: Java基础知识 队列《数据结构》 单例模式“双检锁/双重校验锁(DCL,即 double-checked locking)”
本文主要讲解AngularJS ng-checked 指令,在这整理ng-checked 指令的基础知识,并附代码实例,有需要的小伙伴可以参考下
北京火龙果软件工程技术中心意图无论什么时候当临界区中的代码仅仅需要加锁一次,同时当其获取锁的时候必须是线程安全的,可以用DoubleCheckedLocking模式来减少竞争和加锁载荷。动机1、标准的单例。开发正确的有效...
• Chapter 21: The Singleton Pattern and the Double-Checked Locking Pattern • Chapter 22: The Object Pool Pattern • Chapter 23: The Factory Method Pattern • Chapter 24: Summary of Factories (no ...
本篇文章主要介绍了深究AngularJS——ng-checked(回写:带真实案例代码),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...
四色定理的计算机证明,网上有coq平台和定理证明的源代码下载。
各种工厂模式 242 第21章 Singleton模式和Double-Checked Locking模式 249 第22章 Object Pool模式 257 第23章 Factory Method模式 267 第24章 工厂模式的总结 272 第八部分 终点与起点 第25章 设计模式回顾:总结与...
多检查奇迹:checked伪类 polyfill(适用于 IE8 及以下)。如何使用包括 jQuery 1.x(与旧 IE 兼容)>= 1.7,然后在 IE 条件注释中包含 poly-checked 脚本: < script src =" //ajax.googleapis....
checked.css是一款能够制作复选框和单选按钮点击动画的CSS3动画库。它内置23种动画特效,在用户点击单选按钮或复选框时会出现相应的动画效果。
主要介绍了jquery中checkbox全选失效的解决方法,需要的朋友可以参考下
北京交通大学期末试卷汇编作业-checked.docx
代码片段: function isAllChecked(){ ... allChecked = $(this).find(":checked").not("[name='all-checked']") , thisAllCheckBtn = $(this).find(".all-checked [name='all-checked']");
AngularJS是当前非常的流行的前端框架,它的语法糖非常多,也极大的方便了前端开发者。这篇文章主要介绍了ng-options和ng-checked在表单中的高级运用,需要的朋友可以参考下
1.寂寞的Singleton 2. 当Singleton遇见多线程 4.安全发布 6. 讨论的延续 1. JavaWorld章:Double-checked l