Поскольку я пишу профилировщик, фокусируясь на аспектах concurrency, я ищу хороший искусственный пример, используя механизмы синхронизации в Java. Мой профилировщик делает видимые действия, связанные с потоковой обработкой; например:
- вызов уведомления/ожидание
- поток изменяет свое состояние
- поток связан с другим потоком для блокировки монитора.
- блокировка монитора была получена нитью после того, как она решила его с помощью другого
- измерять время выполнения каждого метода.
- к которому поток обратился к определенному методу и как часто
- и др.
Итак, что я ищу, это Java-программа, которая, кажется, понимается под первым взглядом, но при ее запуске вы начинаете задумываться о результатах. Я надеюсь, что мой профилировщик сможет обнаружить, что происходит в фоновом режиме.
Чтобы прояснить себя, я приведу вам пример: книга Java Concurrency на практике Брайана Гетца дает "ядовитые" примеры кода, которые используются для изучения причин.
@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
использует другую блокировку для защиты состояния как методов, определенных в списке.
Профилировщик может отображать используемые блокировки монитора и суперпользователя (или нет...), пользователь увидит, что есть два возможных блокировки монитора вместо одного.
Мне не очень нравится этот пример, но я бы не спросил, если бы у меня было множество хороших примеров.
Я выяснил, что мой вопрос аналогичен этому: Какая самая частая проблема с w391, с которой вы столкнулись в Java? и Java Concurrency шаблоны ошибок.
Но они относятся только к разным параллельным программам. Я также ищу потокобезопасные реализации, но там, где все еще не очевидно, что они потокобезопасны.