2016-03-02 3 views
2

У меня есть 2 метода в объекте класса, которые могут быть вызваны из разных потоков и один метод - событие таймера. Я отметил все 3 метода: synchronized. Но теперь у меня возникла ситуация, когда что-то заперло this (я полагаю, синхронизированная блокировка мест на текущем объекте) и одна из процедур synchronized не может продолжаться. Как узнать, какой метод заблокирован this? Я использую NetBeans и Java 1.4 JDK.Чтобы узнать, кто заблокировал объект

стек вызовов выглядит неактивным:

enter image description here

+0

, если вы хотите, чтобы нарушить синхронизацию и меньшие части каждого способа свои собственные блокировки, чтобы, когда метод заблокирован, он не будет блокировать все остальные методы. – achabahe

+0

Я ожидаю, что все 3 метода рано или поздно закончатся и позволят продолжить следующие синхронизированные методы, и я доволен этой производительностью. Я не могу понять, почему один из этих методов не закончен. По крайней мере, мне нужно знать, какой метод блокирует все. – vico

ответ

0

Java не имеет встроенного способа узнать точную нить, блокирующую синхронизированный код.

Но я не вижу никакой пользы от знания блокирующей нити.

0

вместо использования синхронизированного метода используйте синхронизированный блок и передайте это, как показано ниже. И вы узнаете, какой метод заблокировал его. Кроме того, я предлагаю использовать интерфейс Lock из java Concurrency, если ваш jre больше 1,5, следуйте приведенному ниже подходу. Счастливое кодирование :)

method1() { 
sysout("method1, going to lock"); 
synchronized(this) 
{ 
.... 
.... 
} 
sysout("method1, going to unlock"); 
} 


method2() { 
sysout("method2, going to lock"); 
synchronized(this) 
{ 
.... 
... 
} 
sysout("method2, going to un lock"); 
} 
0

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

Для того, чтобы дамп на Unix/Linux, используйте kill -3 <pid>

Краткий справочник для понимания нить отвалов: Using Thread Dumps

Смежные вопросы