00:00
各位同学大家好,接下来我为大家介绍死锁及相关死锁的排查策略和方法来。那么首先死所是什么?哪些情况会导致死锁?死锁我们应该如何规避?发生死锁以后怎么判断这个就是死锁,以及如何排查死锁。那么说到这儿,我相信以大家的基础,对于死锁这个概念。谁都可以说上两句,你要说你不懂不可能,但要说真的懂了吗?可能你的深度还不够。那么接下来,现在我们听了这么多面试录音和我们的学生去面试的复盘。第一个,请告诉我什么是多线程的死锁?现象会有哪一些?一般都答的出来第一题,那到第二题,请手写一个思索的案例给我们看看,请出写一个bug。产生死锁的bug,我们看一下,所以说你会不会。手写一个思索的代码,好,那么同学们,我们一步步来,首先思索是什么?
01:02
看这张图我们也明白对吧?说白了我们简单的读一下几个两个或两个以上的线程执行过程当中争夺资源而造成一种互相等待的现象,对吧?那么这个时候呢,就会大家呢,都卡在这儿,无法推进下去,陷入了死所,耗尽资源现场A自己持有所A,但是试图获得锁B,线程B自己持有锁B,但是试图获得所A一句话。使者自己碗里的,还惦记着别人盘子里的好的,那么同学们话不多讲,咱们代码说话,来新建一个死锁的DEMO类,那么现在呢?既然是死锁,那么结合我们这张图啊,那么干脆我们一切写的就是这张图,线程是AB,两个锁是几把?A锁和B锁,所以说在这儿呢,我们final。Object。Object a等于6OBJECT,弟兄们没问题吧?那么相当于说这就是什么AB2把锁,那么现在两个线程默认叫T1,现在我们修改叫A线程,那么A线程synchronized object。
02:07
哎。那么来现在。他的意思。就是。自己吃药。A锁,那么希望获得B锁。没问题吧,好,那么这时候A线程进来了,星空A,他现在是不是马上抢到A锁好了,那么为了保证B线程也能够启动。稍微等他一会儿,双方打个配合,那么注意这我snchize。Object闭锁,那么来各位亲这一行。变成。如果能够A线程抢到B锁成功,那么打进来以后是不是就是我们的成功获得闭锁呀?那么这要注意结合我们前面讲的可重入锁的相关知识,S同步代码块,这个是A,这个是B,这可不是可重入锁,因为不再是同一把锁了,只是A线程要争抢两把锁,A跟B好,那么这个。
03:09
完成。那接下来我们对于我们的B也一样的。他呢,自己持有闭锁。希望获得。A锁,然后现在呢,一秒钟以后,假设运行释放了,他要过来抢锁,那么B线程能不能抢到A锁,如果抢到了就说明什么成功获得A锁,OK,那么同学们大家看一下,我觉得这个案例应该是对照着我们的。需求文档的设计架构图吧。就当是。逻辑清晰没问题吧?那么接下来好不好使,我们跑一下是不是死锁?那么大家请看。A线程自己持有A锁,希望获得B锁,B线程自己持有B锁,希望获得A锁,那么大家请看我们的死锁成功通过,OK,那么这个时候我们呢,就通过这样的案例编写出了一个死锁的代码,好,那么接下来我们来看一下,那么这个死锁它产生的原因是什么?
04:09
系统资源不足或者进程运行推荐的顺序不合适,我们刚才所写的带bug搜索的代码就是故意顺序不合适,那么资源分配不当等等等等都容易产生思索,那么产生思索呢很可怕,大家请看怎么着,这个灯是不是在这儿一直亮着没有灭呀?好,那么接下来。由于呢,我们这个程序大家一看是我们自己写的,我们当然知道这是死锁,可问题是假设这个程序不是我们所写的,目前我们收到的故障报告就是说程序没有办法结束,但一直亮着,我们也卡在这儿,卡在这儿,你如何证明这个就是死锁导致的?因为现在卡在这儿,这种情况有很多呀,我写个Y要处死循环,也有可能导致灯不灭卡在这儿啊,现在我要求你证明排查出来。
05:00
这个是死锁,导致我们系统卡在这儿,好,那么接下来我们就要聊一下如何排查死锁,一般而言有两种方法,那么来同学们,第一个我们用Java jdk自带的原生命令回到我们的。Term命令终端,那么现在GPS-L,那么这个GPS那么就是相当于啊,这个GPS就等于Java版的杠EF,没问题吧,好,那么这个时候杠L。来,同学们可以看到,看哔哩哔哩。这个线程,这个程序它所对应的进程号是26736,好,那么现在我们要查故障用什么G。能理解吧,就是我们Java异常里面的那个1.printstack,那么就是堆栈里面的信息,我们我们现在要给大家证明你这个灯不灭。我们推测有可能是死锁导致啊,但是你得给我证明确实系统里面发生的死锁。OK,把我们的推测要变成通过预演算来获得实际的证据,那么来写入我们的进程编号,26736。
06:09
7361回撤,大家请看,放一个什么思索,哎,这款才能够严丝合缝,逻辑清晰,证据明了,那么大家请看,确确实实发生了思索怎么弄的?B,大家请看,等待着26BB0。A锁着26BB0,听懂这个意思了吧?请看wait lock wait lock双方互相持有,互相等待,那么这个就是我们用Java的原生命令,那么第一个叫GPS,第二个呢,叫我们的J,叫进程编号。第一步查出这个命令当前这个程序,它的程序的进程编号是多少?第二个来看一下它的进程编号里面打印出来的。占信息好,那么如果你觉得这个比较麻烦,我们还有一种更简单的图形化来吧,那么同学们,JO。
07:05
Java控制台,OK。那么此时找到我们自己写的程序,一般就是我们公司的报名,你看哔哩哔哩26736连接好,那么这个时候不安全的连接没关系,找到我们这儿线程,那么大家看这有个按钮叫检测思索来。大家请看有没有,是不是有有子锁的话,他这儿会给你显示出来BA和A,那么大家请看BA拥有者A拥有者BA是不是互相持有和等待,哎,所以说这种图形化或者是命令的方式才是我们检查词组通用的流程和策略,那么希望大家在面试中在简历上都可以写一下,好,那么各位同学我们对思索就给大家介绍到这儿。那么接下来我们来。
我来说两句