Java并发(六):死锁

Java并发(六):死锁

经过前面的笔记,了解到了一个对象可以有synchronized方法或者其他形式的加锁机制来防止别的任务在互斥还没有释放的时候就访问这个对象,并且知道了任务可以变为阻塞状态,那么就有可能出现这种情况:某个任务在等待另一个任务,而后者又在等待别的任务,这样一直下去,直到这个链条上的任务又在等待第一个任务释放锁。
任务之间互相等待的连续循环,称为死锁。死锁将会使得程序无法继续运行,而开发者并无法从代码中得到问题所在。(一个经典的死锁问题为哲学家就餐问题)
在这里插入图片描述
要修正死锁问题,就必须知道发生死锁的条件,当以下四个条件同时满足时,死锁就会发生:

  1. 互斥条件
    任务使用的资源中至少有一个是不能共享的。
  2. 请求与保持条件
    至少有一个任务它必须持有一个资源且正在等待获取一个当前被别的任务持有的资源
  3. 不剥夺条件
    任务已获得的资源,在未使用完之前,不能强行剥夺
  4. 循环等待条件
    若干任务之间形成一种头尾相接的循环等待资源的关系
    因为发生死锁需要同时满足以上四个条件,因此要防止死锁,只需破坏其中一个即可。在程序中,防止死锁最容易的方法是破坏循环等待条件

参考资料:《Java编程思想》

原创文章 78 获赞 25 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38196407/article/details/90041760