Как узнать, какие потоки в настоящее время содержат разрешения java.util.concurrent.Semaphore?

Я пытаюсь проанализировать дамп потока, который, по-видимому, указывает на наличие множества потоков, ожидающих java.util.concurrent.Semaphore разрешает, т. е. потоки ожидают Semaphore.acquire().

Это я мог предположить, потому что потоки находятся в состоянии ОЖИДАНИЯ (парковки), и, насколько я понял, семафоры не используют мониторы LOCK, а используют LockSupport.park(), ожидая, пока другой поток разблокирует его.

Теперь, есть ли способ понять из дампа потока, какие все потоки в настоящее время содержат разрешения семафора?

Аналогично поиску потоков в состоянии BLOCKED и проверке того, какой поток удерживает LOCK, из-за которого поток блокируется?


person aathif    schedule 02.02.2016    source источник
comment
Когда вы получаете разрешение, на самом деле ничего не удерживается; нет ничего, чтобы отдать, когда вы выпускаете его. На самом деле ни один поток ничего не содержит — это просто счетчик. например семафор может запускаться с нулевыми разрешениями, и вы можете законно вызывать выпуск.   -  person Andy Turner    schedule 02.02.2016
comment
@ Энди Тернер Точно, так что могу ли я просто заключить, что невозможно определить, какие потоки успешно получили разрешение с помощью дампа потока?   -  person aathif    schedule 03.02.2016
comment
Семафоры @aathif не знают о потоках, что делает их особенно легкими (и полезными в асинхронном программировании). Поток может освободить семафор, даже не получив его. Нет понятия собственности. Вам придется пройти трудный путь и проанализировать трассировку стека, чтобы найти, где они ждут, и перейти оттуда.   -  person Voo    schedule 03.02.2016
comment
@Voo Верно, это точное объяснение. Возможно, вам действительно стоит добавить свой комментарий в качестве ответа.   -  person aathif    schedule 04.02.2016


Ответы (2)


Семафоры не имеют концепции владения и ничего не знают о потоках. Это делает их особенно легкими (и полезными в асинхронном программировании, где ваш логический поток выполнения и аппаратный поток, в котором он выполняется, не обязательно будут иметь сопоставление 1:1).

Вы также можете увидеть это из того факта, что поток может освободить семафор, даже не получив его.

Вам нужно будет посмотреть на трассировку стека, чтобы увидеть, где на каких семафорах ожидают потоки, и работать в обратном направлении оттуда.

person Voo    schedule 04.02.2016

Существуют инструменты, которые помогут вам анализировать дампы. Yourkit — один из таких инструментов, который можно использовать для анализа заблокированных потоков.

Ссылка: https://www.yourkit.com/docs/java/help/monitor_profiling.jsp

person Snekhe    schedule 02.02.2016
comment
Я знаю о таких анализаторах дампа потока. Было бы здорово, если бы вы написали о том, как YourKit поможет мне определить, какие потоки имеют разрешения на семафоры, вызывающие конкуренцию. - person aathif; 03.02.2016
comment
Yourkit можно использовать как для анализа потоков, так и для мониторинга. В Yourkit вы найдете вкладку «Потоки», позволяющую просматривать состояние (ожидание, заблокировано и т. д.) всех потоков. Он также сообщает вам, является ли это потоком демона, и многое другое. Для просмотра сведений об использовании монитора в Yourkit выберите View-›Monitor Usage. Однако не уверен, что вы можете получить подробную информацию о разрешениях на семафоры. - person Snekhe; 03.02.2016