Java中死锁的检测

死锁这个概念我相信大家都不陌生,现在的问题是在发生了死锁的时候我们怎么去检测死锁呢?

下面给出两种常用的方式来检测死锁。

我先给出一段运行在本地的死锁代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public  class  DeadLock {
 
     public  static  final  Object lock1= new  Object();
     public  static  final  Object lock2= new  Object();
 
 
 
     public  static  void  main(String[] args){
         Thread thread1= new  Thread( new  Runnable() {
             @Override
             public  void  run() {
                 synchronized  (lock1){
                     try  {
                         Thread.sleep( 1000 );
                         synchronized  (lock2){
                             System.out.println( "线程1以获得锁1,正在获得锁2" );
                         }
                     catch  (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
             }
         });
         Thread thread2= new  Thread( new  Runnable() {
             @Override
             public  void  run() {
                 synchronized  (lock2){
                     try  {
                         Thread.sleep( 1000 );
                         synchronized  (lock1){
                             System.out.println( "线程2以获得锁2,正在尝试获得锁1" );
                         }
                     catch  (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
             }
         });
 
         thread1.start();
         thread2.start();
     }
 
}

1.通过JConsole进行检测

运行JConsole命令后我们找到本地运行的进程,如图

找到本地进程后然后点击检测死锁,就可以看到死锁的线程了。在这次测试中我们可以看到发生死锁的两个线程是Thread-0和Thread-1.

这样我们就可以查看运行过程中可能出现的线程了。。。。。

血的教训:就在刚才我在写这个博客的时候死锁进程依然跑在博主的PC中,然后就是各种卡。。。。最后才意识到原来自己的死锁问题还没有解决。。。。所以。。。。死锁很严重,一旦发生之后会消耗很多资源的。

2.通过JPS与JStack命令结合来查看死锁


首先使用JPS命令找到模拟器正在运行的线程的PID,然后使用JStack查看线程的信息即可。 组后效果如下

从上图中我们就可以看到找到了死锁的线程分别是Thread-1和Thread-0两个线程。


通过以上总结我们总结了两种检测死锁的方法,两种方式的利弊并不是非常明显,所以选择也依靠个人爱好了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值