java - 我可以初始化一个静态成员并跨线程共享吗?

标签 java multithreading concurrency static

这是我第一次尝试编写使用多线程的程序,所以我有几个关于在我的程序中使用并发的问题。

我的程序从网络用户界面获取用户输入,然后根据该用户输入启动一个进程。我知道我必须使用并发,因为这个过程需要一个多小时,而且我不可能让用户在开始下一个过程之前等待一个过程完成。

以下简化代码处理用户输入,然后启动流程。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String myInput = request.getParameter("input");
    Thread t = new Thread(new MyRunnable(myInput));
    t.start();

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("Process started!");
    out.close();
}

下面的代码是我实际过程的简化。

public class MyRunnable implements Runnable {

    private static HashMap<String,String> mapOfConstants = null;

    private String member;

    public MyRunnable(String member) {
        this.member = member;
    }

    @Override
    public void run() {
        if (mapOfConstants == null) init();
        // and so on...
    }

    private void init() {
        mapOfConstants = new HashMap<String,String>();
        mapOfConstants.put("LOCATION", "http://localhost/folder");
        // and so on...
    }

}

在我上面的代码中,我打算将一系列占位符定义为常量,这些占位符将存储在 HashMap mapOfConstants 中。

编辑: 最终我可能想让这个 map 的初始化从其他地方获取值,比如一个文本文件。

我的代码是否实现了在 MyRunnable 的所有实例之间共享此占位符映射的目的,仅执行此初始化过程一次?

最佳答案

如果您想在所有用户之间共享常量,那么您就走在正确的道路上但是您必须同步您的代码。

同步代码的最简单方法是编写

public synchronized void run() {
}

请阅读一些关于在 Java 中进行同步的教程,因为这是 Java 中的一个雷区,即使是经验丰富的开发人员有时也会遇到问题。

对于你的第二个问题:请重新写一个。

关于java - 我可以初始化一个静态成员并跨线程共享吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17421893/

相关文章:

r - 为什么foreach%dopar%随每个其他节点变慢?

java - ReentrantLock 未显示预期结果

java - 在 OnTouch 中更改页面

java - 关于在 Java 中使用递归计算元音的说明

ios - 平行打印后保证打印顺序

concurrency - 为什么在同一个 goroutine 中使用无缓冲 channel 会导致死锁?

python - 循环内循环并发

java - 我的 JAVA_OPTS 设置没问题吗?

java - Android 过去相对于现在的时间,以毫秒为单位

java - 如何扩展 Hibernate Reader?