0

最近在探索时,ConcurrentSkipListMap我浏览了它的实现,发现它的 put 方法不是线程安全的。它在内部调用doPut实际添加项目。但是我发现这个方法并没有使用任何类似于ConcurrentHashMap.

因此,我想知道是否add是线程安全的。看看这个方法,它似乎不是线程安全的——也就是说,如果这个方法由两个线程同时执行,那么可能会出现问题。

我知道ConcurrentSkipListMap内部使用跳过列表数据结构,但我希望add方法是线程安全的。我理解有什么问题吗?真的ConcurrentSkipListMap不是线程安全的吗?

4

3 回答 3

2

实施中的评论说:

鉴于使用了树状索引节点,您可能想知道为什么它不使用某种搜索树来代替,这将支持更快的搜索操作。原因是没有已知的有效的搜索树的无锁插入和删除算法。索引节点的“向下”链接的不变性(与真实树中的可变“左”字段相反)使得仅使用 CAS 操作即可处理。

所以他们使用一些低级编程特性和比较和交换操作来对映射原子进行更改。有了这个,它们可以确保线程安全,而无需同步访问。

您可以在源代码中更详细地阅读它。

于 2015-03-06T12:20:03.590 回答
2

仅仅因为它不使用 aLock并不会使其线程不安全。跳过列表结构可以实现无

您应该仔细阅读API 。

...插入、删除、更新和访问操作由多个线程安全地并发执行。迭代器是弱一致的,返回的元素反映了在迭代器创建时或之后的某个时刻映射的状态。它们不会抛出 ConcurrentModificationException,并且可以与其他操作同时进行。...

于 2015-03-06T12:02:48.917 回答
1

我们应该信任 Java API。这就是 java.util.concurrent 包文档所说的:

并发集合

除了队列之外,这个包还提供了设计用于多线程上下文的集合实现:ConcurrentHashMap、ConcurrentSkipListMapConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。

于 2015-03-06T12:00:16.953 回答