快速业务通道

Java理论与实践: 并发集合类 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
试所在的平台是一个双处理器的Xeon系统,操作系统是Linux。数据显示了 10,000,000次迭代以毫秒计的运行时间,这个数据是在将对 ConcurrentHashMap 的 操作标准化为一个线程的情况下进行统计的。您可以看到,当线程增加到多 个时, ConcurrentHashMap 的性能仍然保持上升趋势,而 Hashtable 的性能则 随着争用锁的情况的出现而立即降了下来。

比起通常情况下的服务器应用,这次测试中线程的数量看上去有点少。然而 ,因为每个线程都在不停地对表进行操作,所以这与实际环境下使用这个表的更 多数量的线程的争用情况基本等同。

表 1.Hashtable 与 ConcurrentHashMap在可伸缩性方面的比较

线程数 ConcurrentHashMap Hashtable
1 1.00 1.03
2 2.59 32.40
4 5.58 78.23
8 13.21 163.48
16 27.58 341.21
32 57.27 778.41

CopyOnWriteArrayList

在那些遍历操作大大地多于插入或移除操作的并发应用程序中,一般用 CopyOnWriteArrayList 类替代 ArrayList 。如果是用于存放一个侦听器 (listener)列表,例如在AWT或Swing应用程序中,或者在常见的JavaBean中, 那么这种情况很常见(相关的 CopyOnWriteArraySet 使用一个 CopyOnWriteArrayList 来实现 Set 接口)。

如果您正在使用一个普通的 ArrayList 来存放一个侦听器列表,那么只要该 列表是可变的,而且可能要被多个线程访问,您就必须要么在对其进行迭代操作 期间,要么在迭代前进行的克隆操作期间,锁定整个列表,这两种做法的开销都 很大。当对列表执行会引起列表发生变化的操作时, CopyOnWriteArrayList 并 不是为列表创建一个全新的副本,它的迭代器肯定能够返回在迭代器被创建时列 表的状态,而不会抛出 ConcurrentModificationException 。在对列表进行迭 代之前不必克隆列表或者在迭代期间锁定列表,因为迭代器所看到的列表的副本 是不变的。换句话说, CopyOnWriteArrayList 含有对一个不可变数组的一个可 变的引用,因此,只要保留好那个引用,您就可以获得不可变的线程安全性的好 处,而且不用锁定列表。

结束语

同步的集合类 Hashtable 和 Vector ,以及同步的包装器类 Collections.synchronizedMap 和 Collections.synchronizedList ,为 Map 和 List 提供了基本的有条件的线程安全的实现。然而,某些因素使得它们并不 适用于具有高度并发性的应用程序中――它们的集合范围的单锁特性对于可伸缩 性来说是一个障碍,而且,很多时候还必须在一段较长的时间内锁定一个集合, 以防止出现 ConcurrentModificationException s异常。 ConcurrentHashMap 和 CopyOnWriteArrayList 实现提供了更高的并发性,同时还保住了线程安全性 ,只不过在对其调用者的承诺上打了点折扣。 ConcurrentHashMap 和 CopyOnWriteArrayList 并不是在您使用 HashMap 或 ArrayList 的任何地方都 一定有用,但是它们是设计用来优化某些特定的公用解决方案的。许多并发应用 程序将从对它们的使用中获得好处。

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