码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程-死锁

时间:2020-01-21 18:11:48      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:一个   条件   任务   没有   哲学   转移   ima   lock   互斥   

死锁,就是当两个以上的任务,双方都在等待对方完成释放资源,但是没有一方提前退出时,就称之为死锁。

  • 哲学家吃饭问题

  假设有3名哲学家在圆桌上准备吃面条,现在,只有3根筷子(不是三双),只有同时拥有2根(一双)筷子的哲学家才能吃,另外的人需要等待他吃完释放筷子。这里面:

   资源: 指的就是筷子

   任务: 每个哲学家吃饭

技术图片

 

  抛开代码,考虑一个问题: 假设3名哲学家同时占用了1根筷子,这个时候,3人会互相等待其他人释放筷子,但是因为他们3人都只有1根筷子没办法完成吃饭的任务,所以一直处于等待的状态,这样,就发生了死锁

  技术图片

 

 

 

  发生死锁必须同时满足四个条件:

  1.   多个资源中,至少有一个是互斥的,即不允许被多个任务占用;
  2.   多个任务中,至少有一个任务占据着一个资源,并且正在等待另一个资源被释放;
  3.   资源不能被强制从一个任务转移到另一个任务中,即只能通过正常的释放;
  4.   任务之间的依赖成环,比如哲学家A等待哲学家B的筷子,哲学家B等待哲学家C的筷子,哲学家C等待哲学家A的筷子。

当且仅当同时满足上述四个条件的时候,就可能发生死锁。

 

  •   防止死锁

  从上面的例子中,我们直到死锁造成的后果肯定非常严重,那么如何避免死锁呢?也就是上述发生死锁的四个条件,只要使其中之一不满足就可以了。一般而言,前三个条件并不易改变,第4个条件即依赖成环的条件可以通过程序去避免。

 

技术图片

 

 

 

  如上图所示,避免依赖成环,只需要使其中两根筷子分别被两人占据时,另外一根筷子没有被任何人占据即可。

Java多线程-死锁

标签:一个   条件   任务   没有   哲学   转移   ima   lock   互斥   

原文地址:https://www.cnblogs.com/yxlaisj/p/12222329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!