【问题标题】:safe publication with final local variable object reference具有最终局部变量对象引用的安全发布
【发布时间】:2014-07-09 11:25:43
【问题描述】:

以下 Java 代码是否是线程安全的,或者是否存在可能的可见性/安全发布问题?

import java.util.ArrayList;
import java.util.List;

public class WouldThisBeSafe {

    public static void main(String[] args) throws InterruptedException {
        final List<String> result = new ArrayList<>();

        Runnable job = new Runnable() {
            @Override
            public void run() {
                result.add("Hello");
                result.add(" ");
                result.add("world!");
            }
        };

        Thread t = new Thread(job);
        t.start();
        t.join();

        System.out.println("result = " + result);
    }

}

在我的实际应用程序中,我有一个半长时间运行的任务,它需要使用多个远程方法调用从服务器加载数据,并且必须在阻塞 UI 的前台运行,同时在对话框中报告进度。为此,我使用 Eclipse/JFace 的 ProgressMonitorDialog 和匿名 IRunnableWithProgress 而不是 Runnable 来报告进度。进度监视器在后台线程(fork)中运行任务并显示进度对话框,直到线程完成。

当然,我真正的问题是我的带有 ProgressMonitorDialog 和匿名 IRunnableWithProgress 内部类的实际代码是否是线程安全的,但我怀疑它等同于上面的简化示例。

【问题讨论】:

    标签: java eclipse thread-safety jface


    【解决方案1】:

    既然你来电了

    t.join();  
    

    紧接着

    t.start();
    

    代码是完全线程安全的。唯一的问题可能是您创建了多个访问result 的线程,或者您在加入之前尝试打印result

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多