2009-06-05 16 views
0

Я встречаюсь с странным сценарием, Есть ли возможность JVM повторно использовать уже созданный объект, когда мы инициализируем новый, а количество объектов JVm очень велико?JVM, Java, многопоточность, создание объекта

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! 

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

+1

Можем ли мы видеть больше кода ? Является локальной переменной или полем? Как выглядит setAttribute и getAttribute? (Как подпись метода, содержимое и как он хранится (объявление поля). – Yishai

ответ

5

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

+0

может быть, это то, что я тестирую прямо сейчас! – hakish

4

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

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

3

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

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

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

+0

экземпляр a создается каждый раз в потоке! – hakish

+0

Заметьте, что утверждение JVM может находиться в несогласованном состоянии ', ваша программа может находиться в противоречивом состоянии, но состояние JVM должно быть очень хорошим. –

+0

@gid: Спасибо, что указали, что это то, что я имел в виду изначально. – talonx

3

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

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

+0

его не статический или одноэлементный объект. – hakish

0

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

некоторые из них описаны в Java multi-threading & Safe Publication

1

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

Смотрите JSR133 FAQ: 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