JVM, Java, многопоточность, создание объектов - PullRequest
0 голосов
/ 05 июня 2009

У меня странный сценарий, Существует ли вероятность того, что JVM повторно использует уже созданный объект, когда мы инициализируем новый объект, а число объектов JVm очень велико?

abc a = new abc();
a.setAttribute("aaaa");
.........
a...is no longer being used...and has not yet been garbage collected by the JVM. There are multiple threads creating 5000 instances of class abc..
again, abc a = new abc();
       Sysout(a.getAttribute()); // This prints "aaaa" set for an earlier instance! 

Есть ли вероятность повторного использования экземпляра.? Кто-нибудь сталкивался с таким сценарием раньше?

Ответы [ 6 ]

5 голосов
/ 05 июня 2009

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

4 голосов
/ 05 июня 2009

Это было бы ошибкой в ​​JVM, но я бы посчитал это маловероятным.

Я бы сказал с уверенностью 99%, что ваш код просто демонстрирует состояние гонки, например поток, отличный от того, который вы наблюдаете, устанавливая атрибут.

3 голосов
/ 05 июня 2009

JVM выполняет , а не повторное обнаружение объектов AFAIK. Но поведение, которое вы видите, можно объяснить.

a.setAttribute("aaaa"); и a.getAttribute могут задавать статическое поле, синглтон или локальный поток в другом классе, или другой поток изменяет состояние.

3 голосов
/ 05 июня 2009

Объекты не будут использоваться повторно. Вы можете проверить следующее -

  • Получаете ли вы ошибку OutOfMemoryError? Если да, программа может находиться в несовместимом состоянии
  • Вы уверены, что другие потоки не изменяют ваш объект "a"?

Примечание: обновленный ответ после того, как Гид исправил меня.

1 голос
/ 05 июня 2009

В зависимости от того, где выполняются эти назначения, ваша программа может демонстрировать переупорядочение операторов: JVM может переупорядочивать инструкции операторов присваивания, чтобы они не выполнялись в том порядке, в котором вы их кодировали. Это является частью спецификации модели памяти и может указывать на синхронизацию вашей программы.

См. FAQ по JSR133: http://www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html#reordering

или раздел 2 в: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf

Более простое объяснение начинается в 10:40 в этом видео: http://www.youtube.com/watch?v=1FX4zco0ziY

0 голосов
/ 05 июня 2009

если вы используете многопоточность, вы можете столкнуться с так называемыми устаревшими данными

некоторые объяснены в Многопоточность Java и безопасная публикация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...