![Java多线程编程核心技术(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/745/42637745/b_42637745.jpg)
上QQ阅读APP看书,第一时间看更新
2.2.19 多线程的死锁
Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,导致所有的任务都无法继续完成。在多线程技术中,“死锁”是必须要避免的,因为这会造成线程的“假死”。
创建名称为deadLockTest的项目,DealThread.java类代码如下:
package test; 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) { // TODO Auto-generated catch block 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) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (lock1) { System.out.println("按lock2->lock1代码顺序执行了"); } } } } }
运行类Run.java代码如下:
package test; 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(100); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
程序运行结果如图2-56所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/2-56.jpg?sign=1738872111-4d379bvONmigHS8kCW5pKY6ooZ1xFXMj-0-68115faf5d8500f48769c5ffd2e579dc)
图2-56 死锁了
可以使用JDK自带的工具来监测是否有死锁现象,首先进入CMD工具,再进入JDK的安装文件夹中的bin目录,执行jps命令,如图2-57所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/2-57.jpg?sign=1738872111-aQWmHykyfaPkBrrMxFIa2sKCnD7ouAMM-0-6f5ab824f8b5cba11751f9131fbda074)
图2-57 执行jps命令
得到运行线程Run的id值是3244,再执行jstack命令,查看结果,如图2-58所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/2-58.jpg?sign=1738872111-thSOLauSrmY7zxQFiKdZz3wrSQe5lTGk-0-a0c25ad09404e36a5df44175e02dcd93)
图2-58 执行jstack命令
监测出有死锁现象,如图2-59所示。
![](https://epubservercos.yuewen.com/204B22/22139293909121606/epubprivate/OEBPS/Images/2-59.jpg?sign=1738872111-Yihh8zq9q62efuaFv1mq31Z8qbXTE6GQ-0-7c981d63f5a9ed5fddfe8cf448de23f8)
图2-59 出现死锁
死锁是程序设计的Bug,在设计程序时就要避免双方互相持有对方的锁,只要互相等待对方释放锁,就有可能出现死锁。