Программно определите, какой поток Java содержит блокировку

Я просто добавляю следующее в класс App_Start / WebApiConfig.cs в проекте MVC Web API.

config.Formatters.JsonFormatter.SupportedMediaTypes
    .Add(new MediaTypeHeaderValue("text/html") );

Это гарантирует, что вы получите json для большинства запросов, но вы можете получить xml при отправке text/xml.

Если вам нужно иметь ответ Content-Type как application/json, пожалуйста, проверьте ответ Тодда ниже .

NameSpace использует System.Net.Http.Headers;

40
задан erickson 25 September 2008 в 02:46
поделиться

5 ответов

Можно только сказать, содержит ли текущий поток нормальную блокировку ( Thread.holdsLock(Object) ). Вы не можете получить ссылку на поток, который имеет блокировку без собственного кода.

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

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

25
ответ дан P̲̳x͓L̳ 5 August 2019 в 05:56
поделиться

От 1,6, можно использовать JMX, чтобы сделать все виды интересных вещей включая нахождение сохраненных блокировок. Вы не можете получить фактический объект, но Вы действительно получаете класс и значение хэш-функции идентификационных данных (который не уникален).

существует пример в одном из моих блогов.

7
ответ дан Tom Hawtin - tackline 5 August 2019 в 05:56
поделиться

Выполненный jconsole. Это включено в SDK Java и выполняется из командной строки. Я не уверен, что ОС Вы используете, но на окнах можно просто передать ее PID процесса Java. Это должно помочь Вам найти поток, который вызывает проблему. Или, можно использовать коммерческого профилировщика как YourKit или любое число других профилировщиков.

4
ответ дан Todd 5 August 2019 в 05:56
поделиться

В 1,5, можно найти все потоки и получить каждое состояние, например, как это:

    Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
    for (Map.Entry<Thread, StackTraceElement[]> threadEntry : map.entrySet()) {
        log.info("Thread:"+threadEntry.getKey().getName()+":"+threadEntry.getKey().getState());
        for (StackTraceElement element : threadEntry.getValue()) {
            log.info("--> "+element);
        }
    }

Thread.getState дает Вам информацию о том, заблокирован ли поток, ОЖИДАЯ и т.д., см. jdk api ThreadState

3
ответ дан Chris Kimpton 5 August 2019 в 05:56
поделиться

Вы можете получить доступ к блокировкам, удерживаемым потоками с отражением. Это работает только с java 1.6.

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);

На каждом из этих объектов ThreadInfo есть объекты LockInfo, для которых вы можете использовать identityHashCode для сравнения с рассматриваемой блокировкой.

14
ответ дан 27 November 2019 в 01:49
поделиться