问题标签 [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 回答
8005 浏览

java - 为什么 ConcurrentHashMap.putifAbsent 是安全的?

从昨天开始,我一直在阅读并发性,但我不太了解......但是有些事情开始变得清晰......
我理解为什么双重检查锁定不安全(我想知道这种罕见情况发生的可能性是多少)但是volatile 在 1.5 + 中修复了这个问题......
但我想知道这是否发生在putifAbsent

像...

那么这是否确保当另一个线程执行???myObj时会 100% 初始化?cHashM.get()因为它可能有一个引用没有完全初始化(双重检查锁定问题)

0 投票
3 回答
819 浏览

java - 像短路运算符一样使用 putIfAbsent

是否可以使用 putIfAbsent 或其任何等效项,例如短路运算符。

我希望如果已经有计算值,则不应再次计算。默认情况下,putIfAbsent 仍然会每次都进行计算,即使它实际上不会再次存储该值。

0 投票
5 回答
712 浏览

java - concurrntHashMap 能否同时保证真正的线程安全和并发?

我们知道 ConcurrentHashMap 可以提供对多个线程的并发访问以提高性能,并且在这个类中,段是同步的(我说的对吗?)。问题是,这种设计能保证线程安全吗?假设我们有 30 多个线程访问和更改 ConcurrentHashMap 实例中由相同键映射的对象,我猜他们仍然需要为此排队,不是吗?

据我回忆,《Java Concurrency in Practice》一书说 ConcurrentHashMap 提供并发读取和相当水平的并发写入。在上述情况下,如果我的猜测是正确的,那么性能不会比使用 Collection 的静态同步包装器 API 更好吗?

感谢您的澄清,约翰

0 投票
4 回答
5364 浏览

java - 静态ConcurrentHashmap是否需要外部同步

静态 ConcurrentHashmap 是否需要使用同步块或锁进行外部同步?

0 投票
2 回答
537 浏览

java - HashMap 损坏/性能问题

目前我已经实现了 HashMap

并且 Item 是具有属性 Date expirationTime 和 byte[] data 的对象

当多个线程同时开始命中此映射时,将使用此映射。我做的检查是

1.

2.如果数据返回null,则创建数据并缓存到hashMap中

似乎如果多个线程访问say键(在这种情况下为url),则数据会在同一键位置多次添加到缓存中[因为getCacheData将为多个线程返回null,因为hashmap尚未完成为第一个线程写入数据]

关于如何解决问题的任何建议?

0 投票
1 回答
190 浏览

java - 为什么 ConcurrentHashMap$HashEntry 中的“下一个”字段是最终字段

我正在阅读 java.util.ConcurrentHashMap 的源代码,发现nextConcurrentHashMap$HashEntry 中的字段是 final 的。有两种操作可以修改next:add 和 remove 的值。但是即使该next字段不是最终的,这两个操作也可以安全地完成线程。所以我不明白为什么这个next领域是最终的,谁能告诉我为什么?谢谢。

0 投票
5 回答
2920 浏览

java - 保证键唯一时 HashMap 的性能

如果保证我希望使用的键是唯一的(或者至少可以假设键是唯一的),使用“香草” ConcurrentHashMap是否提供最佳性能,或者是否需要散列函数或 put 方法进行修改以避免不必要的散列?

此外,数字键是否比非数字键(例如具有适当散列函数的字符串或 POJO)具有任何性能优势?

0 投票
5 回答
2078 浏览

java - 以相同的方法修改 ConcurrentHashMap 和 Synchronized ArrayList

我有一组由一个线程修改并由另一个线程(更具体地说是 EDT)读取的对象。我需要一个解决方案,它可以让我快速查找并快速索引(按插入的顺序),所以我使用 ConcurrentHashMap 和伴随的 ArrayList 键,所以如果想索引一个条目,我可以索引列表键,然后使用返回的键从哈希映射中获取值。所以我有一个包装类,它确保何时添加条目,将映射添加到哈希映射中,同时将键添加到列表中,类似地用于删除。

我发布了一个有问题的代码示例:

我的问题是:通过在同步方法中对其进行操作,我是否失去了使用 ConcurrentHashMap(通过同步哈希图)的所有好处?我必须同步方法以安全地从键的 ArrayList 修改/读取(CopyOnWriteArrayList 不是一个选项,因为会发生很多修改......)另外,如果您知道更好的方法来做到这一点,那将不胜感激。 ..

0 投票
2 回答
4153 浏览

java - 如何使用 RestEasy 和 Tomcat 让 MessageBodyWriter 与 HashMap 一起工作?

我正在使用 RestEasy 2.2.2 开发一个 JAX-RS Web 服务以部署到 Tomcat 7。该服务通过使用 JAXB 返回(应该返回)XML。返回的 XML 应包含 ConcurrentHashMap 的表示,类似于它在以下代码中的使用方式:

该类Item还包含一个ConcurrentHashMap需要序列化为 XML 的类。

这是资源类:

此代码运行,但生成一个没有内容的 XML:

我想要得到的输出是这样的:

我发现MessageBodyWriter在内置功能不足的情况下需要实现。我试图想出一个MessageBodyWriter实现来编组ConcurrentHashMap,但到目前为止我还不能让它工作(即我可以得到被调用的代码,但它会因各种异常而停止)。

似乎我不太了解应该如何MessageBodyWriter(和MessageBodyReader)实现和使用接口。我有 Bill Burke 的“带有 JAX-RS 的 RESTful Java”一书。MessageBodyWriter它在帮助设计 JAX-RS 服务方面非常有用,但我在相关部分中找不到有关该功能的足够详细信息。我的互联网搜索也没有产生任何可以引导我朝着正确方向前进的东西。

如果有人能帮助我弄清楚如何正确实现MessageBodyWriter(and MessageBodyReader) 接口,我将不胜感激。我不知道我是否遗漏了注释、放错了注释,或者我是否需要一种全新的方法。

提前感谢您的帮助。

编辑:

将代码修改为以下使我成功了一半:

这会生成我需要的 XML(上面包含的示例)。但是,此代码在解组时不起作用。我得到以下异常:

我认为原因是缺少“正确的设置器”,因此解组器不会尝试将项目添加到 aCollection但我不知道该设置器的外观。如果有人知道如何做到这一点,我将不胜感激。

提前致谢。

编辑2:

顺便说一句,我已经看到 Chris 的回复,他建议使用@XmlJavaTypeAdapter. 我已经尝试过这个建议,它让我接近我需要的 XML。但是,我使用 @XmlJavaTypeAdapter 获得的 XML 在其中有一个额外的级别(<class><items><item>而不是<items><item>--- 如我的示例中所见,我将ConcurrentHashMap实例作为类的成员变量)。我似乎也无法更改各个地图项的元素名称(它们总是被称为“项目”)。

这些都不是什么大问题,我可以做出必要的改变,并在必要时接受它们。但是,如果可能的话,我希望一开始就没有它们。出于教育目的,我还想了解为什么 EDIT 1 中的代码不能用于解组(以及如何修复它,如果可能的话)。

提前感谢所有帮助。

0 投票
2 回答
293 浏览

java - ConcurrentWeakKeyHashMap isEmpty 方法

以下是来自 ConcurrentWeakKeyHashMap.java 的 isEmpty() 方法, https://github.com/netty/netty/blob/master/src/main/java/org/jboss/netty/util/internal/ConcurrentWeakKeyHashMap.java

为什么它需要 mcsum,if(mcsum!= 0) {..} 块在做什么?

更重要的是,我如何获得

评估为真?

编辑: 如果块现在在 ConcurrentWeakKeyHashMapTest中,则评估上述代码

本质上 1 个线程持续监控 concurrentMap,而另一个线程持续添加/删除相同的密钥对值