private static Map<Integer, String> map = null;
public static String getString(int parameter){
if(map == null){
map = new HashMap<Integer, String>();
//map gets filled here...
}
return map.get(parameter);
}
随着多线程的发展,该代码是否不安全?
最佳答案
如前所述,这绝对不安全。如果 map 的内容不是基于 getString() 中的参数,那么您最好将 map 初始化为静态初始化程序,如下所示:
private static final Map<Integer, String> MAP = new HashMap<Integer,String>();
static {
// Populate map here
}
上面的代码在加载类时被调用一次。它是完全线程安全的(尽管 future 对 map 的修改不是)。 您是否出于性能原因尝试延迟加载它?如果是这样,这会更安全:
private static Map<Integer, String> map = null;
public synchronized static String getString(int parameter){
if(map == null){
map = new HashMap<Integer, String>();
//map gets filled here...
}
return map.get(parameter);
}
使用 synchronized关键字将确保在任何时候只有一个线程可以执行该方法,并且始终传播对 map 引用的更改。
如果您要问这个问题,我建议您阅读“Java 并发实践”。
关于java - 这段代码多线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15234324/