在多线程的中,因为要保证线程安全,需要对一些操作进行加锁,但是如果操作不当,会造成死锁,导致程序无法运行下去。
形成死锁的场景:如果有两个线程,线程1和线程2,线程1运行,获得锁A,线程2运行,获得B,线程1等待锁B的释放,线程2等待锁A的释放,互相等待,形成一个死循环
代码如下:
public class Main {
public static void main(String[] args) throws InterruptedException {
String lockA = "lockA";
String lockB = "lockB";
new Thread(){
@Override
public void run() {
synchronized (lockA){
try {
System.out.println("线程1获取lockA");
Thread.sleep(1000);
System.out.println("线程1等待获取lockB");
synchronized (lockB){
System.out.println("线程1获取lockB");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread(){
@Override
public void run() {
synchronized (lockB){
try {
System.out.println("线程2获取lockB");
Thread.sleep(1500);
System.out.println("线程2等待获取lockA");
synchronized (lockA){
System.out.println("线程2获取lockA");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
输出为:
线程1获取lockA
线程2获取lockB
线程1等待获取lockB
线程2等待获取lockA
并没有输出另外两句,因为线程1持有lockA等待lockB,线程2持有lockB等待lockA。形成了死循环。在设计代码的时候应该要避免这种逻辑漏洞。
检测死锁:
进入JDK的bin目录,执行jps查找正在运行的java进程
找到对应的id,执行jstack