用ReentrantLock包装ConcurrentHashMap读写操作是一个好习惯吗?

时间:2010-10-14 15:42:21

标签: java concurrency concurrenthashmap reentrantreadwritelock

我认为在ConcurrentHashMap的实现中,已经使用了ReentrantLock。因此,不需要使用ReentrantLock来访问ConcurrentHashMap对象。这只会增加更多的同步开销。有什么意见吗?

2 个答案:

答案 0 :(得分:10)

你(或任何人)想要实现的目标是什么? ConcurrentHashMap已经是线程安全的。使用额外的锁定代码对其进行包装只会显着减慢速度,因为

  1. 它本身并不锁定读取,
  2. 即使是写入,也很难在外部模仿其内部锁定分区行为。
  3. 换句话说,添加额外的锁定会大大增加线程争用的可能性(以及使记录的读操作的线程安全保证更严格)。

      

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

    来自Java Generics and Collections,第16.4章。

答案 1 :(得分:5)

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