死锁在开发中经常遇见,下面我就来重点详解死锁的原因及解决方法,主要分为如下4大点@mikechen
死锁
死锁:是指在并发系统中,两个或多个事务(或线程、进程…),因为互相持有对方需要的资源。
并且都在等待对方释放自己持有的资源,从而导致所有事务都无法继续执行下去的僵局状态,这就是死锁。
如下图所示:

// 线程A
synchronized(resourceA) {
Thread.sleep(100);
synchronized(resourceB) { /* ... */ }
}
// 线程B
synchronized(resourceB) {
Thread.sleep(100);
synchronized(resourceA) { /* ... */ }
}
假设有两个线程: T1 和 T2:
-
T1先锁住 资源 A,然后尝试获取 资源 B; -
T2先锁住 资源 B,然后尝试获取 资源 A;
此时,T1 在等待 T2 释放 资源 B,T2 在等待 T1 释放 资源 A,双方都无法继续执行,就发生了死锁。
再比如:现实生活中最经典的例子,就是两辆车互相让道。
想象一下两条狭窄的单行道,两辆车分别从相反的方向驶来。
如果它们在中间相遇,并且都不愿意后退,那么这两辆车就陷入了死锁状态,它们都无法前进。
死锁产生原因
死锁发生,满足以下条件:
