快速业务通道

Java理论和实践: 安全构造技术 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
t;c" may be visible from other threads    c.add(this);   } }

正如您所见,在 Unsafe 类中许多不安全的构造与 Safe 类中安全的构造有很多相似之处。确定 this 引用对其它线程是否可见是一项很棘手的工作。最好的策略是,在构造函数中完全避免使用 this 引用(直接或间接)。然而,实际上这种完全避免使用 this 引用的可能并不总是存在。但只要记住,在构造函数中谨慎使用 this 引用和创建非静态内部类的实例。

在构造期间不允许引用逃脱的其它理由

当我们考虑同步的影响时,上面所详细讲述的关于线程安全构造的那些做法就变得更为重要。例如,当线程 A 启动线程 B 时,Java 语言规范(Java Language Specification (JLS))保证:当线程 A 启动线程 B 时,所有那些对线程 A 可见的变量对线程 B 也是可见的,这非常类似 Thread.start() 中隐式同步。如果从构造函数中启动一个线程,并且正在构造的对象还没有完成,则我们会丢失这些可见性的保证。

因为 JMM 有一些令人迷惑的方面,Java Community Process JSR 133 正对其进行修订,这将(尤其)会更改 volatile 和 final 的语义,使它们更符合其字面上含义。例如,在当前 JMM 语义下,一个线程在其生存期中可能看到 final 字段有多个值。新的内存模型语义将防止这种情形,但只有在正确定义了构造函数的情况下 ― 这意味着在构造期间不允许 this 引用逃脱。

结束语

对其它线程能够看见的还未完成构造的对象进行引用显然不是我们所期望的。归根结底,我们如何正确辨别完全构造好的对象和尚未构造好的对象呢?但通过公布来自构造函数内的 this 引用 ― 直接或间接地通过内部类 ― 我们这样做时,会导致无法预料的后果。为了防止这种危险,在创建内部类的实例或从构造函数启动线程时,尽量避免使用 this 。如果无法在构造函数中避免直接或间接使用 this ,则确保不让其它线程看见 this 引用。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号