当可能在另一个线程中更新时使用 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() 同时运行谁知道会出什么问题。有时,向哈希映射中添加一个条目会导致整个事物被重新分配和重新存储。另一个线程当时看地图会很糊涂