Ищете удивительную параллельную Java-программу - PullRequest
17 голосов
/ 12 июня 2011

Поскольку я пишу профилировщик с акцентом на параллелизм аспектах, я ищу хороший искусственный пример использования механизмов синхронизации в Java .Мой профилировщик делает видимыми некоторые действия, связанные с многопоточностью;например:

  • вызов notify / wait
  • поток изменяет свое состояние
  • поток конкурирует с другим потоком для блокировки монитора
  • aБлокировка монитора была получена потоком после состязания за него с другим
  • измерением времени выполнения каждого метода
  • , какой поток получил доступ к определенному методу и как часто
  • и т. д..

Итак, что я ищу, так это Java-программу, которая кажется понятной с первого взгляда 1028 *, но при ее выполнении вы начинаете задумываться о результатах.Я надеюсь, что мой профилировщик сможет определить, что происходит в фоновом режиме.


Чтобы прояснить ситуацию, я привожу вам пример, книга «Параллельность Java на практике» Брайана Гетца дает «токсичный» кодпримеры, которые используются для изучения.

@NotThreadSafe
public class ListHelper<E> {
    public List<E> list =
        Collections.synchronizedList(new ArrayList<E>());
    ...
    public synchronized boolean putIfAbsent(E x) {
        boolean absent = !list.contains(x);
        if (absent)
            list.add(x);
        return absent;
    }
}

Это предназначено, чтобы быть расширением потока-безопасного класса, методом putIfAbsent.Поскольку list синхронизируется, но putIfAbsent использует другую блокировку для защиты состояния в качестве методов, определенных в списке.

Профилировщик может отображать использованные блокировки монитора и к удивлению пользователя (или нет)....) пользователь увидит, что вместо одной возможны две блокировки монитора.

Мне не очень нравится этот пример, но я бы не стал спрашивать, если бы у меня уже было несколько хороших примеров.


Я обнаружил, что мой вопрос похож на этот: С какой наиболее частой проблемой параллелизма вы столкнулись в Java? и Шаблоны ошибок параллелизма Java .

Но они относятся только к битым параллельным программам.Я также ищу поточно-ориентированные реализации, но там, где до сих пор не очевидно, что они поточнобезопасны.

Ответы [ 7 ]

11 голосов
/ 03 июля 2011

Посмотрите список описаний ошибок FindBugs , в частности, принадлежащих категории Многопоточная корректность (правый столбец таблицы).

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

3 голосов
/ 06 июля 2011

Как насчет этого?

class ObjectReference {

  private volatile Object obj = null;      

  public void set(Object obj) {
    if (obj == null) {
      throw new IllegalArgumentException();
    }
    this.obj = obj;
    synchronized (this) {
      notifyAll();
    }
  }

  /**
   * This method never returns null
   */
  public Object waitAndGet() {
    if (obj != null) {
      return obj;
    }
    synchronized (this) {
      wait();
      return obj;
    }
  }
}

Вы можете получить null из waitAndGet() на самом деле.Смотрите - Действительно ли случаются ложные пробуждения?

3 голосов
/ 14 июня 2011

Я бы вернулся в прошлое, например, на семь или более лет, и нашел бы некоторый открытый исходный код эпохи до java.util.concurrent. Практически во всем, что катит свой собственный параллелизм, будут присутствовать некоторые тонкие ошибки, потому что параллелизм трудно понять правильно.

2 голосов
/ 31 июля 2011

См. Информационный бюллетень специалистов по Java , где приведен последовательный поток небольших головоломок Java, многие из которых должны соответствовать вашим потребностям в тестировании.

2 голосов
/ 06 июля 2011

Столовая философская проблема - классический пример параллелизма. Эта ссылка имеет одно возможное решение, и другие можно найти в Интернете.

Как описано в первой ссылке, этот пример иллюстрирует довольно много общих проблем параллелизма.Пожалуйста, дайте вашему профилировщику показать, сколько он может отслеживать!

1 голос
/ 07 июля 2011

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

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

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

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

0 голосов
/ 12 июня 2011

Может быть Eclipse или Tomcat развертывание?Ни один из них не очень искусственный, но я могу представить, что мне нужны хорошие инструменты для отладки одного или другого.

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