2009-02-16 3 views
9

Java memory model дает понять, что можно и не может предположить, как потоки взаимодействуют через память. Например, если один поток записывает новое значение в поле без соответствующей синхронизации, новое значение не гарантируется для наблюдения другими потоками. На практике, однако, другие потоки могли бы хоть как-то считывать новое значение, несмотря на неадекватную синхронизацию, в зависимости от времени между записью и чтением, аппаратной архитектурой и т. Д.Есть ли реализация JVM в худшем случае?

Это может привести к ошибкам, которые трудно обнаружить и трудно воспроизвести , Поэтому было бы полезно запустить java-приложение в JVM наихудшего случая, который абсолютно не синхронизировал память между потоками за пределами гарантий в Java memory model. Существует ли такая реализация JVM наихудшего случая?

+0

Я думал, что солнце написало это. – GEOCHET

+0

Я думал, что это Microsoft J ++. –

+3

Вы оба думаете, что вы смешны, но оба говорят положительные вещи о Sun и Microsoft вместо негативных. Было бы лучше, если бы JVM всегда показывал худший результат из модели памяти, так как это выявило бы большинство ошибок, но это не тот случай, когда большинство этих ошибок скрыты. – Pyrolistical

ответ

2

Чтобы сгруппировать свою программу, вы можете использовать Terracotta. Это невероятно неумолимо вокруг неправильной синхронизации (что станет очевидным даже с одним узлом в кластере). Это большой вопрос: Я часто хотел именно эту способность - Я удивлен, что это не переключатель в стандартной JRE -XXJMMExtreme

Terracotta является открытым и свободным для основного продукта.

0

Я не знаю ни одной виртуальной машины, которая гарантирует поведение худшего случая все время, и это, похоже, то, о чем вы просите. Ситуация, которую вы описываете, может возникать с виртуальными машинами Sun (как и многие другие), но только из-за проблем с кешированием. Я не знаком с виртуальной машиной, которая намеренно делает это все время.

0

Есть много способов, которые могли бы вызвать параллелизм ошибку.

  • Загрузите ваше приложение на многие другие темы, чем вы обычно ожидали. Убедитесь, что этого более чем достаточно, чтобы получить 99% + процессор.
  • Запустите программу с включенным профилировщиком или отключен JIT. Это изменяет временное поведение вашего приложения.
  • Испытание как Java 5, так и Java 6 (Это часто самый простой и лучший способ найти несколько ошибок) Я не нашел ошибку с использованием Java 7, которая не отображалась в 5/6.

Для худшего случая JVM попробуйте использовать мобильный телефон. (Ваше приложение, вероятно, вообще не работает);)

0

Ошибки синхронизации обычно трудно воспроизвести, поскольку они зависят от тонких таймингов между различными потоками, поэтому реализация, которая фактически пытается «просто запустить вашу программу», всегда может быть «наихудший вариант». Вы не можете воспроизвести несколько разных способов, чтобы два потока могли чередовать свои инструкции, если вы просто выполняете эти инструкции один раз. Тестирование всех таких комбинаций за один проход еще менее возможно. Один из других плакатов предложил Java Pathfinder, и это звучит неплохо - но обратите внимание, что это приложение, которое работает с одним и тем же кодом много раз, поэтому вы действительно не можете рассматривать это как еще одну реализацию JVM.

Еще один практический совет - попытаться запустить приложение на как можно большем количестве различных JVM. Попробуйте разные поставщики, разные версии от одного и того же производителя, разные архитектуры процессора и так далее. Несколько лет назад у меня был опыт работы с многопоточным приложением, которое было разработано, протестировано и запущено на JVM Sun на процессорах Xeon, где он работал очень хорошо. В какой-то момент я попытался запустить его на IBM J9 Java Virtual Machine on POWER Architecture, и с первой попытки около 2/3 тестов не удалось из-за ошибок синхронизации.Таким образом, тестирование в разных средах может быть весьма полезным при раскрытии скрытых проблем синхронизации.

Смежные вопросы