gpt4 book ai didi

java - 当可能在另一个线程中更新时使用 hashmap 值引用是否安全

转载 作者:行者123 更新时间:2023-11-29 04:32:32 25 4
gpt4 key购买 nike

使用getParameter是否安全

因为我可以容忍这个值不是最新的。
以及下次什么时候能拿到最新的Parameter值

这样的代码:

 public class ParameterManager {

private volatile Map<String, Parameter> scenarioParameterMap = Maps.newHashMap();

public ParameterManager(String appName) throws DarwinClientException {
}

public Parameter getParameter(String scenario) {
return scenarioParameterMap.get(scenario);
}

public void update(String scenario, Map<String, String> parameters) {
if (scenarioParameterMap.containsKey(scenario)) {
Parameter parameter = scenarioParameterMap.get(scenario);
parameter.update(parameters);
} else {
scenarioParameterMap.put(scenario, new Parameter(scenario, parameters));
}
}
}

或者更新只是使用

             scenarioParameterMap.put(scenario, new Parameter(scenario, parameters));

最佳答案

volatile 在这里根本没有帮助。它只保护 scenarioParameterMap 中的引用,而不保护该 map 的内容。由于您在任何时候都没有重新分配它以指向不同的 map ,因此 volatile 是无关紧要的。

这段代码不是线程安全的。您需要使用适当的同步,通过 synchronized 或使用 concurrent map ,或其他等效方法。

Since I can tolerate the value is not latest.

线程非安全性可能比这更危险。它可能会给你错误的结果。它可能会崩溃。您不能认为最坏的情况是数据陈旧。事实并非如此。

假设 Map.put() 正在更新 map 并且内部数据处于某种暂时无效的状态。如果 Map.get() 同时运行谁知道会出什么问题。有时,向 HashMap 中添加一个条目会导致整个事物被重新分配和重新存储。另一个线程当时读 map 会很困惑。

关于java - 当可能在另一个线程中更新时使用 hashmap 值引用是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43246310/

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