浅谈Java中描绘线程的安全性.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Java中描绘线程的安全性.doc

浅谈Java中描绘线程的安全性 本文档由整理发布。 7月份我们的并发专家 Brian Goetz 将 Hashtable 和 Vector 类描述为“有条件线程安全的”。一个类难道不是线程安全就是线程不安全的吗?不幸的是,线程安全并不是一个非真即假的命题,它的定义出人意料的困难。但是,正如Brian 在本月的 Java 理论与实践中解释的,尽量在 Javadoc 中对类的线程安全性进行归类是非常重要的。请在附带的 讨论论坛中与作者和其他读者分享您关于本文的心得(也可以通过单击本文顶部或底部的 讨论来访问该论坛)。 在 Joshua Bloch 的那本出色的 Effective Java Programming Language Guide(参阅 参考资料)一书中,第 52 项的标题为“Document Thread Safety”,在其中他恳请开发人员准确地记录下类对线程安全性有哪些保证。就像 Bloch 书中的大多数建议一样,这也是一个反复提到、但很少实现的非常好的建议(就像 Bloch 在其 Programming Puzzlers 谈话中说的“不要像我兄弟那样写代码”)。 有多少次您在 Javadoc 中查看一个类,并猜测“这个类是线程安全的吗?”。 由于缺少明确的记载,读者可能会对类的线程安全性做出不当的假设。也许他们将非线程安全的类假定为线程安全的(这真的很糟!),或者假设可以在调用一个对象的方法之前同步对象以得到线程安全性(这可能是正确的,也可能还不够,最差的情况是,可能只会提供虚幻的线程安全性)。不管在什么情况下,最好在文档中明确写明,在多个线程中共享类的实例时类的行为是怎样的。 看一个这种问题的一个例子, java.text.SimpleDateFormat 类不是线程安全的,但是在 1.4 JDK 之前这并没有记录在 Javadoc 中。有多少开发人员错误地创建了 SimpleDateFormat 的静态实例,并在多个线程中使用它,同时不知道他们的程序在大负荷下是否能正确运行?不要对您的客户或者同事做这样的事情! 一定要在第一次编写类的时候记录线程安全性 -- 在编写它的时候访问类线程安全性需求和行为,要比在几个月后您(或者其他人)再回过头来看要容易得多。永远也不会比在编写它时更清楚地了解在一个实现中所发生的情况。此外,在编写类的时候记录线程安全性,可以使您对于线程安全性的最初想法得以保留,因为维护者希望看到这个记录成为类的说明的一部分。 如果线程安全性是类的一个二元属性就好了,您只需要记录类是线程安全还是线程不安全的。但是很不幸,它不是这么简单的。如果类不是线程安全的,是否可以在每次访问这个类的对象时通过同步使它成为线程安全的呢?是否有操作序列不能允许其他线程的介入,因而不仅需要对基本操作同步,而且对于复合操作也要同步呢?在包含需要自动执行的一组操作的方法之间是否有状态依赖关系呢?开发人员要在并发应用程序中使用一个类时需要掌握这些信息。 定义线程安全性 明确定义线程安全性出人意料地困难,大多数定义看上去完全是自我循环。快速有哪些信誉好的足球投注网站一下 Google,可以找到以下关于线程安全代码的典型的、但是没有多大帮助的定义(或者可以说是描述): ...可以从多个编程线程中调用,无需线程之间不必要的交互。 ...可以同时被多个线程调用,不需要调用一方有任何操作。 有这样的定义,就不奇怪我们对于线程安全性会感到如此迷惑。这些定义比说“一个类在可以被多个线程安全调用时就是线程安全的”好不了多少,当然,它的意义就是如此,但是它不能帮助我们区分一个线程安全的类与一个线程不安全的类。安全的意义是什么呢? 实际上,所有线程安全的定义都有某种程序的循环,因为它必须符合类的规格说明 -- 这是对类的功能、其副作用、哪些状态是有效和无效的、不可变量、前置条件、后置条件等等的一种非正式的松散描述(由规格说明给出的对象状态约束只应用于外部可见的状态,即那些可以通过调用其公共方法和访问其公共字段看到的状态,而不应用于其私有字段中表示的内部状态)。 线程安全性 类要成为线程安全的,首先必须在单线程环境中有正确的行为。如果一个类实现正确(这是说它符合规格说明的另一种方式),那么没有一种对这个类的对象的操作序列(读或者写公共字段以及调用公共方法)可以让对象处于无效状态,观察到对象处于无效状态、或者违反类的任何不可变量、前置条件或者后置条件的情况。 此外,一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于线程安全

文档评论(0)

docindpp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档