浅谈Java中锁的问题

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了浅谈Java中锁的问题脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

之前我们简单的讨论了一下关于Java中的同步还有一些锁优化的问题,今天我们就来简单的聊一聊关于Java中的死锁问题。

这个问题我们在开发的时候,或多或少都能遇到,对业务逻辑没有正确的梳理,又或者是在多线程的情况下,对程序的执行顺序有理解上的偏差等等,但是这种问题有时候执行代码是看不出来的,那我们今天就看一看如何使用简单的命令来查看死锁。

首先我们得写一段有问题的程序,当然前提条件是先要明确什么是死锁,这个问题在网上找有很多的资料,在这里我们就不重复叙述了,先来看一下代码

class Lock extends Thread{      PRivate String lock1;          private String lock2;          Lock(String s1, String s2){         this.lock1 = s1;         this.lock2 = s2;     }          @override     public void run() {         synchronized (lock1) {             System.out.println(Thread.currentThread().getName() + " get " + lock1);             try {                 Thread.sleep(1 * 1000);                 synchronized (lock2) {                     System.out.println(Thread.currentThread().getName() + " get -- " + lock2);                 }             } catch (InterruptedException e) {                 e.printStackTrace();             }         }     }           }      public static void main(String[] args) throws InterruptedException {         Thread thread1 = new Thread(new Lock(LOCK_1, LOCK_2));         Thread thread2 = new Thread(new Lock(LOCK_2, LOCK_1));                  thread1.start();         thread2.start();                  thread1.join();         thread2.join();     }

在这里我们用synchronized来嵌套两层,然后赋予两个线程两个交互的锁,那么这段代码在大部分情况下会发生死锁,但是我们的程序执行下来没有报错,那这个该如何查看呢?JDK为我们提供了一些工具,我们来看一下,首先用jps这个命令查看当前的PID,这个就和ps命令差不多。

浅谈Java中锁的问题

然后我们再用jstack来查看具体的栈信息,例如:jstack 9520,会打印很多的信息,我们看几个比较重要的。

浅谈Java中锁的问题

这里显示两个线程的状态现在是处于阻塞状态,然后都在等待锁的获取,我们再继续往下看。

浅谈Java中锁的问题


这里很明确的指出线程3在等待一个锁获取,但是这个锁被线程1持有,反过来也是一样,线程1也在等待一个锁获取,但是这个锁又被线程3持有,那么这里就产生了一个死锁。

JDK的这些命令行工具能很好的帮助我们分析程序中的一些问题,但是我们在日常的开发工作中,该如何规避这些问题呢,其实我的建议只有一点,首先要明确理论,有了一定的理论做基础,然后就是不断的实践采坑,这样才能明白某些问题的点在哪里。

脚本宝典总结

以上是脚本宝典为你收集整理的浅谈Java中锁的问题全部内容,希望文章能够帮你解决浅谈Java中锁的问题所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。