Java Concurrency in Practice описывает несколько способов обеспечения безопасного опубликования объекта, одним из которых является «назначение конечному полю правильно построенного объекта». Мой вопрос заключается в том, достаточно ли назначения для аргумента окончательного метода для обеспечения безопасной публикации. Рассмотрим следующий код:безопасная публикация через окончательный аргумент метода?
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()
вызывается в потоке пользовательского интерфейса для отображения результатов.
Если мы предположим, что someBlockingMethodCall()
возвращает изменяемый, несинхронизированный список, например, как ArrayList, делает назначение окончательного аргумента displayResults()
гарантировать, что список благополучно опубликовано, или мне нужно принять дополнительные меры для обеспечения безопасной публикации?
Это только «конечные» поля, которые имеют значение. Для аргументов метода, а также для локальных переменных (которые в основном одинаковы) единственное, что вы получаете, это ошибка при попытке переназначить значение. – zapl