Java ConcurrentHashMap';s get()Vs HashTable';s get()

Java ConcurrentHashMap';s get()Vs HashTable';s get(),java,collections,concurrency,Java,Collections,Concurrency,我了解到ConcurrentHashMap的get()方法以及HashTable的get()都是线程安全的,即使前者不使用synchronized关键字。 为什么在HashTable的get()方法实现中需要synchronized关键字以使其线程安全,但在ConcurrentHashMap的get()中不需要它方法。因为哈希表和ConcurrentHashMap没有完全相同的行为,因此在并发性方面没有实际的结果。对于检索操作,ConcurrentHashMap没有锁定整个表的事实使得Concu

我了解到
ConcurrentHashMap
get()
方法以及
HashTable
get()
都是线程安全的,即使前者不使用synchronized关键字。
为什么在
HashTable
get()
方法实现中需要synchronized关键字以使其线程安全,但在
ConcurrentHashMap
get()中不需要它
方法。

因为
哈希表
ConcurrentHashMap
没有完全相同的行为,因此在并发性方面没有实际的结果。对于检索操作,
ConcurrentHashMap
没有锁定整个表的事实使得
ConcurrentHashMap
到可能不会反映密钥的上次更新值,因为
get()
可能与
put()
/
remove()
操作重叠:

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


当这种延迟在许多用例中并不重要,并且您也可以通过显式同步语句来处理这种延迟时,您更喜欢使用
ConcurrentHashMap
而不是
HashTable
,因为它提高了并发访问的整体
Map
性能

这可能只是一个措辞上的问题,但我对您答案的理解是,它是向后的:从ConcurrentHashMap获取时没有延迟,因为它不会阻塞,并根据最近完成的更新立即返回。相反,从哈希表获取时可能会有延迟,因为它会阻塞,直到获得锁为止,而锁可以由其他读或写操作持有。@JB Nizet当然可以。“延迟”一词的意思是“未更新”可能是一个不好的捷径,总的来说,在这个特定的上下文中,真正的时间延迟来自另一个类:HashTable。谢谢你的评论。