【问题标题】:increasing concurrenthashmap segmentation增加并发hashmap分段
【发布时间】:2015-03-01 21:33:33
【问题描述】:

我正在浏览并发哈希映射,据我目前所知,它们默认分为 16 个部分。每个部分都有自己的键值对份额。如果线程想要锁定键值对,它将锁定整个段。 (如果我在任何地方错了,请纠正我)。现在在这个link 中提到 chm 在 writers less 时很好。我想知道我们是否增加了段的数量,我的意思是使其与数字键值对相当,是否有可能为在同一 CHM 上运行的大量写入器线程创建并发性。此外,由于 CHM 中存在锁,就内存消耗而言,成本会有多高。

谢谢

贾延德拉

【问题讨论】:

    标签: java concurrenthashmap


    【解决方案1】:

    如果我正确理解您的问题,JavaDoc 中的回答恰到好处:

    更新操作之间允许的并发由 可选的 concurrencyLevel 构造函数参数(默认 16),即 用作内部尺寸调整的提示。该表在内部 分区以尝试允许指定数量的并发 无争用更新。因为在哈希表中的放置是 本质上是随机的,实际并发会有所不同。理想情况下,你 应该选择一个值来容纳尽可能多的线程 同时修改表。使用显着高于 你需要的可能会浪费空间和时间,而显着降低的值会 导致线程争用。但内部高估和低估 一个数量级通常不会产生太大的影响。一个 当已知只有一个线程将 修改,所有其他人只会阅读。此外,调整这个或任何其他 一种哈希表是一个相对较慢的操作,所以,如果可能的话, 最好在 构造函数。

    【讨论】:

    • 因此,如果哈希表进行调整大小,则会对性能产生影响。但是如果我在构造函数本身中提供了一个大的并发级别值,那么在使用大量修改线程时会有任何问题,还请让我知道所有段的大小是否相等或可变(我相信它们是可变的) .
    • @jayendrabhatt 是的,我相信这种优化只能通过分析您的应用程序来驱动。如果我理解正确,段是根据哈希码填充的。因此,如果您的对象的哈希码良好,则段的大小将几乎相同。
    • @jayendrabhatt good 因为它有利于在常识中进行散列,因此您的对象提供均匀分布的代码。 stackoverflow.com/questions/16629893/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    相关资源
    最近更新 更多