Как обнаружить нарушения синхронизации с Java

Поместите фрагмент карты в LinearLayout и дайте этому Linear Layout

android:layout_height="0dp"    
android:layout_weight="1"
9
задан Touko 18 November 2008 в 14:26
поделиться

9 ответов

Вы ищете Святой Грааль, я думаю. AFAIK это не существует, и Java, не является языком, который позволяет такому подходу быть легко созданным.

"Параллелизм Java на практике" имеет раздел по тестированию на проблемы многопоточности. Это привлекает особое внимание к тому, как трудно это должно сделать.

2
ответ дан 4 December 2019 в 21:52
поделиться

ИДЕЯ IntelliJ имеет много полезных проверок параллелизма. Например, это предупреждает Вас при доступе к тому же объекту и от синхронизируемых и от несинхронизируемых контекстов когда Вы синхронизируетесь на неконечных объектах и т.д.

Аналогично, FindBugs имеет много подобных проверок.

2
ответ дан 4 December 2019 в 21:52
поделиться

Когда проблема возникает по потокам в Java, это обычно связывается для заведения в тупик обнаружения, больше, чем просто контроль, какие Потоки получают доступ к синхронизируемому разделу одновременно. Расширение JMX, добавленное к JRE с тех пор 1.5, может помочь Вам обнаружить те мертвые блокировки. На самом деле мы используем JMX в нашем собственном программном обеспечении для автоматического обнаружения, заводит в тупик трассировку, где это было найдено.

Вот пример о том, как использовать его.

2
ответ дан 4 December 2019 в 21:52
поделиться

А также упоминание @Fernando о заведении в тупик потока, другой проблемой с несколькими потоками являются параллельные модификации и проблемы, которые это может вызвать.

Одна вещь, которую Java делает внутренне, состоит в том, что класс набора проводит подсчет того, сколько раз он был обновлен. И затем итератор проверяет, что значение на каждом .next () против того, чем это было, когда interator был создан, чтобы видеть, был ли набор обновлен, в то время как Вы выполняли итерации. Я думаю, что принцип мог использоваться в более общем плане.

1
ответ дан 4 December 2019 в 21:52
поделиться

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

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

class Foo {

  private final Thread owner = Thread.currentThread();

  void x() {
    assert Thread.currentThread() == owner;
    /* Implement method. */
  }

}

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

Thread.holdsLock (Объект) метод может также быть полезен для Вас.

1
ответ дан 4 December 2019 в 21:52
поделиться

Вы могли бы интересоваться подходом Peter Veentjer, занесенный в блог о, который он называет Детектором Параллелизма. Я не полагаю, что он открыто получил это все же, но поскольку он описывает это, основная идея состоит в том, чтобы использовать AOP для оснащения кода, что Вы интересуетесь профилированием и записью, которой поток коснулся который поле. После этого это - вопрос вручную или автоматически парсинг сгенерированных журналов.

1
ответ дан 4 December 2019 в 21:52
поделиться

Попробуйте ConTest или Covertity

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

Кроме того, проверьте этот вопрос: Поблочное тестирование многопоточное приложение?

1
ответ дан 4 December 2019 в 21:52
поделиться

Можно использовать профилировщика Netbeans или JConsole для проверки состояния потоков подробно

-1
ответ дан 4 December 2019 в 21:52
поделиться

Для определенного примера Вы даете, SwingLabs имеет некоторый код помощника для обнаружения нарушений потока события и зависает. https://swinghelper.dev.java.net/

Некоторое время назад я работал с Java JProbe профильные инструменты. Один из их инструментов (threadalyzer?) искал нарушения синхронизации потока. Смотря на их веб-страницу, я не вижу инструмент тем именем или вполне что я помню. Но Вы могли бы хотеть смотреть. http://www.quest.com/jprobe/performance-home.aspx

0
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: