问题标签 [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.
java - 对线程安全函数的调用是否也需要同步?
如果我使用 ConcurrentHashMap(其中 put 是线程安全的),并且我提供了一个使用 ConcurrentHashMap put 的公共函数 myPut - 我需要同步我的函数吗?
含义:这应该同步吗?
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保留一组IntPair
s,然后使用纯粹的自反 equals() 以便我只检查完全相同的对象实例吗?
更新:
现在我已经仔细研究了 Integer.valueOf(int),它使用的特定缓存模型在这里没有意义,因为我正在处理一个非常稀疏的矩阵,其中包含不可预测的条目。我真的需要缓存所有使用的 IntPair,而不是预先指定的子集。
直观地说,在我看来,在大地图中查找 IntPair 以查看我是否已经创建了它,实际上,与仅在大“2-D”中查找它或多或少相同ConcurrentHashMap 无论如何,不是吗?因此,这里的解决方案似乎真的是new IntPair(x,y)
每次我查找密钥时都使用它。是的?
java - 为什么 ConcurrentHashMap 会阻止 null 键和值?
的 JavaDoc 是ConcurrentHashMap
这样说的:
与 类似
Hashtable
但不同HashMap
的是,此类不允许用作null
键或值。
我的问题:为什么?
第二个问题:为什么Hashtable
不允许null?
我使用了很多 HashMaps 来存储数据。但是当更改为ConcurrentHashMap
NullPointerExceptions 时,我遇到了几次麻烦。
java - ConcurrentHashMap 修饰符的同步
我想在ConcurrentHashMap
. 对二进制文件的修改也应该反映在缓存中。由于缓存将被多个线程使用,所有 IO 操作都是同步的。地图的修改进入同synchronized
一块内。大致如下:
和
两者map
和file
都是私有的,从缓存类外部看不到。
map.get(index)
如果缓存读取,即没有块,是否保留线程安全synchronized
?
正如我前面提到的,ConcurrentHashMap
是用作地图实现的。
java - ConcurrentHashMap 构造函数参数?
我想知道构造 a 的参数ConcurrentHashMap
:
initialCapacity
默认为 16(可以理解)。loadFactor
默认为 0.75。concurrencyLevel
默认为 16。
我的问题是:
- 应该使用什么标准来
loadFactor
向上或向下调整? - 我们如何确定并发更新线程的数量?
- 应该使用什么标准来
concurrencyLevel
向上或向下调整?
此外:
- 一个好的哈希码实现的标志是什么?(如果一个 SO 问题解决了这个问题,只需链接到它。)
谢谢!
java - java中清理/删除未使用的地图元素的策略
我在我的网络应用程序中实现了一个“管理器”,可以调用它来设置和获取当前线程所在的网站上下文(我们给我们的网站贴上白标签,所以网站上下文代表我们在哪个网站上)
我正在尝试找出执行此操作的最佳策略,目前我正在并发哈希映射中将线程存储到 WebSiteContexts:
在线程开始时(通过 Servlet 过滤器或通过手动设置),线程将关联到它的 WebSiteContext,
但想清理 Map 以避免内存泄漏。所以我想一种策略是遍历映射的 Thread 键以找出线程是否“活动”(thread.isAlive()),如果没有删除它,例如这样:
,但我想这需要我同步对地图的访问(或者是吗?)这是我想要避免的。
是否有任何“惯用”模式用于在 java 中的线程中存储属性或确实清理以 Thread 对象作为键的映射?我愿意使用 WeakReference / SoftReferences,或者如果有一些等价的 Thread.getCurrentThread().setAttribute(Object, Object),那就太好了
干杯西蒙B
java - ConcurrentHashMap 和 putAll() 方法
通常(即非同时),即使假设您排除了构建传递给的另一个 Map 的成本,putAll()
也不会比使用大量调用更有效。那是因为将需要迭代传递的 Map 的元素,以及运行将每个键值对添加到执行的 Map 的算法。put()
putAll()
putAll()
put()
putAll()
但是对于一个 ConcurrentHashMap 来说,构造一个常规的 Map 然后用它来更新它有意义吗?还是我应该只打 10 次(或 100 次或 1000 次)电话put()
?
多次调用的答案是否会改变putIfAbsent()
?
谢谢!
java - 是否保证 ConcurrentHashMap.get() 可以通过不同的线程看到以前的 ConcurrentHashMap.put() ?
保证看到以前的不同线程?我的期望是,阅读 JavaDocs 似乎表明了这一点,但我 99% 确信现实是不同的。在我的生产服务器上,似乎正在发生以下情况。(我已经通过日志记录了它。)ConcurrentHashMap.get()
ConcurrentHashMap.put()
伪代码示例:
似乎正在发生的事情是这样的:
因此,我的输出如下所示:
第二个线程不会立即看到 put!为什么?在我的生产系统上,有更多线程,我只看到一个线程,即紧随线程 1 的第一个线程有问题。
我什至尝试将 ConcurrentHashMap 上的并发级别缩小到 1,但这并不重要。例如:
我哪里错了?我的期望?或者我的代码(真正的软件,不是上面的)中是否有一些错误导致了这种情况?我已经反复检查了它,并且 99% 确定我正确处理了锁定。我什至无法理解ConcurrentHashMap
JVM 中的错误。 请救我脱离自己。
可能相关的 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)
)
java - 是否可以在 ConcurrentHashMap 中拥有超过 32 个锁
我读到 ConcurrentHashMap 在多线程中比 Hashtable 工作得更好,因为在存储桶级别有锁而不是映射范围的锁。每张地图最多可以有 32 个锁。想知道为什么是32个,为什么不超过32个锁。
java - 我应该什么时候使用 ConcurrentSkipListMap?
在Java中,ConcurrentHashMap
有没有更好的multithreading
解决方案。那我应该什么时候使用ConcurrentSkipListMap
?是冗余吗?
这两者之间的多线程方面是否常见?