带有最终局部变量对象引用的安全发布



下面的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内部类的实际代码是否是线程安全的,但我怀疑它相当于上面的简化示例。

由于您调用

t.join();  

之后立即

t.start();

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

最新更新