我在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
的尝试,直到完成第一个线程为止。同时,我希望另一个线程尝试同时使用键“ B”调用updateData
。
我想知道是否有任何花哨的方法可以简单地用其键锁定hashMap。
答案 0 :(得分:1)
我认为您正在寻找compute
method。
它需要一个具有键和当前值(如果没有值,则为null
)的函数,并且可以计算新值。
ConcurrentHashMap保证对于给定的键,只能同时运行一个这样的函数。并发的第二个呼叫将阻塞,直到准备就绪。