Ожидает ли сборщик мусора выполнения финализатора на этом объекте, прежде чем собирать его?
Ваш вопрос немного двусмысленный.
Когда GC встречает«мертвый» объект, который нуждается в доработке, отказывается от попытки вернуть хранилище мертвого объекта.Вместо этого он помещает объект в очередь «объектов, которые, я знаю, нуждаются в финализации», и рассматривает этот объект как живой, пока с ним не завершится поток финализатора.
Итак, да,GC «ждет», пока не будет выполнен финализатор, прежде чем вернуть хранилище.Но это не ждет синхронно .Похоже, вы спрашиваете "GC синхронно вызывает финализатор прямо там?"Нет, он ставит в очередь объект, который будет завершен позже, и продолжает работу.GC хочет быстро справиться с задачей освобождения мусора и сжатия памяти, чтобы программа могла возобновить работу как можно скорее.Это не остановится, чтобы иметь дело с каким-то плаксивым объектом, который требует внимания, прежде чем он будет очищен.Он помещает этот объект в очередь и говорит: «Будьте спокойны, и поток финализатора будет иметь дело с вами позже».
Позже GC снова проверит объект и скажет: "Вы все еще мертвы? И ваш финализатор запущен?"Если ответ «да», то объект восстанавливается.(Помните, что финализатор может превратить мертвый объект обратно в живой; постарайтесь никогда этого не делать. В результате ничего приятного не происходит.)
Отключает ли он потоки, пока финализатор ещевыполняется?
Я полагаю, что сборщик мусора размораживает потоки, которые он заморозил, и сигнализирует потоку финализатора «эй, у вас есть работа, которую нужно сделать».Поэтому, когда поток финализатора начинает работать, потоки, которые были заморожены GC, запускаются снова.
Возможно, должны быть незамерзшие потоки, потому что финализатор может потребовать, чтобы вызов был перенаправлен в пользовательский поток в порядкеосвободить ресурс, привязанный к потоку.Конечно, некоторые из этих пользовательских потоков могут быть заблокированы или заморожены;потоки всегда могут быть заблокированы чем-то.
что произойдет, если финализатор столкнется с блокировкой, удерживаемой одним из приостановленных потоков?Зависит ли финализатор от тупиковой ситуации?
Вы делаете ставку.В потоке финализатора нет ничего волшебного, что препятствует его блокировке.Если пользовательский поток ожидает блокировки, снятой потоком финализатора, а поток финализатора ожидает блокировки, снятой пользовательским потоком, то у вас есть тупик.
Примеры потока финализаторатупиков предостаточно.Вот хорошая статья об одном таком сценарии с кучей ссылок на другие сценарии:
http://blogs.microsoft.co.il/blogs/sasha/archive/2010/06/30/sta-objects-and-the-finalizer-thread-tale-of-a-deadlock.aspx
Как говорится в статье: финализаторы - чрезвычайно сложный и опасный механизм очисткии вам следует избегать их, если вы можете .Невероятно легко ошибиться в финализаторе, и очень трудно понять, что правильно.