如何设计一个优秀的小程序开发平台?
535
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~