Java статические экземпляры и ссылки
У меня есть синглтон-класс. Есть еще один класс, который использует экземпляр Singleton. Как ниже:
class A {
SingletonDemo obj = SingletonDemo.getInstance() ;
.
.
.
}
Теперь я знаю, что время жизни экземпляра SingletonDemo внутри класса SingletonDemo соответствует времени жизни программы.
Но как насчет времени жизни объекта в классе А? Будет ли сборка мусора, когда управление выйдет из класса А, или оно будет жить всю жизнь всей программы?
4 ответа
- В спецификации Java говорится, что область действия
obj in class A
это все телоA
:
Область объявления члена m, объявленного или унаследованного типом класса C (§8.1.6), является всем телом C, включая любые вложенные объявления типов. См. JLS 6.3
Это означает, что ссылка obj
будет мусор, если контроль выходит из класса A
,
- Будет ли экземпляр Singleton жить в течение жизни программы или не зависит от того, используется ли он (имеет ссылку) или нет. Он может быть выгружен, если на него больше не будут ссылаться. Вот что сказано в спецификации:
Реализация языка программирования Java может выгружать классы. Класс или интерфейс могут быть выгружены, если и только если их определяющий загрузчик класса может быть восстановлен сборщиком мусора, как обсуждалось в §12.6. См. Разгрузка Классов и Интерфейсов
Если я правильно понял, класс-одиночка означает, что во всем приложении есть только один экземпляр, но это не значит, что он будет доступен для жизни приложения, если на него вообще нет ссылок.
Теперь я знаю, что время жизни экземпляра SingletonDemo внутри класса SingletonDemo соответствует времени жизни программы.
Эта часть вашего вопроса является ответом.
Поскольку следующая строка не создает новый объект, она просто создает свойство ссылки class A
который ссылается на объект SingleTon.
SingletonDemo obj = SingletonDemo.getInstance() ;
Так obj
не влияет на время жизни SingleTon.
Ты можешь представить A.obj
как часть памяти - часть памяти, содержащая экземпляр класса A
- это содержит ссылку на SingletonDemo
пример.
obj
сам по себе нельзя собирать мусор; SingletonDemo
Экземпляр, на который он указывает, может быть собран мусором, когда на него больше нет живой сильной ссылки (то есть, никогда на Синглтон).
Когда экземпляр класса A
мусор, память, хранящая obj
ссылка отбрасывается.
obj
это только ссылка на тот же статический экземпляр внутри SingletonDemo
учебный класс. Только когда обе ссылки больше не доступны, объект будет собирать мусор. И так как ссылка внутри SingletonDemo
класс статичен, он будет оставаться в памяти до выхода из программы.