多线程的死锁
Posted 小胡的技术之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的死锁相关的知识,希望对你有一定的参考价值。
概述
java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的线程任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这会造成线程的“假死”。
代码实例
DealThread.java
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 ("a".equals(username)) {
synchronized (lock1) {
try {
System.out.println("username = "+ username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("按照 lock1 -》lock2代码顺序执行了");
}
}
}
if ("b".equals(username)) {
synchronized (lock2) {
try {
System.out.println("username = "+ username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("按照 lock2 -》lock1代码顺序执行了");
}
}
}
}
}
Run1.java
public class Run1 {
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) {
e.printStackTrace();
}
}
}
结果:
出现了死锁
JDK自带工具检测死锁现象
1.首先进入CMD工具,再进入JDK的安装文件夹中的bin目录
2.执行JPS命令
3.执行命令jstack命令
步骤2得到Run1的id的值是2992,再执行jstack命令,查看结果:
看的出来存在死锁的情况,死锁是程序设计的Bug,在设计程序的时候就要避免双方互相持有对方锁的情况。只要互相等待对方释放锁就有可能出现死锁。
以上是关于多线程的死锁的主要内容,如果未能解决你的问题,请参考以下文章