什么是死锁:
两条或两条以上互相抢夺资源,就会造成阻塞现象,永远在互相等待的进程称为死锁进程
A持有A锁,B持有B锁,A要拿B锁,B要拿A锁
package com.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author LZP
* @create 2020/7/12
* 死锁
*/
public class Deadlock {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new MyThread(lockA, lockB), "A1").start();
new Thread(new MyThread(lockB, lockA), "A2").start();
}
}
class MyThread implements Runnable {
private String lockA;//定义锁
private String lockB;
public MyThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "lock" + lockA + "要拿取:" + lockB);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "lock" + lockB + "要拿取:" + lockA);
}
}
}
}
造成死锁,程序死等不会停止
怎么排除死锁?
1.堆栈信息
2.在控制台的Terminal中:jps -l //查看当前活着的java线程
jstack + 线程号 //查看详情