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 класс статичен, он будет оставаться в памяти до выхода из программы.

Другие вопросы по тегам