Java死锁发生的必要条件及如何避免

Java死锁发生的必要条件及如何避免

死锁的必要条件:

  • 互斥条件:一个资源同时只能被一个线程所使用。
  • 请求与保持条件:例如请求第二把锁的时候,保持自身的第一把锁不去释放.
  • 不剥夺条件:进程已获得的资源(例如已经获得的锁),没有外界的力量来去剥夺这把锁。
  • 循环等待条件:两个线程时,是互相等待释放锁。多个线程时, 是头尾相接的等待。

如何避免死锁:

  • 保持加锁顺序:当多个线程都需要加相同的几个锁的时候,按照不同的顺序加锁那么就可能导致死锁产生,所以我们如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。
  • 获取锁添加时限:死锁还有个产生原因就是因为出现了获取锁失败无限等待的情况,如果我们在获取锁的时候进行限时等待,例如wait(1000)或者使用ReentrantLock的tryLock(1,TimeUntil.SECONDS)这样在指定时间后获取锁失败就不会等待。
  • 进行死锁检测:我们可以通过一些手段检查代码并预防其出现死锁。如JDK自带的jstack和JConsole工具。

你可能感兴趣的:(Java,开发语言,java)