《深入理解java虚拟机》之通过Jconsole检测线程死锁

 XML Code 

* 写一个死锁示例
 * 线程死锁是由于线程之间相互等待彼此释放自己锁需要的锁
 * 然后相互等待导致程序僵死
 * 例如A线程需要获取o1,o2两个锁,线程B需要o2,o1两个锁
 * 当线程A拥有o1的锁,则它要执行完就需要获取o2锁,此时o2锁的拥有者是B
 * 线程A等待线程B释放o2锁,同时线程B也在等待线程A释放o1锁,所以两个线程相互等待对方释放自己需要的锁
 * 就这样他们天长地久的等待着彼此

package com.lyzx.concurrent.se;

import java.util.concurrent.TimeUnit;

public class T1 {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();


        new Thread(new XMan(o1,o2),"A").start();
        new Thread(new XMan(o2,o1),"B").start();

        new Thread(new YMan(),"Yman-01").start();
        System.out.println("main....end....");
    }
}

class XMan implements Runnable{
    private final Object o1;
    private final Object o2;

    public XMan(Object o1,Object o2){
        this.o1 = o1;
        this.o2 = o2;
    }


    @Override
    public void run() {
        synchronized (o1){

            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o2){
                System.out.println(Thread.currentThread().getName()+"==>ok");
            }
        }
    }
}


class YMan implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            try{TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e){}
            System.out.println(Thread.currentThread().getName()+" is running "+i);
        }
    }

}

通过Java自带的工具Jconsole,可以查看线程状况

《深入理解java虚拟机》之通过Jconsole检测线程死锁_第1张图片

点击下面的检测死锁,可以看到导致死锁的线程,如下图

《深入理解java虚拟机》之通过Jconsole检测线程死锁_第2张图片

可以看到是A和B导致了线程死锁,所以看到这个图,大家应该明白给线程起名字真的很重要啊!

你可能感兴趣的:(JVM)