谈谈你对锁的理解?
锁是指在并发编程中,为了保障多线程在同时操作一组资源时的数据一致性,我们需要让多线程排队一个一个的操作此资源,而这个过程就是给资源加锁和释放锁的过程,就好像去公共厕所一样,必须一个一个排队使用,并且在使用时需要锁门和开门一样。
谈谈你对死锁的理解?
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
手动模拟一个死锁?
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)什么是死锁?手动模拟一个死锁?
参考/好文:
百度百科 -- 死锁
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