我读到ConcurrentHashMap
的{{1}}方法和get()
的{{1}}都是线程安全的,即使前者不使用synced关键字。
为什么在HashTable
的{{1}}方法实现中,必须使用synced关键字来使其具有线程安全性,但在get()
的{{1}}方法中却不需要它。
答案 0 :(得分:2)
广泛地是因为HashTable
和ConcurrentHashMap
并没有完全相同的行为,因此没有涉及并发的实际结果。对于检索操作,ConcurrentHashMap
不会锁定整个表的事实使ConcurrentHashMap
不能反映密钥的最新更新值,因为get()
可能与put()
重叠/ remove()
操作:
检索操作(包括get)通常不会阻塞,因此可能 与更新操作(包括放置和删除)重叠。检索 反映最近完成的更新操作的结果 坚持发作
当这种延迟在许多用例中都不重要,并且您也可以使用显式的同步语句来解决时,您最好使用ConcurrentHashMap
而不是HashTable
,因为这样可以改善整体{{1并发访问的性能。