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。谢谢你的评论。