Mat*_*oer 6 java thread-safety concurrenthashmap
我需要更新 ConcurrentHashmap 中的值,但我不确定如何确保线程安全。
Hashmap 是一个 ConcurrentHashMap,我需要获取自定义类的实例,对其执行一些操作,然后将更新后的值放回。
有什么方法可以将这种 get-alter-put 操作结合到原子操作中吗?
提前致谢
Deb*_*was -1
您可以使用 ConcurrentHashMapscomputeIfPresent https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#computeIfPresent-K-java.util.function.BiFunction-
但由于computeIfPresent是一个成本高昂的操作,因为它是原子操作,并且一些更新操作在BiFunction的计算期间将被其他线程阻塞。您可以通过对并发哈希图执行读取操作来排除这种情况,该操作非常快,如果返回不为 null ,则调用computeIfPrsent
下面的代码获取键“1”的值并向其添加 100,然后以原子方式放回地图
ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
map.put(1,100);
Integer value = map.get(1);
if (value != null)
map.computeIfPresent(1, (key, oldValue) -> oldValue + 100);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12824 次 |
| 最近记录: |