2012-03-08 53 views
3

有人可以解释为什么在jstack捕获的热点堆栈跟踪中,我看到一个线程被屏蔽,没有任何关于锁定记录的信息,意思是什么 阻止它。java stacktrace显示阻塞的线程,但没有关于阻塞它的信息

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

某处在堆栈中,你已经切断部分,是一样的东西:

- 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!"); 
     } 
    } 
} 
+0

希望在其他跟踪中,您将能够看到什么获得了锁定0x4e619000 – 2012-03-08 09:28:27

+0

您确定吗?我认为这是Thread – 2012-03-08 09:44:33

+0

@HuyLe Erm的地址,哎呀,对吧。将编辑。 – yshavit 2012-03-08 14:30:56