线程死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
线程死锁发生的必要条件:
1、互斥性:在同一时间,资源只能被一个线程占用,其它线程要请求资源只能等待。
2、不剥夺性:线程获得的资源不能被其它线程强行夺走,只能就该线程主动释放。
3、请求和保持:线程至少获得了一个资源,然后又请求新的资源,但是对自己获得的资源保持不放。
4、循环等待:多个线程之间形成一种收尾相连的循环等待资源的关系。
那么我们如何判断死锁呢?
第一步:通过jps -l 命令来获取对应的进程pid。
第二步:通过jstack -l pid来查看进程是否有死锁。
开发过程中如何避免死锁的出现?
在实际的开发中我们要尽量的避免线程死锁产生的可能性。
1、所有的线程对锁的加锁顺序都按照相同的顺序进行加锁。
2、当一个线程获取到锁的时候设定一个过期时间,到时之后自动释放锁资源。
3、定时做死锁检测。
本文借助:https://ke.qq.com/user/index/index.html#/plan/cid=3202242&term_id=103330052 中V哥的视频。