摘要:使用工具监测死锁进入的安装目录中的目录,执行命令可以看出得到运行的线程的值为,再执行命令,查看结果
死锁
Java 线程是死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成
举个例子DealThread.java
package dealThread.demo; public class DealThread implements Runnable{ public String username; public Object lock1 = new Object(); public Object lock2 = new Object(); public void setFlag(String username){ this.username = username; } @Override public void run(){ if(username.equals("a")){ synchronized (lock1){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock2){ System.out.println("lock1 -> lock2"); } } } if(username.equals("b")){ synchronized (lock2){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock1){ System.out.println("lock2 -> lock1"); } } } } }
Run.java
package dealThread.demo; public class Run { public static void main(String[] args){ try{ DealThread t1 = new DealThread(); t1.setFlag("a"); Thread thread1 = new Thread(t1); thread1.start(); Thread.sleep(1000); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); }catch(InterruptedException e){ e.printStackTrace(); } } }
运行结果如下:
线程thread1和thread2都持有对方的锁,而且需要等待对方释放锁之后才能往下继续运行,这个时候就发生了死锁;其实不使用嵌套的synchronized代码结构也会出现死锁,与嵌套不嵌套没有任何关系,只要互相等待对方释放锁就有可能出现死锁。
使用JDK工具监测死锁进入JDK的安装目录中的bin目录,执行jps命令:
可以看出得到运行的线程Run的id值为7404,再执行jstack命令,查看结果:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72026.html
摘要:因为多线程竞争锁时会引起上下文切换。减少线程的使用。举个例子如果说服务器的带宽只有,某个资源的下载速度是,系统启动个线程下载该资源并不会导致下载速度编程,所以在并发编程时,需要考虑这些资源的限制。 最近私下做一项目,一bug几日未解决,总惶恐。一日顿悟,bug不可怕,怕的是项目不存在bug,与其惧怕,何不与其刚正面。 系列文章传送门: Java多线程学习(一)Java多线程入门 Jav...
摘要:相比与其他操作系统包括其他类系统有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。因为多线程竞争锁时会引起上下文切换。减少线程的使用。很多编程语言中都有协程。所以如何避免死锁的产生,在我们使用并发编程时至关重要。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)syn...
摘要:上下文切换会影响到线程的执行速度,对于系统来说意味着会消耗大量的时间减少上下文切换的方式无锁并发编程,在多线程竞争锁时,会导致大量的上下文切换。线程在中的使用在中实现多线程的方式比较简单,因为中提供了非常方便的来实现多线程。 文章简介 上一篇文章我们了解了进程和线程的发展历史、线程的生命周期、线程的优势和使用场景,这一篇,我们从Java层面更进一步了解线程的使用 内容导航 并发编程的...
摘要:此时线程需要锁才能继续往下执行。但是线程的锁并没有释放,线程的锁也没有释放。 前言 只有光头才能变强 回顾前面: ThreadLocal就是这么简单 多线程三分钟就可以入个门了! 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 AQS简简单单过一遍 Lock锁子类了解一下 线程池你真不来了解一下吗? 本篇主要是讲解死锁,这是我在多线程的最后一篇了。主要将多线程...
阅读 1124·2021-09-26 09:46
阅读 1542·2021-09-06 15:00
阅读 660·2019-08-30 15:52
阅读 1027·2019-08-29 13:10
阅读 1201·2019-08-26 13:47
阅读 1444·2019-08-26 13:35
阅读 1959·2019-08-23 18:38
阅读 685·2019-08-23 17:59