| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > передача статических значений обновленному объекту |
| Автор: _Y_ 9.10.2008, 10:56 | ||
Имеем такой код:
Других объектов класса MyObject не создается. По моим представленям у новый объкт myObject получит уже присвоенные значения статических переменных т.к. должен быть создан объект (правая сторона оператора №5), а уже потом заменена ссылка на старый объект (само присвоение). Хотелось бы узнать прав ли я. Если не прав - легко нарваться на мерцающую ошибку. Типа успел garbage collector - не успел garbage collector. |
| Автор: SaSho 9.10.2008, 11:45 |
| Начнём с того, что значения статических переменных "получит" не объект myObject, а класс MyObject, статические переменные - это переменные класса, а не конкретного экземпляра, их значения в каждый момент времени одинаковы для всех объектов класса. Т.о. эти значения будут одинаковы для всех экземпляров класса MyObject - и для созданного в строке 1, и в строке 5. Вот только какие это значения присваиваются статическим переменным? Возможно, следует обойтись без них? |
| Автор: Dummy 9.10.2008, 12:51 |
| Никакого мерцания со статическими переменными не будет. Статические переменные могут сбросить присвоенные им в значения только при выгрузке и повторной загрузке класса, но согласно JLS, класс не выгружается, пока достижим его загрузчик, читай - пока достижим хотя бы один из загруженных этим загрузчиком классов. В твоем случае - пока в программе будет достижимая ссылка на MyObject, за статические поля можно не беспокоиться. |
| Автор: _Y_ 9.10.2008, 18:56 |
| SaSho, не могу не съязвить. Dummy, это понятно. Вопрос в том и заключается - а не производит ли JVM такое присвоение по какому-нибудь своему разумению; т.е. не может ли получиться, что в какой-то физический момент выполнения опрератора №5 ни старый, ни новый объект не будет достижим? |
| Автор: Dummy 9.10.2008, 22:44 | ||
Верно. И обратного я не утверждал. Наверное, объяснил невнятно... Попробую изложить по порядку, как я понимаю суть проблемы. Вопрос Не может ли сложиться такая ситуация, что в промежутке времени, когда ссылка на объект некоего класса MyObject не указывает ни на какой объект класса MyObject, JVM просто выгружает класс MyObject, в результате чего значения статических полей при повторной загрузке класса сбрасывается в значения по умолчанию. Ответ (общий) Нет, такая ситуация невозможна, так как, из Java Language Specification (гл.12.7) и Java Virtual Machine Specification (гл. 2.17.8) следует, что класс может быть выгружен тогда и только тогда, когда становится недостижимым объект ClassLoader, которым этот класс был загружен. Это возможно только в том случае, когда недостижимыми станут ВСЕ классы, загруженные с помощью данного ClassLoader. При выполнении этих условий выгрузка класса может произойти только в тот момент, когда в программном коде просто не останется достижимых мест, откуда можно было бы взять значение, например, статической переменной этого класса. Пример Для простоты предположим, что MyObject - это единственный класс, загруженный с помощью данного ClassLoader. Тогда класс MyObject можно выгрузить в следующем случае:
Но так как до конца объяснения выше немногие cмогут бодрствовать, я привел Ответ (частный) В приведенном примере выгрузка невозможна хотя бы по той простой причине, что в течение всего исполнения этого кода существуетпеременная-ссылка типа MyObject , а это означает, что класс MyObject достижим. |
| Автор: _Y_ 10.10.2008, 07:50 |
| Dummy, спасибо. Теперь все ясно. |
| Автор: Dims 10.10.2008, 12:12 | ||||
Вопрос понятен, но его возникновение, по-моему мнению, означает либо незнание свойств статических полей, либо то, что вопрос был задан поздно ночью в состоянии переутомления и переработки
На мой взгляд, это, хоть и интересный, но излишне сложный ответ для данного случая. Даже не зная ничего ни про какие класслоадеры, просто из практики использования статических объектов, ясно, что они никуда не пропадают вне зависимости от того, существуют или нет экземпляры классов. Например, мы используем объект System.out и никогда не заботимся о том, чтобы существовали объекты типа System. Точно так же мы используем методы и поля внутри Math. И никогда никакие статические члены никуда не пропадали. |
| Автор: Dummy 10.10.2008, 12:48 | ||||
Да, общий ответ заморочен и для такого простого случая достаточно частных пояснений, хотя замечу, что доказательство вида "сто раз пробовали и ничего никуда не пропадало" пытливый ум не устроят (вдруг на 101-й раз не сработает), в идеале хочется дедуктивного объяснения, почему так
Почему же. Может быть, приведенный пример действительно не самый удачный, но суть вопроса может быть интересна любителям покопать JVM внутрь _Y_, закрой, пожалуйста, тему, если тебя устраивает полученный ответ. |
| Автор: Dims 10.10.2008, 18:57 |
Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? Почему не предположить, например, что когда нет ни одного объекта, то уничтожается вообще вся виртуальная машина? Или не перегружается компьютер? А вдруг, пока значение вычислено, но ещё не заложено в переменную, может Вселенная схлопнуться? |
| Автор: _Y_ 10.10.2008, 19:50 | ||
Честно говоря, из опыта работы с другими языками. |
| Автор: Dims 10.10.2008, 19:53 |
| О! А с какими, если не секрет? Интересуюсь сравнением различных языков... |
| Автор: Dummy 10.10.2008, 21:47 | ||
Выгрузка классов - одна из функций JVM по сокращению объема используемой ей памяти. Читали те документы, на которые я указал? И хоть про коллапс Вселенной там ни слова, такое действие, как выгрузка классов, там описано. В том числе описаны правила, которым должна подчиняться выгрузка, чтобы избежать проблем, которые волнуют автора топика. |