Lucas Lee的修正(这里是原帖):
我认为这个修正是可以的,假设A线程在B线程之前进入同步块,B线程会看到hasInitialized =0 或者=1这两种情况,=0时是没问题的,就不多说了,当B线程看到hasInitialized =1时的情况分析
A:LazySingleton.getInstance();
B:LazySingleton.getInstance().getSomeField();
1. 根据happens-before的单线程原则,在A线程中,(1)->(7)->(B1)
2. B线程看到hasInitialized =1时,此时A线程的(B1)->B线程的(4),而在B线程中的getSomeField是在getInstance之后,也有getInstance->getSomeField这个偏序关系
3. 根据happens-before的传递性,(1)->(7)->(B1)>B线程的(4)->B线程的getSomeField
不知道我这么分析是不是对的?
主要问题就在于,线程A在内存中若能观察到hasInitialized=1是不是意味着线程A在内存中能观察到构造完全的instance实例,因为在JLS中提到
• If x and y are actions of the same thread and x comes before y in program
order, then hb(x, y).
如果上面的假设成立,线程A观察到hasInitialized=1时,instance就已经完全构造好了
而且线程B要想观察到hasInitialized=1,应该也是在线程A观察到hasInitialized=1之后
几天后,看了些资料,加深了对reorder和happens-before的理解
继续上面的分析,线程A在内存中若能观察到hasInitialized=1意味着线程A在内存中能观察到构造完全的instance实例,
但是,我理解的,happens-before规则只有涉及到对同一内存数据的读写才有意义,象线程A中的(B1)和(7)是没有这个关系才对
例如:在下面程序中,假设a、b都没有同步
a = 3;
b = 4;
那么,编译器就可能将这两句重新排序,因为compilers are allowed to reorder the instructions in either thread,
when this does not affect the execution of that thread in isolation.(JSL)happens-before关系对于这两句根本没有意义
用happen-before规则重新审视DCL:http://www.javaeye.com/topic/260515
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
http://www.ibm.com/developerworks/java/library/j-dcl.html
http://www.ibm.com/developerworks/java/library/j-threads1.html
http://www.ibm.com/developerworks/java/library/j-threads2.html
http://www.ibm.com/developerworks/java/library/j-threads3.html
分享到:
相关推荐
根据提供的文件信息,我们可以提取并总结出关于DCL-33A指示控制器的相关知识点: ### DCL-33A 指示控制器介绍 #### 一、产品概述 DCL-33A是一款用于安装在导轨上的指示控制器,其设计符合一定的规格要求。该控制器...
数据控制语言(DCL,Data Control Language)是SQL语言的重要组成部分,主要负责管理和控制数据库的访问权限和安全。在SQL Server 2000中,DCL被用来设定或修改数据库用户或角色的权限,确保数据的安全性和访问的可...
综上所述,DCL-Chat-Client项目涵盖了WebSocket技术、JavaScript编程、事件驱动、前端框架、数据格式、安全性和性能优化等多个方面,是一个完整的实时通信解决方案。开发者在实现这样的客户端时,需要具备扎实的前端...
语言生动风趣,零压力的阅读享受和学习体验 AutoLISP+DCL+VisualLISP是AutoCAD二次开发的最佳搭档 最新的AutoLISP+DCL+VisualLISP二次开发技术,提高工作效率 《autocad完全应用指南.autolisp+dcl+visuallisp程序...
**描述解析:** "DCL-306:开发Reactjs应用程序" 描述进一步证实了这个资源与学习如何使用React.js来构建应用程序有关。它提到了这是一个培训项目的一部分,并提供了完整的培训目录链接,但实际链接并未提供。这表明...
dcl-ecs-quests:Decentraland库,用于创建要在UI中显示的ECS组件的任务
DCL-350:使用Spring Cloud实施MicroService体系结构这些项目是作为以下培训的一部分而创建的:DCL-350:使用Spring Cloud实施MicroService体系结构请点击完整培训目录的链接: : Kurulum Bilgisi: Eğitimde实验室...
在AutoCAD环境中,DCL(Dialog Control Language)文件是一种用于创建和定制用户界面对话框的文件格式。这些文件包含了对话框的设计布局,包括控件的位置、大小、样式以及与之关联的事件处理代码。OPENDCL是AutoCAD...
### DCL对话框自学教程知识点总结...通过以上内容,我们可以了解到DCL对话框自学教程不仅覆盖了对话框编程的基础知识,还详细介绍了各种组件的使用方法和技术要点,对于希望掌握这一技能的学习者来说是一份宝贵的资源。
【标题】"DCL-115:2021年4月5日 C++ 14面向对象编程实践" 【描述】中的“DCL-115:使用C++ 14的面向对象编程”是指一个特定的培训课程,该课程专注于利用C++ 14标准进行面向对象编程(OOP)的实践。面向对象编程是...
总之,"DCL-306"课程旨在提供一个全面的React开发学习路径,涵盖了从基础到进阶的各个知识点,帮助开发者熟练掌握React及其相关技术栈,构建高效、可维护的Web应用。通过实践这些项目,你将能够应对各种复杂的前端...
从提供的文件信息中,我们无法获取到具体的技术内容,仅能得知文件标题和描述指向了一份关于“DCL防爆系列电动执行机构”的选型手册。这份手册被归类在“综合资料”标签下。由于提供的【部分内容】是一串数字和一些...
在这个“COBOL学习例子(包含DCL脚本)”压缩包中,我们可以找到一系列关于如何使用COBOL和DCL的实践教程。这些例子将帮助初学者理解和掌握这两种技术的核心概念。 1. **COBOL基础**: COBOL的语法结构清晰,主要由...
Product Description and Identification (Part Number) ...DCL Series of multi-layer chip inductors for choke. 2) Product Identification (Part Number) DCL ※※※※ 〇 XXX □ ◎ ① ② ③ ④ ⑤ ⑥
DCL-314:使用Node.js,MongoDB和Knockout构建可伸缩Web应用程序这些项目是以下培训的一部分:“ DCL-314:使用Node.js,MongoDB和Knockout构建可伸缩Web应用程序” 请点击完整培训目录的链接: : 库鲁鲁姆·比尔吉...
DCL-350:使用Spring Cloud实施MicroService体系结构 这些项目是作为以下培训的一部分而创建的:DCL-350:使用Spring Cloud实施MicroService体系结构 请点击完整培训目录的链接: : 安装信息: 为了安装教育中的...
DCL-202:Java SE 8编程 这些项目是作为以下培训的一部分而创建的:DCL-202“ Java SE 8编程” 请点击完整培训目录的链接: : 库鲁鲁姆·比尔吉西(Kurulum Bilgisi): Eğitimde实验室çalışmalarıICIN ...
DBA (DATABASE Admin) 数据库管理员 DBS (DATABASE SYSTEM) 数据库系统 DBMS (DATABASE MANAGE ...数据控制语言(Data Control Langueage DCL)--- grant,revoke 事务控制(Transation Control)------ commit,rollback
日本神钢DCL32CE1通讯说明书主要涵盖了温控仪表DCL-33A的通信功能操作和注意事项。以下是详细的知识点总结: 1. **系统配置** - 当使用USB通讯线CMC-001-3(需单独购买)时,系统连接方式为:主机计算机通过USB...