Поскольку я пишу профилировщик с акцентом на параллелизм аспектах, я ищу хороший искусственный пример использования механизмов синхронизации в 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 .
Но они относятся только к битым параллельным программам.Я также ищу поточно-ориентированные реализации, но там, где до сих пор не очевидно, что они поточнобезопасны.