问题标签 [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 投票
6 回答
16479 浏览

java - 如何实现具有类似于 LinkedHashMap 的功能的 ConcurrentHashMap?

我使用LinkedHashMapaccessOrdertrue 以及在任何时候最多允许 500 个条目作为数据的 LRU 缓存。但是由于可扩展性问题,我想继续使用一些线程安全的替代方案。在这方面看起来不错,ConcurrentHashMap但缺少. 谁能指出一些链接或帮助我简化实施。accessOrderremoveEldestEntry(Map.Entry e)LinkedHashMap

0 投票
5 回答
18100 浏览

java - 使用 java ConcurrentHashMap 实现缓存

我想在 web java 应用程序中实现重量级对象的简单缓存。但我不知道如何正确地做到这一点。

我是否遗漏了什么或 ConcurrentHashMap 方法(putIfAbsent,...)还不够,需要额外的同步?

是否有更好的简单 API(在内存存储中,没有外部配置)来做到这一点?

P。

0 投票
3 回答
1303 浏览

java - 具有值(等于)相等性的 SoftReference 的潜在用途

我之前得出的结论是,如果您需要一个基于值(等于)的等式的 SoftReference,那么一个人的设计就很糟糕,除了一个内部人员。这是在 Google Collections 和 Guava 之后,不包括此类。但是我遇到了一个我认为可以使用这样一个对象的问题。

我们在视觉效果渲染农场中有一个资产管理系统,其中有 100 个进程在运行相同的作业,只是渲染的帧数不同。我们有一个 Oracle 数据库,需要记录所有使用的资产。在中间层资产管理系统中,我们可以使用 HashSet 来记录是否将插入 Oracle 的对象,而不是用相同的插入来冲击 Oracle。

我可以使用具有过期时间的 Google MapMaker,但我不想担心过期时间是否正确,我们的渲染可以在数小时内运行,有些则在几天内运行。使用具有等于相等性的 SoftReference 听起来是一种更好的方法,因此 JVM 将自动管理垃圾收集。

对于我想使用带有垃圾收集的 ConcurrentHashMap 解决的其他问题,我将使用 HashMap 中的强引用作为获取 equals() 相等性的关键,并将 SoftReference 作为值,以便 JVM 可以垃圾收集某些东西,但是在这个在这种情况下,值无关紧要,我没有值可以包装在 SoftReference 中以放在那里。因此,似乎使用带有 equals() 的 SoftReference 可以解决问题。

对此有何其他建议?

0 投票
6 回答
56787 浏览

java - Java中的ConcurrentHashMap?

ConcurrentHashMap在 Java 中有什么用?它有什么好处?它是如何工作的?示例代码也会很有用。

0 投票
3 回答
3938 浏览

java - Java并发:“级联”变量中的易失性与最终性?

一样

如果内部地图被不同的线程访问?

或者甚至需要这样的东西:

如果它不是“级联”映射,最终和 volatile 最终具有相同的效果,即所有线程始终看到映射的正确内容......但是如果映射本身包含映射会发生什么,如示例中所示...如何确保内部 Map 正确“内存屏障”?

坦克!汤姆

0 投票
3 回答
10361 浏览

java - ConcurrentHashMap 是否有可能“死锁”?

我们遇到了一个奇怪的问题ConcurrentHashMap,两个线程似乎在调用put(),然后在方法中永远等待Unsafe.park()。从外面看,里面好像是个僵局ConcurrentHashMap

到目前为止,我们只见过这种情况发生一次。

谁能想到可能导致这些症状的任何事情?

编辑:相关线程的线程转储在这里:

0 投票
6 回答
21873 浏览

java - 以原子方式递增存储在 ConcurrentHashMap 中的计数器

我想从网络应用程序的各个地方收集一些指标。为简单起见,所有这些都是计数器,因此唯一的修饰符操作是将它们增加 1。

增量将是并发的并且经常发生。读取(转储统计信息)是一种罕见的操作。

我正在考虑使用ConcurrentHashMap。问题是如何正确增加计数器。由于地图没有“增量”操作,我需要先读取当前值,然后将其递增而不是将新值放入地图中。如果没有更多代码,这不是原子操作。

是否可以在不同步的情况下实现这一点(这会破坏ConcurrentHashMap的目的)?我需要看番石榴吗?

感谢您的任何指示。


PS
有一个关于SO(在Java中增加Map值的最有效方法)的相关问题,但专注于性能而不是多线程

更新
对于那些通过搜索同一主题到达这里的人:除了下面的答案之外,还有一个有用的演示文稿,顺便涵盖了同一主题。见幻灯片 24-33。

0 投票
2 回答
8765 浏览

java - 对 java ConcurrentHashMap 中的值进行排序

我有以下代码用于对 ConcurrentHashMap 进行排序:

引发 NoSuchElementException:

我不知道为什么。有任何想法吗?

0 投票
4 回答
9645 浏览

java - Java ConcurrentHashMap 不是线程安全的.. wth?

我之前使用过 HashMap

现在我已经切换到 ConcurrentHashMap 以避免同步块,现在我遇到了问题,我的服务器每秒负载有 200-400 个并发客户端,预计会随着时间的推移而增长。

现在看起来像这样

我的服务器设计是这样工作的。我有一个用于处理大量数据包的工作线程。每个数据包都使用一个 packetHandler 子例程(不是线程的一部分)进行检查,几乎任何客户端都可以随时调用它,它几乎就像是静态的,但事实并非如此。

除了数据包处理部分,我的整个服务器大部分都是单线程的。

无论如何,所以当有人使用诸如统计所有在线客户并从他们那里获取一些信息之类的命令时。

在计数进行时,客户端也可能会断开连接并从ConcurrentHashMap中删除(这会导致我的问题)。

另外我想在这里添加一些代码。

我的意思是我当然会通过在迭代器中添加一个 try-catch 异常来跳过这些空客户端来修复它。

但是我不明白如果它在上面检查 if(person != null) 不应该嵌套的代码自动工作..

如果这并不意味着它在迭代时被删除,这应该是不可能的,因为它是线程安全的 wtf?

我该怎么办?还是 try-catch Exception 是最好的方法?

这是例外

processPackets 包含上面的代码。并且注释表示行数#

谢谢你启发我。

0 投票
6 回答
45351 浏览

java - 您是否应该在使用 ConcurrentMap 的 putIfAbsent 之前检查地图是否包含密钥

我一直在将 Java 的 ConcurrentMap 用于可从多个线程使用的映射。putIfAbsent 是一个很好的方法,并且比使用标准映射操作更容易读/写。我有一些看起来像这样的代码:

可读性很好,但它确实需要每次都创建一个新的 HashSet,即使它已经在地图中。我可以这样写:

有了这个改变,它失去了一点可读性,但不需要每次都创建 HashSet。在这种情况下哪个更好?我倾向于支持第一个,因为它更具可读性。第二个会表现得更好,可能更正确。也许有比这两种方法更好的方法。

以这种方式使用 putIfAbsent 的最佳做法是什么?