一、死锁
什么是死锁?
当两个或两个以上的线程都在等待对方执行完成自己才能继续往下执行的情况。主要是因为争夺资源而造成的一种相互等待的现象。
举个例子来说,你让你的室友帮忙带饭,然后你说“你先帮我买饭,我在给你钱”,然后你的室友说“你先给钱,我在帮你买”。然后两个人就僵持在哪里
二、死锁编码
编写一个死锁的小程序
/**
* @author: xuzhi
* @date: 2020/10/16 14:23
*/
public class DeadLockDemo {
public static Object lockA=new Object();
public static Object lockB=new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"持有A锁,等待B锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println("线程A完成");
}
}
},"线程A").start();
new Thread(()->{
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"持有B锁,等待A锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA){
System.out.println("线程B完成");
}
}
},"线程B").start();
}
}
三、定位死锁
如果定位死锁呢,这里我们会用到jdk1.8自带的两个小工具,一个是jps,另一个是jstack