Объект перестанет существовать, когда на него больше не будет сильных корневых ссылок; в большинстве случаев это именно то, что должно произойти. Однако в некоторых случаях объект будет просить внешний объект сделать что-то от его имени, возможно, в ущерб другим объектам, в обмен на обещание сообщить этому другому объекту, когда его услуги больше не требуются. Например, объект «Файл» может запросить у ОС монопольный доступ к файлу; пока ОС не будет сообщено, что такой доступ больше не требуется, она будет блокировать возможность использования этого файла всеми остальными.
Если бы объект, давший такое обещание, был оставлен и просто прекратил бы свое существование, внешний объект продолжал бы делать то, о чем его просили, в ущерб всем остальным, даже если бы его действия больше не приносили никакой пользы. любой. Чтобы избежать этой ситуации, Java позволяет объектам запрашивать уведомление, когда GC замечает, что они кажутся заброшенными. Такие уведомления будут даны (т.е. Finalize
будет вызываться для таких объектов) до того, как объекты перестанут существовать, но кроме этого нет реальной гарантии своевременности. Завершенный объект может затем уведомить всех без исключения субъектов, действующих от его имени, о том, что они должны прекратить это делать.
Создатели Java, возможно, ожидали, что финализаторы будут основным механизмом, с помощью которого объекты могут уведомлять внешние сущности о том, что их службы больше не требуются, но на самом деле финализаторы работают не очень хорошо. Другие механизмы, такие как AutoCloseable
или PhantomReference
, во многих случаях лучше.
person
supercat
schedule
15.10.2014