【问题标题】:Is it possible to synchronize ConcurrentHashMap update by it's key?是否可以通过它的键来同步 ConcurrentHashMap 更新?
【发布时间】:2019-10-02 03:32:34
【问题描述】:

我在 ConcurrentHashMap 上有大量更新操作,我需要最小化同步以更新此地图。

请看下面的代码。

public ConcurrentHashMap<String, Integer> dataMap = new ConcurrentHashMap<>();

    public void updateData(String key, int data) {
        if ( dataMap.containsKey(key)) {
            // do something with previous value and new value and update it
        }
    }

例如,当一个线程使用键“A”调用updateData 时,应阻止其他所有尝试使用键“A”调用updateData 直到第一个线程完成。同时,我希望另一个线程尝试调用 updateData 并同时运行键“B”。

我想知道是否有任何奇特的方法可以简单地用它的键来锁定 hashMap。

【问题讨论】:

  • 不同步有什么问题吗?我猜想 ConcurrentHashMap 的 put 操作在内部使用 synchronization 在段上。你不必明确地这样做
  • 如果使用computeIfPresent,则同步通过单键iiuc。

标签: java concurrency concurrenthashmap


【解决方案1】:

我认为您正在寻找compute method

它接受一个给定键和当前值的函数(或null,如果还没有值),并且可以计算新值。

ConcurrentHashMap 保证对于给定的键,只有一个这样的函数同时运行。并发的第二个调用将阻塞,直到准备好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2023-02-09
    • 1970-01-01
    • 2019-01-30
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多