【多线程】 死锁是什么? 如何检测代码中的死锁?

网友投稿 493 2022-11-05

【多线程】 死锁是什么? 如何检测代码中的死锁?

【多线程】 死锁是什么? 如何检测代码中的死锁?

@TOC

多线程的死锁

Java线程死锁是一个经典的多线程问题, 因为不同的线程都在等待根本不可能被释放的锁, 从而导致线程中的任务无法完成 下面演示互相等待对方锁释放的死锁

public class DealThread implements Runnable { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } //俩把锁 private final Object lock1 = new Object(); private final Object lock2 = new Object(); @Override public void run() { if ("a".equals(userName)) { synchronized (lock1) { System.out.println("userName=" + userName + " :" + "进入lock1"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("由lock1->进入->lock2"); } } } if ("b".equals(userName)) { synchronized (lock2) { System.out.println("userName=" + userName + " :" + "进入lock2"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("由lock2->进入->lock1"); } } } } }

启动类

public class Run { public static void main(String[] args) throws InterruptedException { DealThread dealThread = new DealThread(); dealThread.setUserName("a"); Thread thread = new Thread(dealThread); thread.start(); //注意这里是等待0.1秒 而线程是等待三秒 Thread.sleep(100); dealThread.setUserName("b"); Thread thread1 = new Thread(dealThread); thread1.start(); } }

运行结果

此时我们发现已经进入死锁

用JDK检测死锁

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Golang的一个很小结构日志库
下一篇:Springboot使用slf4j记录日志的方法步骤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~