ConcurrentHashMap可以在依赖于线程安全但不依赖于其同步细节的程序中与Hashtable完全互操作。
我对线程安全与同步细节感到困惑,有人可以告诉我一个例子吗?
答案 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,而无需阻止它们。