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/