有人可以解释一下为什么在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 ... 删除,因为它不相关
答案 0 :(得分:1)
在该堆栈中的某个位置,在您已切断的部分中,类似于:
- waiting to lock <0xa3cd2188> (a java.lang.Object)
尝试这个简单的应用程序,它有一个线程打印出它将要等待的线程,然后等待一段时间。然后你可以kill -3 <pid>
它(在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!");
}
}
}