gpt4 book ai didi

java - 同步嵌套的映射和集合 (Java)

转载 作者:行者123 更新时间:2023-11-30 06:35:37 24 4
gpt4 key购买 nike

我在一个 map 中的一个 map 中有一个嵌套集,我正试图通过两个线程进行同步。

map 是这样实例化的:

private final Map<Manageable, Map<String, Set<Manageable>>> manageableMap = 
Collections.synchronizedMap(new HashMap<Manageable, Map<String, Set<Manageable>>>());

这是我用来向 map 添加值的函数:

private void put(Manageable key, Manageable value, String valueType) {
synchronized (manageableMap) {
Map<String, Set<Manageable>> setMap = manageableMap.get(key);
if (setMap == null) {
setMap = new HashMap<String, Set<Manageable>>();
manageableMap.put(key, Collections.synchronizedMap(setMap));
}

synchronized (setMap) {
Set<Manageable> set = setMap.get(valueType);
if (set == null) {
set = new HashSet<Manageable>();
setMap.put(valueType, Collections.synchronizedSet(set));
}

synchronized (set) {
set.add(value);
}
}
}
}

Intellij IDEA 警告我正在同步局部变量 setMap 和 set。

我对同步还很陌生,我想知道这是否是正确的方法像这样同步嵌套数据结构。

谢谢你的帮助。

最佳答案

只需要在manageableMap上同步即可。一次只有 1 个线程可以获得 manageableMap 上的锁,因此如果一个线程已经获得了 manageableMap 上的锁,则不需要进一步锁定 set 和 setMap,因为只有 1 个线程(锁定 manageableMap 的线程)可以访问 set 和 setMap .

关于java - 同步嵌套的映射和集合 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5879321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com