【问题标题】:Hazelcast IMap - Concurrent updates to the same key, different valueHazelcast IMap - 并发更新相同的键,不同的值
【发布时间】:2017-06-30 21:11:07
【问题描述】:

没有测试,因为我被困在火车上并且没电了......

我需要确定 Hazelcast 的 IMap 并发更新是否是线程安全的,更新相同的键但该键的值不同。

例如:

假设我有 2 个不同的线程更新同一个 IMap 键...

出于所有意图和目的,此地图如下所示:

  key: {value1: 1, value2: 2}

一个线程说,

  "I am updating value1 to 3"

另一个线程说(同时)

  "I am updating value2 to 4".

Hazelcast 如何处理这个问题?

最终结果会如下所示吗?

  key: {value1: 3, value2: 4}

【问题讨论】:

    标签: java multithreading concurrency hazelcast


    【解决方案1】:

    Hazelcast 使用分区。对密钥进行哈希处理以找到该条目的正确分区。

    每个分区都是单线程的,每个分区只有一个分区线程处理。因此,单个键的两个更新由单个分区线程处理。

    如果两个更新的键都位于同一个分区中,则这些操作将在单个分区线程上按顺序进行。如果每个键位于不同的分区 - 不同的线程将处理每个更新。

    我不太明白你的符号:key: {value1: 1, value2: 2} -> 它看起来像一个嵌套地图。

    另外你说:the same key but different values of that key. -> 在一个映射中,每个键只有一个值(除非该值是一个集合或映射)

    【讨论】:

    • 是的,所以在我的示例中,键的“值”实际上是一个映射。你说一个分区是单线程的。这是否意味着 Hazelcast 会在每次更新其值时为我锁定密钥?我想确保我不需要自己锁定钥匙。我有不同的过程,它们将同时更新值图中的不同变量。他们永远不会更新同一个变量,但是他们会更新同一个键。
    • 无需锁定。单个键的每个值更新都是单线程的。 (与实际值无关)。
    • 如果两个线程同时尝试创建密钥,我如何避免锁定?在这种情况下,我希望第二个线程使用我的更新逻辑而不是我的创建逻辑。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多