阿里面试:死锁产生原因?有哪些主流解决方案?

死锁在开发中经常遇见,下面我就来重点详解死锁的原因及解决方法,主要分为如下4大点@mikechen

死锁

死锁:是指在并发系统中,两个或多个事务(或线程、进程…),因为互相持有对方需要的资源。

并且都在等待对方释放自己持有的资源,从而导致所有事务都无法继续执行下去的僵局状态,这就是死锁。

如下图所示:

阿里面试:死锁产生原因?有哪些主流解决方案?-mikechen

// 线程A
synchronized(resourceA) {
    Thread.sleep(100);
    synchronized(resourceB) { /* ... */ }
}

// 线程B
synchronized(resourceB) {
    Thread.sleep(100);
    synchronized(resourceA) { /* ... */ }
}

假设有两个线程: T1T2

  1. T1 先锁住 资源 A,然后尝试获取 资源 B;

  2. T2 先锁住 资源 B,然后尝试获取 资源 A;

此时,T1 在等待 T2 释放 资源 B,T2 在等待 T1 释放 资源 A,双方都无法继续执行,就发生了死锁。

再比如:现实生活中最经典的例子,就是两辆车互相让道。

想象一下两条狭窄的单行道,两辆车分别从相反的方向驶来。

如果它们在中间相遇,并且都不愿意后退,那么这两辆车就陷入了死锁状态,它们都无法前进。

 

死锁产生原因

死锁发生,满足以下条件:

阿里面试:死锁产生原因?有哪些主流解决方案?-mikechen

评论交流
    说说你的看法