简单死锁例子

来源:互联网 发布:网络菜市场 编辑:程序博客网 时间:2024/06/07 16:38
/* * * 一个简单的死锁类 * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; * td1、td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。  */public class DeadLock implements Runnable {    public int flag = 1;    private static Object o1 = new Object(), o2 = new Object();    @Override    public void run() {        System.out.println("flag=" + flag);        if (flag == 1) {            synchronized (o1) {                try {                    Thread.sleep(500);                } catch (Exception e) {                    e.printStackTrace();                }                synchronized (o2) {                    System.out.println("1");                }            }        }        if (flag == 0) {            synchronized (o2) {                try {                    Thread.sleep(500);                } catch (Exception e) {                    e.printStackTrace();                }                synchronized (o1) {                    System.out.println("0");                }            }        }    }    public static void main(String[] args) {        DeadLock td1 = new DeadLock();        DeadLock td2 = new DeadLock();        td1.flag = 1;        td2.flag = 0;        // 线程1执行时,锁定对象2这个资源,等锁定对象1后解锁        new Thread(td1).start();        // 线程2执行时,锁定对象1这个资源,等锁定对象2后解锁        new Thread(td2).start();    }}

使用命令,查看当前运行程序的pid

jps

然后根据pid来使用jstack查看程序运行情况

jstack 7588

这里写图片描述

原创粉丝点击