作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用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/
我是一名优秀的程序员,十分优秀!