ConcurrentHashMap文档说明

时间:2012-01-04 14:52:00

标签: java multithreading collections concurrency synchronization

ConcurrentHashMap可以在依赖于线程安全但不依赖于其同步细节的程序中与Hashtable完全互操作。

我对线程安全与同步细节感到困惑,有人可以告诉我一个例子吗?

3 个答案:

答案 0 :(得分:10)

Hashtable包含synchronized的所有方法,它是公开的信息。例如,您可以继承Hashtable,添加更多synchronized方法 - 并且知道您在使用相同的同步机制时大部分都可以。

此外,您的代码可以使用synchronized (myHashTable)块,有效地确保当您在此块中时,不会从其他线程调用myHashTable方法。

这是所有“同步详细信息”,您可以使用它们,并且您可以免费使用(虽然不鼓励使用)。

ConcurrentHashMap不是这样的:它是线程安全的(在某种意义上更是如此,请参阅Peter Lawrey的答案)Hashtable,但是你没有被告知如何实现了这种线程的安全性。因此,您不能滥用或扩展它:您应该按原样使用它。

答案 1 :(得分:2)

一个常见的线程安全性get-cha是由iterator()方法为keySet(),entrySet()或values()返回的Iterator对于Hashtable,Vector,Collection.synchronizedXxxx(集合)而言不是线程安全的。虽然该方法本身是线程安全的,但只要它返回一个迭代器就可能无效。

ConcurrentHashMap没有这个问题,因为它提供了弱一致性。即任何添加,在迭代时删除的内容可能会或可能不会被看到,但其他条目似乎是预期的。

答案 2 :(得分:0)

ConcurrentHashMap允许从多个线程并发修改Map,而无需阻止它们。

查看Synchronization and thread safety

上的教程