ConcurrentHashMap与ConcurrentSkipListMap的澄清

Tra*_*ity 7 concurrency multithreading dictionary

我想基于API文档澄清一些关于ConcurrentHashMap和ConcurrentSkipListMap的内容.

从我的理解ConcurrentHashMap gaurantees线程安全插入多个线程.因此,如果您的地图只能由多个线程同时填充,那么就没有问题.然而,API继续建议它不会锁定检索,所以你可能会在这里得到误导性的结果?

相反,对于ConcurrentSkipListMap,它表示:"插入,删除,更新和访问操作安全地由多个线程并行执行".所以我假设这没有哈希映射所具有的上述检索问题,但显然这通常会带来性能成本?

在实践中,有没有人发现需要使用ConcurrentSkipListMap,因为这种特殊的行为,或者通常无关紧要的是检索可能会给出过时的视图?

dez*_*hik 10

并发哈希映射

检索反映了最近完成的更新操作的结果。对于诸如 putAll 和 clear 之类的聚合操作,并发检索可能仅反映某些条目的插入或删除。

它对get(key). 如果当线程1调用put(key1, value1)和线程2调用之后get(key1),线程2不会等待线程1,以完成其put彼此,他们不同步及线程可以变老相关的值。但是,如果put(key1, value1)在 Thread2 尝试之前在 Thread1 中完成,get(key1)则 Thread2 保证获得此更新 ( value1)。

ConcurrentSkipListMap已排序并提供

containsKey、get、put 和 remove 操作及其变体的预期平均 log(n) 时间成本

ConcurrentSkipListMap 不是那么快,但是当您需要排序的线程安全映射时很有用。

  • 实际上在所有情况下,`ConcurrentHashMap` 就足够了。对我来说,及时更新意味着能够查看已完成的更新——在 ConcurrentHashMap 中也是如此。但是,如果您想在 put 启动后立即阻止来自地图的所有获取,那么您需要进行某种额外的同步。您可以使用低效的 `Collections.synchronizedMap()` 或具有严格大小的 HashMap 数组(如 ConcurrentHashMap 中的段)以及相应关联的 ReadWriteLock。请注意,这种阻塞几乎总是不必要的,并且会影响性​​能。老实说,我无法想象你什么时候需要它。 (2认同)