【发布时间】:2020-02-01 12:59:42
【问题描述】:
我试图了解以下代码是否是线程安全的。我在 SO 中经历了很多很多问题,但似乎找不到明确的答案。
class Car {
public static Map<String, String> features = new HashMap<>();
static {
features.put("color", "red");
features.put("foo", "bar");
}
public Comparable<?> getValue(String id) {
if(!features.containsKey(id)) {
features.put(id, id);
}
String res = features.get(id);
// some business logic and return stmt.
}
}
我们最近在我们的应用程序中遇到了意外行为,其中getValue("color") 返回的值为空。我一直无法重现这个问题,但它似乎是在同时处理两个线程时发生的。
-
features映射仅在getValue方法中修改,前提是该参数在映射中尚不可用。 - 静态块中用于初始化地图的参数出现问题。
- 用例示例 -
Car c = new Car(); c.getValue("color");
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
请贴出方法的逻辑。我相信问题就在那里,因为静态块是在应用程序开始时初始化的。
-
@Steyrix - 更新了方法定义。
-
@Eng.Fouad - 谢谢!我将进一步探索这个选项。
标签: java multithreading static thread-safety