Рассмотрим следующий класс Java:
class X {
public void foo() {
bar = 1;
}
protected void finalize() {
if (bar == 1)
baz();
}
private int bar = 0;
}
Если предположить, что X.foo()
никогда не вызывается из какого-либо метода finalize()
(прямо или косвенно), могу ли я быть уверен, что приведенный выше код свободен от гонок данных, то есть могу ли я быть уверен, что X.finalize()
видит значение, записанное X.foo()
в каждом случай, когда X.foo()
действительно называется?
Наивный анализ сказал бы, что X.finalize()
не может работать одновременно с X.foo()
(из-за упомянутого предположения), поэтому дополнительная синхронизация не требуется.
Я бы предположил, что приведенный выше код свободен от гонок данных, но меня беспокоит, что спецификация языка содержит следующий явный оператор в §17.4.5, но ничего не говорит о взаимосвязи между finalize() и методами в целом:
Существует край «происходит до» от конца конструктора объекта до начала финализатора (§12.6) для этого объекта.
EDIT: я вижу необходимость уточнить свой вопрос, поэтому вот попытка точной переформулировки вопроса:
Гарантирует ли Java отношение происходит до между определенными методами X.foo()
и X.finalize()
, если я гарантирую, что X.foo()
никогда не вызывается (прямо или косвенно) из какого-либо метода finalize()
? Здесь случается-до следует интерпретировать точно так, как определено в §17.4.5.
if
? В общем случае этот код может снова вернуть объект в область видимости, что может означать, что другие потоки снова получат к нему доступ. Но я совершенно уверен в этом; Мне очень интересно узнать, сможет ли кто-нибудь подтвердить или опровергнуть мой комментарий. - person Viktor Seifert   schedule 12.12.2013X.finalize()
содержит код, который воскрешает экземпляр, мне не интересен (потому что я контролирую эту часть кода и знаю, что ничего не воскрешаю). Однако кажется, что воскресение может произойти и другими способами, которые я не могу контролировать. Например, приложение может иметь финализатор, который воскрешает экземплярX
. - person Kristian Spangsege   schedule 12.12.2013