3

我认为在 ConcurrentHashMap 的实现中,已经使用了 ReentrantLock。所以不需要使用 ReentrantLock 来访问 ConcurrentHashMap 对象。这只会增加更多的同步开销。任何意见?

4

2 回答 2

10

你(或任何人)想用它来实现什么?ConcurrentHashMap已经是线程安全的了。用额外的锁定代码包装它只会显着减慢它,因为

  1. 它本身并不锁定读取,
  2. 即使对于写入,您也很难在外部模仿其内部锁分区行为。

换句话说,添加额外的锁定将显着增加线程争用的机会(以及使读取操作的线程安全保证更严格,记录在案)。

ConcurrentHashMap为协调吞吐量与线程安全的问题提供了一种实现ConcurrentMap并提供了一种高效的解决方案。它针对读取进行了优化,因此即使在更新表时检索也不会阻塞(为此,合同规定检索结果将反映在检索开始之前完成的最新更新操作)。更新通常也可以在没有阻塞的情况下进行,因为 aConcurrentHashMap不是由一个表组成,而是由一组称为段的表组成,每个表都可以独立锁定。如果段的数量相对于访问表的线程数量足够大,那么在任何时候每个段通常不会超过一次更新。

来自 Java 泛型和集合,第 16.4 章。

于 2010-10-14T15:49:36.300 回答
5

ConcurrentHashMap 的重点不是锁定对它的访问/修改。额外的锁定只会增加开销。

于 2010-10-14T15:46:34.697 回答