级别:初级BrianGoetz(brian@quiotix
com),首席顾问,QuiotixCorp2003年9月28日DougLea的util
concurrent包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型List和Map的高性能的、线程安全的实现
在本月的Java理论与实践中,BrianGoetz向您展示了用ConcurrentHashMap替换Hashtable或synchronizedMap,将有多少并发程序获益
您可以在本文的论坛中与作者以及其他读者共享您的想法(您也可以点击文章顶部或者底部的讨论进入论坛)
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1
Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的
然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的
此时,无竞争的同步会导致可观的性能代价
Hashtable的后继者HashMap是作为JDK1
2中的集合框架的一部分出现的,它通过提供一个不同步的基类和一个同步的包装器Collections
synchronizedMap,解决了线程安全性问题
通过将基本的功能从线程安全性中分离开来,Collections
synchronizedMap允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价
Hashtable和synchronizedMap所采取的获得同步的简单方法(同步Hashtable中或者同步的Map包装器对象中的每个方法)有两个主要的不足
首先,这种方法对于可伸缩性是一种障碍,因为一次只能有一个线程可以访问hash表
同时,这样仍不足以提供真正的线程安全性,许多公用的混合操作仍然需要额外的同步
虽然诸如get()和put()之类的简单操作可以在不需要额外同步的情况