当可能在另一个线程中更新时使用 hashmap 值引用是否安全
Is it safe to use hashmap value reference when it may be updated in another thread
使用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
中的引用,不保护该地图的内容。由于您在任何时候都没有重新分配它以指向不同的地图,因此 volatile
是无关紧要的。
这段代码不是线程安全的。您需要使用适当的同步,通过 synchronized
,或使用 concurrent map,或其他等效方法。
Since I can tolerate the value is not latest.
线程非安全性可能比这更危险。它可能会给你错误的结果。它可能会崩溃。您不能认为最坏的情况是数据陈旧。不是这样的。
假设 Map.put()
正在更新地图并且内部数据处于某种暂时无效的状态。如果 Map.get()
同时运行谁知道会出什么问题。有时,向哈希映射中添加一个条目会导致整个事物被重新分配和重新存储。另一个线程当时看地图会很糊涂
使用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
中的引用,不保护该地图的内容。由于您在任何时候都没有重新分配它以指向不同的地图,因此 volatile
是无关紧要的。
这段代码不是线程安全的。您需要使用适当的同步,通过 synchronized
,或使用 concurrent map,或其他等效方法。
Since I can tolerate the value is not latest.
线程非安全性可能比这更危险。它可能会给你错误的结果。它可能会崩溃。您不能认为最坏的情况是数据陈旧。不是这样的。
假设 Map.put()
正在更新地图并且内部数据处于某种暂时无效的状态。如果 Map.get()
同时运行谁知道会出什么问题。有时,向哈希映射中添加一个条目会导致整个事物被重新分配和重新存储。另一个线程当时看地图会很糊涂