提问者:小点点

如何在同一段上的两个读取操作在并发HashMap中同时工作?


我试图了解读取操作在HashTable、HashMap和并发HashMap内部是如何工作的。ConCurrentHashMap在内部被分成大小为32的段。因此,最多32个线程一次可以读取。当我们在并发HashMap中同时对同一段进行两次读取操作时会发生什么。

此外,我想知道在HashTable、HashMap中对同一元素的多次读取是如何工作的?


共1个答案

匿名用户

并发HashMap在内部分为大小为32的段。因此一次最多可以读取32个线程。

那是不正确的。根据ConCurrentHashMap留档,“检索操作不需要锁定”[原文强调]。这意味着任意多个线程一次可以读取映射。(注意:上面的链接是指向Java最新版本的留档,但所有版本也是如此。上面引用的语句从JDK1.5的留档开始就存在了,这是引入ConCurrentHashMap的初始版本。)

即使对于涉及锁定的更新,这种说法也是不正确的:自Java7以来,并发HashMap没有被划分为“段”;当它被划分为段时,并发的关键是段的数量,而不是它们的大小;段的数量是用户可配置的;默认的段数是16,而不是32。

此外,我想知道在HashTable、HashMap中对同一元素的多次读取是如何工作的?

Hashtable. get锁定整个映射,因此并发读取是相同元素还是不同元素并不重要;无论哪种方式,一个锁定另一个。

HashMap不担心并发;多个线程可以愉快地同时读取映射,但与读取或其他更新同时进行更新并不安全。