java stacktrace показывает заблокированный поток без информации о том, что его блокирует - PullRequest
3 голосов
/ 08 марта 2012

Может ли кто-нибудь объяснить мне, почему в стековой трассировке горячей точки, захваченной jstack, я вижу поток, блокируемый без какой-либо информации о записи блокировки, то есть, что блокирует ее.

3 "ajp-0.0.0.0-8029-1082" daemon prio=10 tid=0x63721000 nid=0x2cba
waiting for monitor entry [0x4e619000]
4    java.lang.Thread.State: BLOCKED (on object monitor)
5         at java.lang.Class.forName0(Native Method)
6         at java.lang.Class.forName(Class.java:186)
7         at com.my.security.SecurityMethodInterceptor$Rule.isAllowed(SecurityMethodInterceptor.java:102)
8         at com.my.security.SecurityMethodInterceptor.isAllowed(SecurityMethodInterceptor.java:163)
9         at com.my.security.SecurityMethodInterceptor.invoke(SecurityMethodInterceptor.java:140)

10 при ...удалено, потому что это не имеет отношения

1 Ответ

1 голос
/ 08 марта 2012

Где-то в этом стеке, в той части, которую вы отрезали, что-то вроде:

- waiting to lock <0xa3cd2188> (a java.lang.Object)

Попробуйте это простое приложение, в котором есть нить, которая распечатывает, какую нить она ожидает, изатем ждет его некоторое время.Затем вы можете kill -3 <pid> it (в linux) получить полный дамп потока, включая все стеки, включая стек для ожидающего потока.

public class TTest {
    public static void main(String[] args) throws Exception {
        final Object lock = new Object();
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("Locking on: " + Integer.toString(lock.hashCode(), 16));
                synchronized (lock) {
                    System.out.println("Hello, world!");
                }   
            }   
        };  
        synchronized (lock) {
            thread.start();
            Thread.sleep(600 * 1000);
            System.out.println("bye!");
        }   
    }   
} 
...