1.3w字,一文详解死锁!(3)

简介: 1.3w字,一文详解死锁!(3)

2.死锁产生原因


通过以上示例,我们可以得出结论,要产生死锁需要满足以下 4 个条件


  1. 互斥条件:指运算单元(进程、线程或协程)对所分配到的资源具有排它性,也就是说在一段时间内某个锁资源只能被一个运算单元所占用。


  1. 请求和保持条件:指运算单元已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它运算单元占有,此时请求运算单元阻塞,但又对自己已获得的其它资源保持不放。


  1. 不可剥夺条件:指运算单元已获得的资源,在未使用完之前,不能被剥夺。


  1. 环路等待条件:指在发生死锁时,必然存在运算单元和资源的环形链,即运算单元正在等待另一个运算单元占用的资源,而对方又在等待自己占用的资源,从而造成环路等待的情况。


只有以上 4 个条件同时满足,才会造成死锁问题。


3.死锁排查工具


如果程序出现死锁问题,可通过以下 4 种方案中的任意一种进行分析和排查。


3.1 jstack


我们在使用 jstack 之前,先要通过 jps 得到运行程序的进程 ID,使用方法如下:


微信图片_20220120215843.jpg


“jps -l”可以查询本机所有的 Java 程序,jps(Java Virtual Machine Process Status Tool)是 Java 提供的一个显示当前所有 Java 进程 pid 的命令,适合在 linux/unix/windows 平台上简单查看当前 Java 进程的一些简单情况,“-l”用于输出进程 pid 和运行程序完整路径名(包名和类名)。


有了进程 ID(PID)之后,我们就可以使用“jstack -l PID”来发现死锁问题了,如下图所示:


微信图片_20220120215915.jpg


jstack 用于生成 Java 虚拟机当前时刻的线程快照,“-l”表示长列表(long),打印关于锁的附加信息。


PS:可以使用 jstack -help 查看更多命令使用说明。

相关文章
|
存储 安全 Java
Java多线程基础——两万字详解
进程简单来说就是正在运行的程序,是可以通过双击执行的.exe文件,打开我们电脑的任务管理器,可以看到我们的电脑正在执行的进程,目前我们的电脑都是多进程模式。
125 0
Java多线程基础——两万字详解
|
缓存 Oracle 安全
2.5W 字详解线程与锁了,面试随便问!!(1)
2.5W 字详解线程与锁了,面试随便问!!(1)
137 0
2.5W 字详解线程与锁了,面试随便问!!(1)
|
存储 安全 Java
2.5W 字详解线程与锁了,面试随便问!!(2)
2.5W 字详解线程与锁了,面试随便问!!(2)
104 0
2.5W 字详解线程与锁了,面试随便问!!(2)
阿粉写了八千多字,就是为了把 ReentrantLock 讲透(一)
啥是可重入锁呢?比如:线程 1 通过调用 lock() 方法获取锁之后,再调用 lock 时,就不会再进行阻塞获取锁,而是直接增加重试次数。 还记得 synchronized 吗?它有 monitorenter 和 monitorexit 两种指令来保证锁,而它们的作用可以理解为每个锁对象拥有一个锁计数器,也就是如果再次调用 lock() 方法,计数器会进行加 1 操作
阿粉写了八千多字,就是为了把 ReentrantLock 讲透(一)
阿粉写了八千多字,就是为了把 ReentrantLock 讲透(三)
啥是可重入锁呢?比如:线程 1 通过调用 lock() 方法获取锁之后,再调用 lock 时,就不会再进行阻塞获取锁,而是直接增加重试次数。 还记得 synchronized 吗?它有 monitorenter 和 monitorexit 两种指令来保证锁,而它们的作用可以理解为每个锁对象拥有一个锁计数器,也就是如果再次调用 lock() 方法,计数器会进行加 1 操作
阿粉写了八千多字,就是为了把 ReentrantLock 讲透(三)
1.3w字,一文详解死锁!(8)
1.3w字,一文详解死锁!(8)
94 0
1.3w字,一文详解死锁!(8)
1.3w字,一文详解死锁!(10)
1.3w字,一文详解死锁!(10)
75 0
1.3w字,一文详解死锁!(10)
|
监控 Java
1.3w字,一文详解死锁!(4)
1.3w字,一文详解死锁!(4)
95 0
1.3w字,一文详解死锁!(4)
1.3w字,一文详解死锁!(2)
1.3w字,一文详解死锁!(2)
118 0
1.3w字,一文详解死锁!(2)
1.3w字,一文详解死锁!(13)
1.3w字,一文详解死锁!(13)
93 0
1.3w字,一文详解死锁!(13)