我认为在ConcurrentHashMap的实现中,已经使用了ReentrantLock。因此,不需要使用ReentrantLock来访问ConcurrentHashMap对象。这只会增加更多的同步开销。有什么意见吗?
答案 0 :(得分:10)
你(或任何人)想要实现的目标是什么? ConcurrentHashMap
已经是线程安全的。使用额外的锁定代码对其进行包装只会显着减慢速度,因为
换句话说,添加额外的锁定会大大增加线程争用的可能性(以及使记录的读操作的线程安全保证更严格)。
ConcurrentHashMap
提供了ConcurrentMap
的实现,并为解决吞吐量与线程安全问题提供了高效的解决方案。它针对读取进行了优化,因此即使在更新表时,检索也不会阻塞(为此,合同规定检索结果将反映在检索开始之前完成的最新更新操作)。更新通常也可以不受阻塞地进行,因为ConcurrentHashMap
不是由一个表组成,而是由一组表组成,称为段,每个表都可以独立锁定。如果段数相对于访问表的线程数足够大,则每个段通常不会有多于一个正在进行的更新。
来自Java Generics and Collections,第16.4章。
答案 1 :(得分:5)
ConcurrentHashMap的重点不是锁定对它的访问/修改。额外的锁定只会增加开销。