ConcurrentHashMap
最后更新于
最后更新于
数组 + 链表 + 红黑树,CAS
ConcurrentHashMap 使用一种粒度更细的加锁机制来实现更大程度的共享,这种机制称为分段锁(Lock Striping),在这种机制中:
任意数量的读取线程可以并发地访问 Map
执行读取操作的线程和执行写入操作的线程可以并发地访问 Map
一定数量的写入线程可以并发地修改 Map
ConcurrentHashMap 带来的结果是,在并发访问环境下将实现更高的吞吐量,而在单线程环境中只损失非常小的性能。
ConcurrentHashMap 的迭代器不会抛出 ConcurrentModificationException。
ConcurrentHashMap 返回的迭代器具有弱一致性(Weakly Consistent),而并非“及时失败”。弱一致性的迭代器可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以(但是不保证)在迭代器被构造后将修改操作反映给容器。
对于一些需要在整个 Map 上进行计算的方法,例如 size 和 isEmpty,这些方法的语义被略微减弱了以反映容器的并发特性。由于 size 返回的结果在计算时可能已经过期了,它实际上只是一个估计值,因此允许 size 返回一个近似值而不是一个精确值。
虽然这看上去有些令人不安,但事实上 size 和 isEmpty 这样的方法在并发环境下的用处很小,因为它们的返回值总在不断变化。因此,这些操作的需求被弱化了,以换取对其他更重要操作的性能优化,包括 get、put、containsKey 和 remove 等。