Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > передача статических значений обновленному объекту


Автор: _Y_ 9.10.2008, 10:56
Имеем такой код:
Код

MyObject myObject = new MyObject();
.................. 
//Делаем что-то с myObject, что присваивает значения статическим переменным класса MyObject 
.....
myObject = new MyObject();

Других объектов класса 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, не могу не съязвить. smile  Как Вы думаете, человек не знающий того, что Вы написали задал бы такой вопрос?

Dummy, это понятно. Вопрос в том и заключается - а не производит ли JVM такое присвоение по какому-нибудь своему разумению; т.е. не может ли получиться, что в какой-то физический момент выполнения опрератора №5 ни старый, ни новый объект не будет достижим?

Автор: Dims 9.10.2008, 19:54
Цитата(_Y_ @  9.10.2008,  18:56 Найти цитируемый пост)
Как Вы думаете, человек не знающий того, что Вы написали задал бы такой вопрос?

Я тоже не понимаю смысла вопроса, если предположить, что человек знает про статические члены.

Цитата(Dummy @  9.10.2008,  12:51 Найти цитируемый пост)
В твоем случае - пока в программе будет достижимая ссылка на MyObject, за статические поля можно не беспокоиться.  

Что имеется в виду? Никаких ссылок на ОБЪЕКТЫ типа MyObject в программе может вообще не быть, а статические переменные всё равно будут доступны и никуда не будут пропадать.

Можно создать класс, в котором либо нет конструктора, либо он приватный, то есть, чтобы создавать его объекты было в принципе невозможно. И всё равно в таком классе можно завести статические члены, которыми можно будет пользоваться.

Автор: Dummy 9.10.2008, 22:44
Цитата(Dims @  9.10.2008,  19:54 Найти цитируемый пост)
Что имеется в виду? Никаких ссылок на ОБЪЕКТЫ типа MyObject в программе может вообще не быть, а статические переменные всё равно будут доступны и никуда не будут пропадать.

Можно создать класс, в котором либо нет конструктора, либо он приватный, то есть, чтобы создавать его объекты было в принципе невозможно. И всё равно в таком классе можно завести статические члены, которыми можно будет пользоваться. 

Верно. И обратного я не утверждал. Наверное, объяснил невнятно... Попробую изложить по порядку, как я понимаю суть проблемы.

Вопрос Не может ли сложиться такая ситуация, что в промежутке времени, когда ссылка на объект некоего класса MyObject не указывает ни на какой объект класса MyObject, JVM просто выгружает класс MyObject, в результате чего значения статических полей при повторной загрузке класса сбрасывается в значения по умолчанию.

Ответ (общий) Нет, такая ситуация невозможна, так как, из Java Language Specification (гл.12.7) и Java Virtual Machine Specification (гл. 2.17.8) следует, что класс может быть выгружен тогда и только тогда, когда становится недостижимым объект ClassLoader, которым этот класс был загружен. Это возможно только в том случае, когда недостижимыми станут ВСЕ классы, загруженные с помощью данного ClassLoader.

При выполнении этих условий выгрузка класса может произойти только в тот момент, когда в программном коде просто не останется достижимых мест, откуда можно было бы взять значение, например, статической переменной этого класса.

Пример Для простоты предположим, что MyObject - это единственный класс, загруженный с помощью данного ClassLoader. Тогда класс MyObject можно выгрузить в следующем случае:
  • не существует достижимых инстансов класса MyObject.
  • не существует других загруженных классов или достижимых объектов, которые бы хотя бы гипотетически использовали структуру класса MyObject каким-бы то ни было (ссылались на статические поля, статические функции или содержали ссылку типа MyObject).

Но так как до конца объяснения выше немногие cмогут бодрствовать, я привел

Ответ (частный) В приведенном примере выгрузка невозможна хотя бы по той простой причине, что в течение всего исполнения этого кода существуетпеременная-ссылка типа MyObject , а это означает, что класс MyObject достижим.


Автор: _Y_ 10.10.2008, 07:50
Dummy, спасибо. Теперь все ясно.

Автор: Dims 10.10.2008, 12:12
Цитата(Dummy @  9.10.2008,  22:44 Найти цитируемый пост)
Не может ли сложиться такая ситуация, что в промежутке времени, когда ссылка на объект некоего класса MyObject не указывает ни на какой объект класса MyObject

Вопрос понятен, но его возникновение, по-моему мнению, означает либо незнание свойств статических полей, либо то, что вопрос был задан поздно ночью в состоянии переутомления и переработки smile

Цитата(Dummy @  9.10.2008,  22:44 Найти цитируемый пост)
Нет, такая ситуация невозможна, так как, из Java Language Specification (гл.12.7) и Java Virtual Machine Specification (гл. 2.17.8) следует, что класс может быть выгружен тогда и только тогда, когда становится недостижимым объект ClassLoader

На мой взгляд, это, хоть и интересный, но излишне сложный ответ для данного случая. Даже не зная ничего ни про какие класслоадеры, просто из практики использования статических объектов, ясно, что они никуда не пропадают вне зависимости от того, существуют или нет экземпляры классов.

Например, мы используем объект System.out и никогда не заботимся о том, чтобы существовали объекты типа System. Точно так же мы используем методы и поля внутри Math. И никогда никакие статические члены никуда не пропадали.

Автор: Dummy 10.10.2008, 12:48
Цитата(Dims @  10.10.2008,  12:12 Найти цитируемый пост)
На мой взгляд, это, хоть и интересный, но излишне сложный ответ 
для данного случая.

Да, общий ответ заморочен и для такого простого случая достаточно частных пояснений, хотя замечу, что доказательство вида "сто раз пробовали и ничего никуда не пропадало" пытливый ум не устроят (вдруг на 101-й раз не сработает), в идеале хочется дедуктивного объяснения, почему такsmile.
Цитата(Dims @  10.10.2008,  12:12 Найти цитируемый пост)
Вопрос понятен, но его возникновение, по-моему мнению, означает либо незнание свойств статических полей, либо то, что вопрос был задан поздно ночью в состоянии переутомления и переработки smile

Почему же. Может быть, приведенный пример действительно не самый удачный, но суть вопроса может быть интересна любителям покопать JVM внутрьsmile 

_Y_, закрой, пожалуйста, тему, если тебя устраивает полученный ответ.

Автор: Dims 10.10.2008, 18:57
Цитата(Dummy @  10.10.2008,  12:48 Найти цитируемый пост)
в идеале хочется дедуктивного объяснения, почему так

Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? smile

Почему не предположить, например, что когда нет ни одного объекта, то уничтожается вообще вся виртуальная машина? Или не перегружается компьютер? А вдруг, пока значение вычислено, но ещё не заложено в переменную, может Вселенная схлопнуться? smile

Автор: _Y_ 10.10.2008, 19:50
Цитата(Dims @ 10.10.2008,  18:57)
Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? smile

Честно говоря, из опыта работы с другими языками.

Автор: Dims 10.10.2008, 19:53
О! А с какими, если не секрет? Интересуюсь сравнением различных языков...

Автор: Dummy 10.10.2008, 21:47
Цитата(Dims @  10.10.2008,  18:57 Найти цитируемый пост)
Всё-таки непонятно, откуда взялась мысль, что класс может быть уничтожен если нет ни одного объекта, принадлежащего к нему? smile

Выгрузка классов - одна из функций JVM по сокращению объема используемой ей памяти. Читали те документы, на которые я указал? И хоть про коллапс Вселенной там ни слова, такое действие, как выгрузка классов, там описано. В том числе описаны правила, которым должна подчиняться выгрузка, чтобы избежать проблем, которые волнуют автора топика.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)