Java Вопрос о GC: Как объект мог стать недостижимым, в то время как один из его методов все еще выполняется?

Я читал эти слайды о финализаторах Java. В нем автор описывает сценарий (на слайде 33) посредством чего CleanResource.finalize() мог быть выполнен потоком финализатора в то время как CleanResource.doSomething() все еще работает на другом потоке. Как это могло произойти?

Если doSomething() нестатический метод, затем для выполнения того метода кто-то, где-нибудь должен иметь сильную ссылку к нему... правильно? Таким образом, как эта ссылка могла быть убрана перед возвратами метода? Другой может распараллелить налет в и пустой указатель та ссылка? Если это произошло, будет doSomething() все еще возвращайтесь обычно на исходном потоке?

Это - все, что я действительно хочу знать, но для действительно above-beyond ответ, можно сказать мне почему doSomething() на слайде 38 лучше, чем doSomething() на слайде 29. Почему достаточно просто вызвать это keepAlive() метод? Не был бы необходимо перенести целый вызов к myImpl.doSomething() в a synchronized(this){} блок?

6
задан Neil Traft 29 July 2010 в 13:39
поделиться