gpt4 book ai didi

java - 使用可变键映射并发

转载 作者:行者123 更新时间:2023-12-01 13:21:32 25 4
gpt4 key购买 nike

我有: Map<K1, Map<K2, V>> ,其中:

  1. K1 是可变的。 (它很少改变,并且只在一个地方改变,所以我可以删除 K1 的 Map 并用另一个键重新设置它)

我想要:使 map 并发。我想要同时:

  1. 修改 K2 的值 (V)
  2. 更换 K1 的整个 map

更新问题:下面的代码容易出错吗?

public class V {
K1 k1;
K2 k2;

final ConcurrentHashMap<K1, ConcurrentHashMap<K2, V>> map = new ConcurrentHashMap<K1, ConcurrentHashMap<K2, V>> ();

public void changeK1(V v, K1 newK) {
removeValue(v); //doesn't remove old val!
v.k1 = newK; //PROBLEM: map is the same as before `removeValue` call, but it shouldn't!
addValue(V); //doesn't add new val!
}

void addValue(V v) {
if (map.get(v.k1) == null) {
map.put(v.k1, new ConcurrentHashMap<K2, V>());
}
map.get(v.k1).put(v.k2, v);
}

void removeValue(V v) {
ConcurrentHashMap<v.k2, v> subMap = map.get(v.k1);
if (subMap != null) {
subMap.remove(v.k2); //remove from subMap but doesn't remove from map!
}
}

//also I can remove any value by K1 or K2 at any moment!
}

最佳答案

此代码受竞争条件限制。

多线程可以检测到map.get(v.k1) == null。根据执行顺序,其中一个线程可以为 k1 分配一个新的子映射,并破坏其他线程已添加其值的子映射。

ConcurrentMap 更突出的功能之一是它的 putIfAbsent() 方法。

map.putIfAbsent(v.k1, new ConcurrentHashMap<>());
map.get(v.k1).put(v.k2, v);

关于java - 使用可变键映射并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994259/

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