死锁

死锁

  • 定义:死锁是两个或两个以上的线程互相都持有对方所需要的资源,导致这些线程都处于等待状态。

  • 死锁产生的条件:

    • 互斥条件:一个资源只能被一个进程占用。
    • 请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不变。
    • 不剥夺条件:任何一个资源在没被该进程释放之前,其他线程都无法对他剥夺占用。
    • 循环等待:当发生死锁时,所等待的线程会进入一个类似死循环,造成阻塞。
  • 如何避免

    • 设置加锁顺序。当多个线程需要一些相同的锁时,按照不同的加锁顺序去加锁。这种需要你事先知道所有的锁,但某些情况是未知的。
    • 设置加锁时限。当一个线程在制定时限内没有获取到所需要的锁,则会释放已经获取到的锁,然后等待一段时间再重试。
  • 死锁检查

  • 方式一:jps+jstack

    • 运行jps,查看当前所有java进程的pid
    • jstack pid 查看当前进程的堆栈状态,如果有死锁会打印出来found 1 deadLock
  • 方式二:jvisualvm

    代码运行起来后,启动jvisualvm,在线程页面会直接有一个红色的显示:监测到死锁

  • 参考地址:java命令–jstack的使用 - 楼上有只喵 (pyr9.github.io)


死锁
http://example.com/死锁/
作者
Panyurou
发布于
2022年8月16日
许可协议