ConcurrentHashMap的get()与HashTable的get()

时间:2018-09-16 17:34:01

标签: java collections concurrency

我读到ConcurrentHashMap的{​​{1}}方法和get()的{​​{1}}都是线程安全的,即使前者不使用synced关键字。 为什么在HashTable的{​​{1}}方法实现中,必须使用synced关键字来使其具有线程安全性,但在get()的{​​{1}}方法中却不需要它。

1 个答案:

答案 0 :(得分:2)

广泛地是因为HashTableConcurrentHashMap并没有完全相同的行为,因此没有涉及并发的实际结果。对于检索操作,ConcurrentHashMap不会锁定整个表的事实使ConcurrentHashMap不能反映密钥的最新更新值,因为get()可能与put()重叠/ remove()操作:

  

检索操作(包括get)通常不会阻塞,因此可能   与更新操作(包括放置和删除)重叠。检索   反映最近完成的更新操作的结果   坚持发作

当这种延迟在许多用例中都不重要,并且您也可以使用显式的同步语句来解决时,您最好使用ConcurrentHashMap而不是HashTable,因为这样可以改善整体{{1并发访问的性能。