不,
ConcurrentHashMap这样做会失去您的利益。您也可以使用
HashMapwith
synchronized或
synchronizedMap()锁定整个表(这是在中包装操作时要执行的操作
synchronized,因为隐含的监视器是整个对象实例。)
目的
ConcurrentHashMap是通过允许在表上进行并发读/写而不锁定整个表来提高并发代码的吞吐量。该表通过使用锁条带在内部支持此功能(多个锁而不是一个,每个锁分配给一组散列桶-
请参阅Goetz等人的《实践中的Java并发性》)。
一旦使用
ConcurrentHashMap,由于实现中的锁条等,所有标准映射方法(
put(),
remove()等)都成为原子的。唯一的权衡是方法类似
size()并且
isEmpty()不一定返回准确的结果,因为它们唯一的方法就是所有操作都可以锁定整个表。
该
ConcurrentMap接口接口还增加了新的原子复合操作,如
putIfAbsent()(把东西只有当它的关键是不是已经在地图),
remove()同时接受key和value(删除仅当其值等于你传递参数的条目),等等。这些操作过去需要锁定整个表,因为它们需要两个方法调用才能完成(例如,如果使用的是标准实现,则
putIfAbsent()需要对
containsKey()and进行调用,并且
put()包装在一个
synchronized块中
Map。)再一次,通过使用这些方法,您可以获得更大的吞吐量避免锁定整个表。



