Java多线程 死锁含义,死锁的危害,墨菲定律

死锁的含义

死锁是一定发生在并发中的.
互不相让: 当两个或者更多的线程(或进程)相互持有对方所需要的资源, 又不主动释放锁, 导致所有人都无法继续执行下去, 导致程序陷入无尽的阻塞, 这就是死锁.

例如下图,线程A持有锁1 ,想去拿锁2, 线程B持有锁2, 想去拿锁1, 但是此时释放都不释放自己的锁, 那么就会进入无尽的阻塞.
锁的特性是只能被一个线程所拥有

如果多个线程之间的依赖关系是环形, 存在环路的锁的依赖关系, 那么也可能会发生死锁.
如下图所示, 三个线程死锁的环路. 除非拿到了想要的锁, 才会释放资源.

死锁的影响

死锁的影响在不同的系统中表现不一样 , 取决于系统对于死锁的处理能力.
例如在数据库中, 有检测并且释放事务的能力. 如果数据库中两个事务发生了死锁的情况, 那么数据库就能检测到, 并且指定某个事务进行放弃锁, 此时就不会造成死锁.

JVM不具备自动处理死锁的能力. 因为出于安全性的考虑,处理死锁的方式有很多 , 不能擅自的替程序员去判断如何修复死锁. 例如某个线程非常的重要, 宁可发生死锁也不能进行强制的中断.

死锁的危害–墨菲定律

墨菲定律: 虽然死锁的发生几率不高, 但是随着时间的推移,一定会发生.
一旦发生死锁, 影响的用户就很多, 可能会造成整个系统的崩溃, 子系统的崩溃,降低了系统的性能.
并且压力测试并不能找出所有潜在的死锁, 锁的获取可能是随机的, 那么发生死锁也是随机的.

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108460394