java - 通过 final方法参数安全发布?

标签 java multithreading

Java Concurrency in Practice 描述了几种确保安全发布对象的方法,其中之一是“分配给正确构造的对象的最终字段”。我的问题是分配给 final方法参数是否足以确保安全发布。考虑以下代码:

private void collectResults() {
    runOnBackgroundThread(new Runnable() {
        public void run() {
            displayResults(someBlockingMethodCall());
        }
    });
}

private void displayResults(final List<Foo> results) {
    runOnUiThread(new Runnable() {
        public void run() {
            someUiMethodCall(results);
        }
    });
}

每个方法都将一个 Runnable 排队,以便在另一个线程上执行。 someBlockingMethodCall() 在后台线程上被调用以执行一些任务,而 someUiMethodCall() 在 UI 线程上被调用以显示结果。

如果我们假设 someBlockingMethodCall() 返回一个可变的、非同步的列表,例如 ArrayList,则对 displayResults() 的最终参数进行赋值以确保列表是否已安全发布,或者我是否需要采取额外步骤来确保安全发布?

最佳答案

其实你在这里很好。如果您编写 results,您唯一需要真正担心的时候到未同步的共享变量。

要将它交给一个线程,一般来说通常应该有一些同步。例如,如果您启动了一个线程并且 results被传递给 Runnable,start线程是您需要的同步点。

在这种情况下,您正在调用 runOnUiThread , 从您提交 results 的那一刻起就有一个同步点到线程拾取它的程度。

所以这里的提交将是线程安全的。

关于java - 通过 final方法参数安全发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137163/

相关文章:

java - 如何使用基于Spring的表单标签日期字段?

java - 测试 Spring Boot 命令行应用程序

c++ - 实例化线程而不运行它们?

Python:multiprocessing.map:如果一个进程引发异常,为什么不调用其他进程的 finally block ?

Java:当线程池中的所有线程都完成时通知主类/不同线程中的相同对象实例

c++ - CPU 松弛指令和 C++11 原语

java - 从 protected 网站导入 Java 中的 URL 图像

java - 在 xstream 解析期间删除 xml 标记?

java - IBM Message Broker Java API : java. lang.NoClassDefFoundError : com. ibm.mq.MQException

C++如何使dll从主线程修改变量?