并发编程 死锁

本文将介绍并发编程中的死锁问题。

一、什么是死锁?

死锁是指:一组线程,每一个线程都在等待只能由其它线程引发的事件,结果就是所有线程都阻塞了。

二、死锁条件

  • 互斥:资源同一时刻只能被一个线程占有
  • 占有等待:线程占有一部分资源,等待其它资源
  • 无法中断:线程已经获得的资源除非主动释放,否则无法被其它线程强行剥夺
  • 循环等待:若干线程之间形成一种循环等待资源的关系

三、死锁应对策略

  • 一次性申请所有资源,而不是在执行过程中逐个申请
  • 当线程等待资源超过一定时间时,主动释放已占有的资源,等待片刻后再重试
  • 规定资源之间的顺序,申请资源时,应该按照顺序申请,释放资源时应该反序释放
  • 检测死锁的发生,发现死锁后,主动结束死锁链条中的某个事务

参考

  • Java 并发编程实战