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