快速业务通道

Java理论与实践: 描绘线程安全性 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
面“线程安全”一节中描述的属性 -- 由类的规格 说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排列 ,线程都不需要任何额外的同步。这种线程安全性保证是很严格的 -- 许多类, 如 Hashtable 或者 Vector 都不能满足这种严格的定义。

有条件的线程安全

我们在 7 月份的文件“ 并发集合类”中讨论了有条件的线程安全。有条件 的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外 部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者 返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的 时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行 迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性 的访问是由对锁的同步保证的 -- 并且类的文档应该说明是哪个锁(通常是对象 的内部监视器(intrinsic monitor))。

如果对一个有条件线程安全类进行记录,那么您应该不仅要记录它是有条件 线程安全的,而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地 假设其他操作序列不需要任何额外的同步。

线程兼容

线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安 全地使用。这可能意味着用一个 synchronized 块包围每一个方法调用,或者创 建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList() 一样)。也可能意味着用 synchronized 块包 围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个 块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量 实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。

许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。

线程对立

线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现 的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执 行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。

其他线程安全记录考虑

线程安全类(以及线程安全性程度更低的的类) 可以允许或者不允许调用者锁 定对象以进行独占性访问。Hashtable 类对所有的同步使用对象的内部监视器, 但是 ConcurrentHashMap 类不是这样,事实上没有办法锁定一个 ConcurrentHashMap 对象以进行独占性访问。除了记录线程安全程序,还应该记 录是否某些锁 -- 如对象的内部锁 -- 对类的行为有特殊的意义。

通过将类记录为线程安全的(假设它确实 是线程安全的),您就提供了两种有 价值的服务:您告知类的维护者不要进行会影响其线程安全性的修改或者扩展, 您还告知类的用户使用它时可以不使用外部同步。通过将类记录为线程兼容或者 有条件线程安全的,您就告知了用户这个类可以通过正确使用同步而安全地在多 线程中使用。通过将类记录为线程对立的,您就告知用户即使使用了外部同步, 他们也不能在多线程中安全地使用这个类。不管是哪种情况,您都在潜在的严重 问题出现 之前防止了它们,而要查找和修复这些问题是很昂贵的。

结束语

一个类的线程安全行为是其规格说明中的固有部分,应该成为其文档的一部 分。因为(还)没有描述类的线程安全行为的声明式方式,所以必须用文字描述。 虽然 Bloch 的描述类的线程安全程度的五层系统没有涵盖所有可能的情况,但 是它是一个很好的起点。如果每一个类都将这种线程行为的程度加入到其 Javadoc 中,那么可以肯定的是我们大家都会受益。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号