谈谈你对死锁的理解?
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
手动模拟一个死锁?
public class DeadLockExample { public static void main(String[] args) { //死锁 deadLock(); } public static void deadLock(){ Object lock1 = new Object(); Object lock2 = new Object(); //线程一拥有lock1 试图获取lock2 new Thread(() -> { synchronized (lock1){ System.out.println("获取Lock1成功"); try{ TimeUnit.SECONDS.sleep(3); }catch (InterruptedException e) { e.printStackTrace(); } //试图获取锁lock2 synchronized (lock2){ //获得当前线程名称 System.out.println(Thread.currentThread().getName()); } } }).start(); //线程二拥有lock2 试图获取lock1 new Thread(() -> { synchronized (lock2){ System.out.println("获取 Lock2 成功"); try{ TimeUnit.SECONDS.sleep(3); }catch (InterruptedException e) { e.printStackTrace(); } //试图获取锁lock1 synchronized (lock1){ //获得当前线程名称 System.out.println(Thread.currentThread().getName()); } } }).start(); } }
运行结果:
死锁发生必须满足的条件?
必须满足以下四个条件:
1)互斥条件:一个资源每次只能被一个进程使用。
2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
常见面试题:
(2)什么是死锁?手动模拟一个死锁?
参考/好文:
百度百科 -- 死锁
https://baike.baidu.com/item/%E6%AD%BB%E9%94%81/2196938?fr=aladdin
拉钩课程 -- Java面试真题及源码
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59#/detail/pc?id=1766