java - 这段代码多线程安全吗?

标签 java multithreading static-methods

    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/

相关文章:

Python线程,新线程卡住

java - 应用程序在被 JVM 终止之前可以生成多少个线程

java - 静态方法内存分配

java - ArrayList 困惑,单词到数字

java - 将参数添加到可运行的 jar 文件 Mac OS

java - 需要仅更新java中mongo数组中的特定元素

c++ - 多线程排挤其他进程

java - 如何在下一个方法之前显示整个 admob 影片剪辑

c# - 如何在静态方法中写入 cookie

c# - 从类调用寻呼