1.什么是死锁?
死锁就是多个进程或线程被阻塞,它们同时占用着对方所需的资源不放,僵持不下一直阻塞的情况。
2.说一下产生死锁的四个必要条件?
-
互斥:这个资源一次只有一个进程可以使用,比如锁。
-
占用并等待:一个进程至少应该占有一个资源并等待另一资源。
-
非抢占:资源不能被抢占,必须等待占用其的进程释放后,才能竞争。
-
循环等待:僵持不下,一直等待自己所需的资源。
3.Java代码模拟死锁
public class DeadLockDemo {private static Object resource1 = new Object();//资源 1private static Object resource2 = new Object();//资源 2public static void main(String[] args) {new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread() + "get resource2");}}}, "线程 1").start();new Thread(() -> {synchronized (resource2) {System.out.println(Thread.currentThread() + "get resource2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "waiting get resource1");synchronized (resource1) {System.out.println(Thread.currentThread() + "get resource1");}}}, "线程 2").start();}
}
Thread[线程 1,5,main]get resource1
Thread[线程 2,5,main]get resource2
Thread[线程 1,5,main]waiting get resource2
Thread[线程 2,5,main]waiting get resource1
4.解决死锁的方法?
-
预防:破坏四大必要条件之一即可,如静态资源分配方式,指一个线程必须在执行前就获取自己所需的全部资源,要么全部占有,要么不占有。
-
避免:当一个进程申请使用资源时,先使用银行家算法进行试探分配,看是否处于安全状态,相当于提前做安全检查。
-
检测:若进程资源分配图有环路,并且每一个资源类仅有一个资源,则系统中已经发生了死锁。
-
解除:立即结束所有的进程执行,重启操作系统、逐个撤销涉及死锁的进程,回收资源直至死锁解除。