0

虽然经历了Java 7 ConcurrentHashMap的内部实现,但我注意到要设置新的Segment,我们使用的是Unsafe类,它执行Ordered write并使用Compare和Swap算法,从而支持非阻塞行为。在Java 7 ConcurrentHashMap中,为什么在写入时需要分段锁定?为什么我们不能再使用不安全来保持事物不被阻塞?

我的疑问是,为什么并发HashMap中不使用比较&交换算法或类似的东西,以保持读&写单链表无阻塞,而不是获取上段锁,然后写单链表?

回答

0

在不安全的类中的方法通常是不安全的使用。只有在编写库的软件工程师已经发现由于其他约束条件(如可能同时访问数据的知识)或关于如何在各种处理器体系结构上实现基元的知识时才使用它们。

在这种情况下,一些工程师在Oracle已经确定了不安全的类可用于操纵段,但不适合单向链表。

+0

是的,我明白,不安全的类不应该被优先考虑,而是我们可以使用AtomicReferenceArray来完成相同的操作。不过,我想了解导致在段上使用锁的限制是什么。 –

+0

你应该试图了解的是,这种不寻常的情况是允许使用不安全类的地方。 –

+0

实际上,在ConcurrentHashMap的文档中已经提到它用于减少间接级别,因为AtomicReferenceArray在内部使用Unsafe来提供有序写入而不是易失性写入。另外,如果我的理解是正确的,那么它将有助于避免创建内存屏障的易失性写入,从而导致略微更好的性能。如果我错了,请纠正我。 –

相关问题