Использование финализации в качестве эксклюзивной блокировки - PullRequest
3 голосов
/ 16 июля 2011

Если я использую GC Stop-the-World и выполняю некоторые вещи в своем методе finalize(), могу ли я предположить, что все потоки приостановлены, и я могу делать все, что захочу, и ни один поток не осмелится бороться за ресурсы со мной, кроме GC поток?

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

Нет, на самом деле может даже быть несколько потоков финализатора, работающих одновременно.

Из спецификации языка Java «Финализаторы могут вызываться в любом порядке или даже одновременно».

2 голосов
/ 16 июля 2011

Нет, вы не можете - по крайней мере, насколько я понимаю, реализация горячей точки:

По крайней мере, так работает с mark & ​​sweep gc, но я почти уверен, что он похож на все другие реализации:

После фазы развертки каждый немаркированный завершенный объект добавляется в рабочий список с установленным битом отметки.

Затем фоновый работник прорабатывает этот список и после его завершения одним вызовом finalize очищает бит метки, чтобы он был очищен следующим GC. Вследствие этого вы не можете делать никаких предположений относительно КОГДА будет вызван метод finalize (фактически, поскольку фоновый поток, вероятно, также остановлен, вы можете быть почти уверены, что это не так, пока выполняется GC!).

Теперь это детали реализации для Hotspot и могут даже отличаться в разных реализациях GC.

...