死锁
4.1 死锁的四个条件
1.互斥条件:一个资源每次只能被一个进程使用。
2.请求与保持条件:一个进程因请求资源而阻塞时,对资源保持不放
3.不掠夺条件:进程已获得的资源,在未使用完前,不允许掠夺。
4.循环等待条件:若干进程之间形成一个头尾相连的闭环。
package JUC;
import java.util.concurrent.TimeUnit;
public class DeadLockTest {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(()->{
new MyThread1(lockA, lockB).run();
},"T1").start();
new Thread(()->{
new MyThread1(lockB, lockA).run();
},"T2").start();
}
}
class MyThread1 implements Runnable{
private String lockA;
private String lockB;
public MyThread1(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 {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "lock:"+lockB + "=> 获取"+ lockA);
}
}
}
}
4.2 查看 jps -l 死锁的进程号
jps -l
4.3使用 jstack 进程号 找到死锁问题
jstack 进程号