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

java - 对线程安全函数的调用是否也需要同步?

如果我使用 ConcurrentHashMap(其中 put 是线程安全的),并且我提供了一个使用 ConcurrentHashMap put 的公共函数 myPut - 我需要同步我的函数吗?

含义:这应该同步吗?

0 投票
4 回答
2997 浏览

java - 2-D(并发)HashMap:2-property key type?哈希图的哈希图?[更新]

所以我需要一个二维的ConcurrentHashMap.

它必须尽可能快,因为我将非常频繁地添加和更新它的值。它在多线程应用程序中,因此选择使用 ConcurrentHashMap 而不仅仅是 HashMap。

“x”和“y”索引都是具有已知范围(0 到 40,000,000)的整数。

我需要知道的是:实现这一点的最有效方法是什么,以便尽可能快?最明显的路线是做一个文字二维哈希图:

ConcurrentHashMap<Integer, ConcurrentHashMap<Integer, ValueObj>> foo;

equals()或者我可以创建一个具有两个属性 x 和 y 的私有类“IntPair”,并将其用作键......但如果我这样做,最有效的方法是什么hashcode()?我最终会分配太多新IntPair的吗?我可以为我分配的每个 x/y保留一组IntPairs,然后使用纯粹的自反 equals() 以便我只检查完全相同的对象实例吗?


更新:

现在我已经仔细研究了 Integer.valueOf(int),它使用的特定缓存模型在这里没有意义,因为我正在处理一个非常稀疏的矩阵,其中包含不可预测的条目。我真的需要缓存所有使用的 IntPair,而不是预先指定的子集。

直观地说,在我看来,在大地图中查找 IntPair 以查看我是否已经创建了它,实际上,与仅在大“2-D”中查找它或多或少相同ConcurrentHashMap 无论如何,不​​是吗?因此,这里的解决方案似乎真的是new IntPair(x,y)每次我查找密钥时都使用它。是的?

0 投票
7 回答
67982 浏览

java - 为什么 ConcurrentHashMap 会阻止 null 键和值?

的 JavaDoc 是ConcurrentHashMap这样说的:

与 类似Hashtable但不同HashMap的是,此类不允许用作null键或值。

我的问题:为什么?

第二个问题:为什么Hashtable不允许null?

我使用了很多 HashMaps 来存储数据。但是当更改为ConcurrentHashMapNullPointerExceptions 时,我遇到了几次麻烦。

0 投票
4 回答
3929 浏览

java - ConcurrentHashMap 修饰符的同步

我想在ConcurrentHashMap. 对二进制文件的修改也应该反映在缓存中。由于缓存将被多个线程使用,所有 IO 操作都是同步的。地图的修改进入同synchronized一块内。大致如下:

两者mapfile都是私有的,从缓存类外部看不到。

map.get(index)如果缓存读取,即没有块,是否保留线程安全synchronized

正如我前面提到的,ConcurrentHashMap是用作地图实现的。

0 投票
4 回答
11554 浏览

java - ConcurrentHashMap 构造函数参数?

我想知道构造 a 的参数ConcurrentHashMap

  • initialCapacity默认为 16(可以理解)。
  • loadFactor默认为 0.75。
  • concurrencyLevel默认为 16。

我的问题是:

  • 应该使用什么标准来loadFactor向上或向下调整?
  • 我们如何确定并发更新线程的数量?
  • 应该使用什么标准来concurrencyLevel向上或向下调整?

此外:

  • 一个好的哈希码实现的标志是什么?(如果一个 SO 问题解决了这个问题,只需链接到它。)

谢谢!

0 投票
4 回答
2576 浏览

java - java中清理/删除未使用的地图元素的策略

我在我的网络应用程序中实现了一个“管理器”,可以调用它来设置和获取当前线程所在的网站上下文(我们给我们的网站贴上白标签,所以网站上下文代表我们在哪个网站上)

我正在尝试找出执行此操作的最佳策略,目前我正在并发哈希映射中将线程存储到 WebSiteContexts:

在线程开始时(通过 Servlet 过滤器或通过手动设置),线程将关联到它的 WebSiteContext,

但想清理 Map 以避免内存泄漏。所以我想一种策略是遍历映射的 Thread 键以找出线程是否“活动”(thread.isAlive()),如果没有删除它,例如这样:

,但我想这需要我同步对地图的访问(或者是吗?)这是我想要避免的。

是否有任何“惯用”模式用于在 java 中的线程中存储属性或确实清理以 Thread 对象作为键的映射?我愿意使用 Wea​​kReference / SoftReferences,或者如果有一些等价的 Thread.getCurrentThread().setAttribute(Object, Object),那就太好了

干杯西蒙B

0 投票
2 回答
4310 浏览

java - ConcurrentHashMap 和 putAll() 方法

通常(即非同时),即使假设您排除了构建传递给的另一个 Map 的成本,putAll()也不会比使用大量调用更有效。那是因为将需要迭代传递的 Map 的元素,以及运行将每个键值对添加到执行的 Map 的算法。put()putAll()putAll()put()

putAll()但是对于一个 ConcurrentHashMap 来说,构造一个常规的 Map 然后用它来更新它有意义吗?还是我应该只打 10 次(或 100 次或 1000 次)电话put()

多次调用的答案是否会改变putIfAbsent()

谢谢!

0 投票
8 回答
17901 浏览

java - 是否保证 ConcurrentHashMap.get() 可以通过不同的线程看到以前的 ConcurrentHashMap.put() ?

保证看到以前的不同线程?我的期望是,阅读 JavaDocs 似乎表明了这一点,但我 99% 确信现实是不同的。在我的生产服务器上,似乎正在发生以下情况。(我已经通过日志记录了它。)ConcurrentHashMap.get() ConcurrentHashMap.put()

伪代码示例:

似乎正在发生的事情是这样的:

因此,我的输出如下所示:

第二个线程不会立即看到 put!为什么?在我的生产系统上,有更多线程,我只看到一个线程,即紧随线程 1 的第一个线程有问题。

我什至尝试将 ConcurrentHashMap 上的并发级别缩小到 1,但这并不重要。例如:

我哪里错了?我的期望?或者我的代码(真正的软件,不是上面的)中是否有一些错误导致了这种情况?我已经反复检查了它,并且 99% 确定我正确处理了锁定。我什至无法理解ConcurrentHashMapJVM 中的错误。 请救我脱离自己。

可能相关的 Gorey 细节:

  • 四核 64 位至强 (DL380 G5)
  • RHEL4 ( Linux mysvr 2.6.9-78.0.5.ELsmp #1 SMP... x86_64 GNU/Linux)
  • Java 6 ( build 1.6.0_07-b06, 64-Bit Server VM (build 10.0-b23, mixed mode))
0 投票
4 回答
4586 浏览

java - 是否可以在 ConcurrentHashMap 中拥有超过 32 个锁

我读到 ConcurrentHashMap 在多线程中比 Hashtable 工作得更好,因为在存储桶级别有锁而不是映射范围的锁。每张地图最多可以有 32 个锁。想知道为什么是32个,为什么不超过32个锁。

0 投票
6 回答
40820 浏览

java - 我应该什么时候使用 ConcurrentSkipListMap?

在Java中,ConcurrentHashMap有没有更好的multithreading解决方案。那我应该什么时候使用ConcurrentSkipListMap?是冗余吗?

这两者之间的多线程方面是否常见?