Я читал эти слайды о финализаторах Java. В нем автор описывает сценарий (на слайде 33) посредством чего CleanResource.finalize()
мог быть выполнен потоком финализатора в то время как CleanResource.doSomething()
все еще работает на другом потоке. Как это могло произойти?
Если doSomething()
нестатический метод, затем для выполнения того метода кто-то, где-нибудь должен иметь сильную ссылку к нему... правильно? Таким образом, как эта ссылка могла быть убрана перед возвратами метода? Другой может распараллелить налет в и пустой указатель та ссылка? Если это произошло, будет doSomething()
все еще возвращайтесь обычно на исходном потоке?
Это - все, что я действительно хочу знать, но для действительно above-beyond ответ, можно сказать мне почему doSomething()
на слайде 38 лучше, чем doSomething()
на слайде 29. Почему достаточно просто вызвать это keepAlive()
метод? Не был бы необходимо перенести целый вызов к myImpl.doSomething()
в a synchronized(this){}
блок?