死锁的形成原理

死锁形成的四个条件我就不说了,大家可以自行百度看博客

今天学死锁,老师讲的时候迷迷糊糊的,我看了4遍都没看懂

简直是讲了个寂寞,后面看了博客才看懂,一个很简单的东西

老师讲来讲去都没讲明白

原理:

线程T1在对资源R1进行操作,并且给R1上锁

线程T2在对资源R2进行操作,并且给R2上锁

但是这两个线程太贪心,在自己线程的执行过程中,虽然各自对自己使用的资源完成了操作,但是并没有对资源进行解锁,还对别人的资源有想法

如果是synchronized同步锁

那么就是T1在synchronized代码块或者同步方法中除了执行对R1的操作,还写了对R2资源的操作

可是T2也在synchronized代码块或者同步方法中除了执行对R2的操作,还写了对R1资源的操作

这样一来,T1此时锁住了R1不放,T2锁住了R2不放

此时T1请求执行R2,需要等待T2放出R2,所以T1阻塞住,在等待T2释放

与此同时T2请求执行R1,需要等待T1放出R1,所以T2阻塞住,在等待T1释放

完蛋了,两个线程都在阻塞,就产生了死锁

当然如果是lock锁,那么就是在unlock方法执行之前还做了对其他资源的操作,同理如上

形象一点说,死锁的产生,举个栗子

A和B在联手写代码,A写前端,B写后端

A写完了前端代码不放出来,他想要把B写的后端代码拿过来然后一起交给项目经理

巧了,B也是这么想的,手里也攥着后端代码不放

所以呢,A和B都在等对方妥协,就导致了项目停止,A和B各自的代码都被他们锁在了电脑里,就产生了死锁,谁也没有办法解开对方的电脑

所以解决办法是什么:

A写完前端,项目经理要求A立马给他

B写完后端,项目经理也要求B立马给他

A和B交完代码,没有什么功劳可以抢了

那么就要协同合作,A可以访问B的代码了,看看也无妨,学学后端怎么写

B也可以访问A的代码,学学前端怎么写

这样就不会产生死锁了

原文地址:https://www.cnblogs.com/skyvalley/p/13807751.html