用ConcurrentHashmap替换所有出现的Hashtable是否安全?

时间:2016-04-19 14:42:51

标签: java multithreading performance hashtable concurrenthashmap

我们的传统多线程应用程序有很多Hashtable的用法。使用ConcurrentHashmap实例替换Hashtable实例以获得性能增益是否安全?会有副作用吗?

2 个答案:

答案 0 :(得分:3)

  

使用ConcurrentHashmap实例替换Hashtable实例以获得性能增益是否安全?

在大多数情况下,它应该是安全的并且会产生更好的性能。更改的工作取决于您是使用Map界面还是直接使用Hashtable

  

会有副作用吗?

如果您的应用程序希望能够立即访问由另一个线程放入地图的元素,则可能会产生副作用。

来自ConcurrentHashMap上的JavaDoc:

Retrieval operations (including get) generally do not block, so may overlap 
with update operations (including put and remove). Retrievals reflect the 
results of the most recently completed update operations holding upon their onset.

修改:立即澄清""考虑线程1将元素A添加到地图中,并且在执行该写入时,线程2尝试在地图中是否存在A.使用Hashtable线程2将被阻塞,直到写入之后,因此检查将返回true,但是当使用ConcurrentHashMap时,它将返回false,因为线程2不会被阻塞且写入操作尚未完成(因此线程2会看到一个过时的版本的桶。)

答案 1 :(得分:2)

根据Hashtable对象的大小,切换到ConcurrentHashmap可能会获得一些性能提升。

ConcurrentHashmap被分成若干段,允许表格仅部分锁定。这意味着您每秒可以获得比Hashtable更多的访问权限,这需要您锁定整个表。

表本身都是线程安全的,并且都实现了Map接口,因此替换应该相对容易。