gpt4 book ai didi

java - 对多个对象的并发更新

转载 作者:行者123 更新时间:2023-12-01 08:58:37 24 4
gpt4 key购买 nike

我是 Java 并发方面的新手,我有一个类保存数据(在下面的示例代码中为 double ),应该使用 get(如 Map)来访问该数据,但出于性能原因,将数据存储在内部数组中。

它在多线程环境中运行,并且该索引有时必须更新。

public class ConcurrencySampleCode {

private static Object lock = new Object();

private Map<String, Integer> map = ...
private double[] array = ...

public Double get(String id) {
synchronized (lock) {
Integer i = map.get(id);
if (i == null) {
return null;
}
return array[i];
}
}

public void update() {
Map<String, Integer> tmpMap = updateMap(...);
double[] tmpArray = updateArray(...);
synchronized (lock) { // should be atomic
map = tmpMap;
array = tmpArray;
}
}

}

不知道这段代码是否正确?另外,get函数中需要synchronized关键字吗?

有更好的方法吗?

感谢您的帮助

最佳答案

您的代码没有任何问题,但您需要使用 volatile map 和数组上的关键字,以确保所有线程立即看到更新的值,并且我不确定您是否希望锁是静态的。

作为替代方案,您可能需要查看 java.util.concurrent.atomic包裹。它有一些方便的线程安全变量。例如,您可以将映射和数组移动到它们自己的类中,然后使用 AtomicReference 来存储对象。

public class ConcurrencySampleCode {

private AtomicReference<DoubleMap> atomicMap = new AtomicReference(new DoubleMap());

//Inner class used to hold the map and array pair
public class DoubleMap {
private Map<String, Integer> map = ...
private double[] array = ...
}

public Double get(String id) {
DoubleMap map = atomicMap.get();
...
}

public void update() {
Map<String, Integer> tmpMap = updateMap(...);
double[] tmpArray = updateArray(...);
DoubleMap newMap = new DoubleMap(tmpMap, tmpArray);
atomicMap.set(newMap);
}

}

关于java - 对多个对象的并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875147/

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