使用jstack 发现死锁

参考:http://blog.chinaunix.net/uid-20104447-id-4075333.html

1. 据java的sdk说明,当调用一个线程的stop时(暂时不管该不该使用该方法),线程会立即退出,但是下面的却没有,是什么原因呢?

package java_jni;
public class Main {
    public static void main(String []args){
        try { 
            Thread t = new Thread() { 
                public synchronized void run() { 
                    try { 
                        Thread.sleep(100000);
                    } catch (Throwable ex) { 
                        System.out.println("Caught in run: " + ex); 
                        ex.printStackTrace(); 
                    } 
                } 
            }; 
            t.start(); 
            // Give t time to get going... 
            Thread.sleep(100); 
            t.stop(); // EXPECT COMPILER WARNING 
        } catch (Throwable t) { 
            System.out.println("Caught in main: " + t); 
            t.printStackTrace(); 
        } 
    }
}
运行该程序,然后用jstack输出堆栈;结果如下:为了方便,我只留下main 和 thread0的堆栈信息;

"Thread-0" prio=10 tid=0x00007f31240aa000 nid=0x1408 waiting on condition [0x00007f3121fe0000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java_jni.Main$1.run(Main.java:16)
- locked <0x00000000d70e5be8> (a java_jni.Main$1)



"main" prio=10 tid=0x00007f3124007800 nid=0x13fb waiting for monitor entry [0x00007f312bf79000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.Thread.stop1(Thread.java:819)
- waiting to lock <0x00000000d70e5be8> (a java_jni.Main$1)
at java.lang.Thread.stop(Thread.java:758)
at java_jni.Main.main(Main.java:26)
由上可见,main线程中调用t.stop的时候在等一个所,而这个锁被thread-0 锁住了。再次阅读源码,发现上面实现的run方法,前面有了synchronized; 而在看看java的源码:果然如此;

@Deprecated
    public final void stop() {
        // If the thread is already dead, return.
    // A zero status value corresponds to "NEW".
    if ((threadStatus != 0) && !isAlive()) {
     return;
    }
    stop1(new ThreadDeath());
    }

private final synchronized void stop1(Throwable th) {




阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页