问题标签 [concurrenthashmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2196 浏览

java - 安全地更新 ConcurrentHashMap 和 AtomicInteger

我必须将单词及其相应的整数索引存储在哈希图中。哈希映射将同时更新。

例如:假设wordList{a,b,c,a,d,e,a,d,e,b} 哈希映射将包含以下键值对

代码如下:

我的问题是上面的类是否是线程安全的?基本上,在这种情况下,原子操作应该是递增 the maxIndex,然后如果不存在该单词则将其放入哈希映射中。

在这种情况下有没有更好的方法来实现并发?

0 投票
4 回答
4012 浏览

java - “ConcurrentHashMap.putAll(...)”是原子的吗?

方法 ConcurrentHashMap.putAll(Map) 应该是原子的吗?

我在文档中找不到它,并且 ConcurrentMap 界面中没有提到它,所以我猜答案是否定的。我要求它确定,因为说实话,如果该操作不是原子的,那就没有意义了。

如果它不是原子的,那么支持多个项目的原子插入的最佳方法是什么?回到好旧的同步?

0 投票
2 回答
1762 浏览

java - advantages of java's ConcurrentHashMap for a get-only map?

Consider these two situations:

  1. a map which you are going to populate once at the beginning and then will be accessed from many different threads.
  2. a map which you are going to use as cache that will be accessed from many different threads. you would like to avoid computing the result that will be stored in the map unless it is missing, the get-computation-store block will be synchronized. (and the map will not otherwise be used)

In either of these cases, does ConcurrentHashMap offer you anything additional in terms of thread safety above an ordinary HashMap?

0 投票
4 回答
328 浏览

java - 编写高性能缓存

我写了一个股票市场模拟器,它使用 aConcurrentHashMap作为缓存。

缓存包含大约 75 个元素,但它们的更新和检索速度非常快(大约每秒 500 次)。

这是我所做的:

线程 1:

连接到一个外部系统,该系统为我提供给定股票代码的流式报价。

线程 2(回调线程):

等待外部系统将数据传递给它。一旦它得到数据,它就会解析它,创建一个不可变的 DataEntry 对象,缓存它并向 thread3 发送一个信号。

线程 3(消费者线程): 收到信号后,从缓存中检索 DataEntry 并使用它。(不让 thread2 直接将数据推送到 thread3 是任务的一部分)。

通过分析器运行它后,我注意到我正在创建很多DataEntry对象。因此伊甸园很快就被填满了。

所以,我正在考虑通过以下方式调整设计:

a)使DataEntry类可变。

b)DataEntry用空对象预先填充缓存。

c)当更新到达时,DataEntry从地图中检索对象并填充字段。

这样,DataEntry对象的数量将是恒定的并且等于元素的数量。

我的问题是:

a)这个设计是否存在我通过使DataEntry可变变量引入的任何并发问题。

b)我还能做些什么来优化缓存吗?

谢谢。

0 投票
3 回答
265 浏览

java - 从 ConcurrentMap.remove() 获取 key 是否存在

在 Java 中ConcurrentMap,有remove(key, expectedValue),这将返回以下之一:

  • 期望值在那里并且已被删除。
  • 预期值不存在,因此尚未删除。

但我想要得到的是其中之一:

  1. 期望值在那里并且已被删除。
  2. 该键下有一个值,但不是预期的值,因此尚未删除。
  3. 该键下没有任何值,因此尚未删除。

如何以并发和线程安全的方式获取这些信息?


这是我要验证的代码

或广义:

0 投票
2 回答
331 浏览

java - ConcurrentHashMap 中的 lock() 方法

可能这对我来说很愚蠢,但我查看了源代码ConcurrentHashMap,我无法lock()在该类的任何地方看到该方法的定义,但我可以看到该方法在多个场合被调用。在 Eclipse 中,当我说打开声明时lock(),它会显示类ReentrantLock.lock(),所以我很困惑这是如何工作的?ReentrantLocklock() 方法调用的对象引用在哪里?

0 投票
4 回答
4807 浏览

java - ConcurrentHashMap putIfAbsent : 后跟 get() 调用时的原子性

我想讨论我对并发映射的特定用途,以检测我的逻辑......

如果我用过ConcurrentHashMap,我可以做熟悉的

但我意识到存在竞争条件putIfAbsent,如果我从和之间的映射中删除项目get,上面的方法将返回集合中不再存在的东西。这可能会也可能不会,但是让我们假设对于我的用例来说,这是不行的。

我真正想要的是让整个事情都是原子的。所以,

但随着这扩展到

which for line [1] 将返回null第一次使用(即,map.put将返回前一个值,第一次使用是null)。

在这种情况下,我不能让它返回 null

这给我留下了类似的东西;

所以,最后,我的问题;上面的例子在语义上有何不同?是否getExampleThree确保原子性,getExampleTwo但正确避免 null 返回?还有其他问题getExampleThree吗?

我希望围绕选择进行一些讨论。我意识到我可以在调用我的方法的客户端和从地图中删除的方法周围使用非ConcurrentHashMap和同步,get但这似乎违背了 ConcurrentHashMap 的目的(非阻塞性质)。这是我保持数据准确的唯一选择吗?

我想这就是您选择 ConcurrentHashMap 的部分原因;在您与之交互时它是可见的/最新的/准确的,但是如果旧数据将成为问题,则可能会进一步产生影响......

0 投票
1 回答
283 浏览

java - ConcurrentHashMap 中的遍历

  1. 为什么值在volatileEntry类中。ConcurrentHashMap

  2. 在遍历过程中,检查ConcurrentHashMap当类valueEntry的值为 null 时,它会锁定整个段并尝试再次读取该值。在哪种情况下,值可以单独为空?整个条目应该为空,而不仅仅是值。

  3. 以及如何锁定整个段以确保在值为 null 的情况下正确遍历。

0 投票
2 回答
1992 浏览

java - `ConcurrentHashMap` 迭代器的多线程使用

我需要编写一个缓存的特定实现,它具有唯一键但可以包含重复值,例如:

该类需要提供非阻塞读取/键查找,但也具有典型的创建/更新/删除突变器。例如,删除值2应该导致

到目前为止,此缓存的读取将超过写入,因此写入性能不是问题 - 只要并发写入不会在彼此之上运行。条目的总数很可能会少于 1000,因此偶尔迭代值仍然是可以承受的。

所以我写了这样的东西(伪代码):

写完上面的内容后,我意识到ConcurrentHashMap它还提供了非阻塞读取,这将使我的所有努力都变得毫无意义,但是它的 Javadoc 中有一个声明引起了人们的注意:

因此,如果我替换 with 的使用volatile ImmutableMapfinal ConcurrentHashMap删除所有synchronized块,竞争的并发突变器是否有可能相互失效?例如,我可以想象两个并发调用如何remove导致竞争条件,使第一个的结果完全无效remove

我能看到的唯一改进是,通过使用final ConcurrentHashMap 保持synchronized原样,我至少可以避免不必要的数据复制。

这有意义吗 - 或者我在这里忽略了一些东西?任何人都可以为此解决方案提出其他替代方案吗?

0 投票
2 回答
836 浏览

java - ConcurrentHashMap.Segment 是可重入锁吗?

关于ConcurrentHashMap.SegmentJava 1.6 集合库的设计:

恕我直言,给定Segment的 is-not-a ReentrantLock,那么为什么会这样extends呢?它应该是一个组合:

static final class Segment<K,V> implements Serializable { ReentrantLock lock = ... }