3

#JCIP的引述:

“由于不能锁定 ConcurrentHashMap 以进行独占访问,因此我们不能使用客户端锁定来创建新的原子操作,例如 put-if-absent,就像我们对 Vector 所做的那样”

为什么我们不能仅仅获取来实现额外的原子方法并保持集合线程安全(如Collections.synchronizedxxx工厂返回的同步集合):

4

3 回答 3

3

ConcurrentHashMap 的全部要点是读取操作从不阻塞,即不必检查锁。这排除了拥有这种锁的能力。

为什么我们不能只获取锁:

您可以这样做,但是您必须对地图的所有访问路径始终如一地这样做,然后您就完全否定了并发数据结构的目的。它应该是无锁的。

于 2013-07-27T00:33:10.143 回答
1

为什么?因为实现不支持它。直接来自ConcurrentHashMapJavaDocs:

不支持以阻止所有访问的方式锁定整个表

...根据定义,这就是“独占访问”。

于 2013-07-27T00:29:12.877 回答
0

您编写的代码就是您的实现,如果您以这种方式使用它,那么所有其他操作都必须以这种方式工作,即所有操作都必须获取相同的锁。

但是这里的重点是java并没有提供ConcurrentHashMap这个目的,它的目的是让多个线程同时工作。

对于您的要求,请选择HashTable.

于 2013-07-27T03:15:22.507 回答