以下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内部类是否是线程安全的,但我怀疑它与上面的简化示例相同。
答案 0 :(得分:1)
因为你打电话
t.join();
后立即
t.start();
代码完全是线程安全的。唯一的问题可能是您创建了多个访问result
的线程,或者您是否曾尝试在加入前打印result
。