死锁检测 java_Java死锁以及命令检测

Java每个对象都有一把锁,当前进程使用对象锁1,没有释放该锁,又想要去获取另一把对象锁2,而对象锁2被另外一个线程持有,没有释放,这就很容易出现死锁

1.死锁实例

public class DeadLockTest {

private static Object object1 = new Object();

private static Object object2 = new Object();

public static void main(String[] args) {

new Thread(new Runnable() {

@Override

public void run() {

synchronized (object1) {

System.out.println("线程1获取object1锁...");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (object2) {

System.out.println("线程1获取object2锁...");

}

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

synchronized (object2) {

System.out.println("线程2获取object2锁...");

synchronized (object1) {

System.out.println("线程2获取object1锁...");

}

}

}

}).start();

System.out.println("main 线程执行完毕...");

}

}

分析:线程1持有object1的锁,同时又想去获取object2的锁,而此时线程2又持有object2的锁没有释放,又想去获取object1的锁,这就造成了死锁。

2.通过命令查看死锁

前提:进入jdk的bin目录下

2.1 jps

jps命令查看Java相关进程

1b15447864a44c49441ca773c6866b24.png

2.2 jstack

jstack:查看分析具体的进程执行情况

运行上面的程序,执行jps命令,发现上面代码的进程号为14888

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值