00:01
好,那各位同学我们继续。并发里面。基本上天天。河边走。不可能不湿鞋。思索。那么当然呢,只要大家学到这儿,都会出现这种问题。你抬头学技术,我原来。很多都是三三制啊。你怎么成长成为高手和熟手?我讲过第一个理论,第二个编码,第三个小总结。另外一个三餐就是这个东西你懂不懂,比方说我现在问你们思索肯定讲过同不同意。大部分同学都能说出个道道好。后面两个什么好,你懂这个知识点了,写一个,你给我写一个会导致思索的程序,翻常写。好,导致死锁以后你怎么排查,怎么修复?基本上我问了90%的九零后,我面试过这么多。二和三空白。所以说就是随着时间的推移,又是我说那句话,他永远是一个经验,用三年,不是有三年工作经验上不去,这个内功上不去,就是懂了以后他再也不动手去写。
01:08
来吧。看着我们来,你就按照杨哥这个套路。彻彻底底。按照这种方法论。十所都懂。什么意思呢?首先是什么?产生思索的主要原因。两个或多个以上的线程执行过程中因争抢资源而造成的一种互相等待的现象,同学们,这个好理解吧?说白了,就比方说我现在跟王帅,我们两个各自持有一把手枪,指着对方,我跟他说你先放下,他跟我说我先放下,你先放下,我先放下了。都互相等待对方,那么这个时候你等我,我等你,卡死好。注意,若无外力干涉。明确的说了,程序上出现死锁基本上解决不了,只能停下来以后重新改,因为你代码本身写的就有问题,好比你从娘胎里出来就是双头儿。
02:10
要么都死了,要么做这种手术砍了他一个。充足满足不充足,那么这个时候。陷入死循环。简单一句话。我说这张图秒懂吧。线程A自己持有所A,但是他尝试着试图获取线程B,那么线程B自己持有所B,尝试获得线程A好。回答我,我们都懒得说了,因为你们去年讲讲过一说这个思索,这个理论,是不是一分钟你就懂了。这你觉得你就真懂了?差的远,那这个就是我说的学习的五重境界,学到皮,学到肉,学到骨,学到精,学到魂。这个连皮都谈不上。你如果你说哇,十所就这么回事,你除了会画这张图啊,这张图干嘛小学生都会画,那你写个四所的代码我看看。
03:01
然后故障排查。你只有这样,你的知识体系才全面。不废话。怎么来的?资源不足啊,经常推进顺序不合适,巴拉巴拉不废话,理论知识讲了没意思,OK,二话不说,重点在这儿开打。写个思索。还查我看看。那么呢,通过我们的Java的底层命令,牵扯出我们后面GVM1大套下半场。高频比面试题相关的知识点来。首先。有没有种感觉,那这张图全班同学你们都懂,OK吧,好,那么接下来。我们干嘛呢?拷贝。读题目。首先几个。我见过最神奇的同学给我写了个什么单线程的思索?
04:02
这个我就很诡异了。没人跟你抢,怎么可能会有死锁这种情况?但我写了一个行程,说,老师,这是我写的交给我的作业。这事你就搞不懂了,好比五星红旗。对吧,既然叫五星,你给我搞了个八个星星,这这这这不对啊。两个啊,二话不说。杨哥小口诀抖起来,线程操纵资源类对不对?Class。Thread。那么呢,这个时候那么干嘛呢。嗯,后的洛克吧,好。石油所的这个现场。那么好。Implement。Roundable兄弟们,没问题吧,那么直接。过来。O了,这我们的run方法,甭管它。那么我干嘛呢?现在。两首先我们要明确最少几个线。
05:02
O吧,现在变成什么?看到刚才那张图我就不打开了,我自己持有我自己的锁就是。我还抢别人的俗称,是不是叫吃着碗里的还端着,还看着锅里的,那么所以说两把锁。String洛A。Private string,那么这个时候look b兄弟们没问题吧?干什么呢?等会来用,注意哈,切记就这句话,经典的就是持有自己的锁,还妄图得到别人的锁。另外那个县城也这么想的,吃着碗里的。瞧着玻璃的,什么欧的?做大。两个。那么言下之意,我后面提两个线程,是不是传进来各自的锁呀?好,要模拟出持有自己的,并且盼望获得别人的,那么好怎么玩呢?你看这句话都都等于一说,都点头,你用代码翻译出来。
06:04
干嘛呢?什么情况?那么这个时候。什么意思呢?这个线。自己持有。我们的。抱歉。这个命名不是很规范,这个是不是应该是。小写才对啊,兄弟们,没问题吧?不好意思,刚才写以前写洛克写大了。那么这个时候两个。消息,我说我怎么感觉看着怪怪的?诶,因为首变量命名,首字母都得小写哈,好。干嘛呢?自己持有A锁。同学们。这一步。能跟上。尝试获得。就是我说的,我自己持有一个是不是要尝试着获得别人的,那么洛克。
07:06
怎么来?为了保证锁的效果更明显。两秒停一下没什么,主要就是为了暂停一下,听懂了吧,为了看到锁的效果更明显。我干嘛呢?这个时候来了。那么呢?跟肝一样。自己持有进来的话,那么这个时候我是不是落克币了。那么尝试,我要持有。什么?洛克A,同学们这一步能不能跟上那么好,那么接下来那么。怎么玩呢?Look a。Look a。
08:02
洛克B,那么呢?我们的。洛克B,兄弟们能跟上好两线程。我干嘛呢?Thread AAA现场。这个时候请看。我们都知道。这或这是拉姆达表达式的写法。我们现在干嘛呢,写在外面了,我这儿是不是。你有一个实现了run接口的实现类。又进来那么好。A线程干嘛呢?洛克A。洛克B,兄弟们,这一波能跟上,但是下一步反过来。洛克A能不能理解?自己持有哪一个?我要什么?尝试着获得另外的一个人的。
09:03
那么这个宣传。兄弟们。Bbb。秒到。OK,那么来这个时候我们呢,干嘛呢。简单的运行一下。请看。Bbb线程。自己吃药变。尝试获得所A正确吧。AAA线程自己持有A,尝试获得B,注意。再次证明了。你点start以后,这个线程不是立刻马上就开始,我们是先A后B,原代码写的里面是谁先B后A,那么不服气同学们,我们再关了,再来它一次。你看。这个结果是不是它的调度不归我管,听懂了吧?但是理论我们可以看到线程A自己持有AA有A正常吧。吃着自己碗里的爱。
10:00
看着锅里面的B一样,Bbb线程自己持有B,尝试获得A,是不是我刚才所讲的这张图啊?你看你学技术,你要学到第二板斧,你不要骗自己,你说我懂了,怎么可能没写过代码就不懂。或者说至少不申入。很多人就是看完你看他很勤奋,他在用他自己战术上的勤奋掩盖他战略上的懒惰,从来不练看着他们周末看这个书,跑去星巴克加班,然后拍一张微信朋友圈,你只是在朋友圈里面努力过。你在这看了一下午的书,还不如你在这听我讲一个case啊来的实在和痛快和深入。这就是我说的嘛,你只是在朋友圈里面努力过。来。得了长生思索,你怎么知道?没通过吧,马上锁了,接下来问题是你咋排查?我你先别说,你现在给我证明好,如果现在这个运维他不懂Java,一个Linux运维工程师不来说啊,你甭不懂,我不懂,我现在只知道程序运行不下去这块。
11:10
会不会是Y要处死循环?你怎么知道是思索?你要正面。你要让人家哑口无言,我以为我们是理工科。证据说话,讲出处。那么这个时候干嘛?来。第三步,标配版。彻底把人家打了,就是你以后在项目组说话,就是你说话了,别人不会怀疑。阿里的大神有一个直接,你想如果他的代码写错了,只有一种可能,编译器错了。神吧?那这种情况下呢,你见过高手以后,你就明白了。你们干嘛?我在公司那么多年,就学到一句话,就是你要不要不出刀,你要出刀,你要拿出证据,你要人家啊,行了,你需提交的这份故障报告照着做就行了,不用怀疑,这个就是理工男的最高境界,简单可依赖,因为你够专业。好,那么接下来。
12:01
两大命令证明并解决。首先,你要先证明。干嘛呢?这个只是卡在这儿,他没往下走,那你怎么知道这就是思索呢?死循环怎么办?别的原因产生,别说老师,我现在肚子疼。是肠胃炎还是胃炎?下面。回到杨哥讲过的以前的gbm。复习干嘛?加va。兄弟们还记不记得这两个命令?一个叫GPS啊。当然我我喜欢读勾啊勾,还有一个state state。包括其他我们都讲过。这个。和这个。念叨,念叨。好,我们忘了的同学呢,我一句话给你讲懂。勾什么意思啊?注意。看着。
13:02
一个东西系统。叫Linux。Linux大家一定用过一个东西叫杠CF竖线叉叉叉秒倒。那么现在我们在Windows下面干嘛也有类似,应该准确的说,Windows系统。下的。Java。运行程序。那么呢?也有类似PS4的。查看。进城的。命令。但是。目前我们需要。查看的只是Java,那么言下之意,什么概念就出现一个OPS,就等于Java版的。秒倒。那么请问。LS。我们都知道。Linuxx。
14:00
绝对熟悉吧,那这个你要没用过。我把你们剁了。那么接下来这个问题呢,一样。GPSL。那么呢,你有两种方法。第一种,那现在给你惹祸的是不是这个思索这个程序。你呢,干嘛呢,收音浏览器里面。干嘛去这个地址下面没错吧,然后呢,你现在是不是要什么。CMD进去,然后CD,叭叭叭叭叭叭,这一堆恐不恐怖?那么呢,你好,回答我同学们,我们现在没办法跟我讲是不是一个窗口,然后干嘛CD是不是我们的D盘,同学们这个没问题吧,一直。进到这个目录下面,或者你要把这个目录粘出来,是不是CD对不对。可不可以?不可以。这么做是傻逼。这个时候听好在这儿CMD。
15:01
是不是一步到位,直接就到了?能跟上。这是第一步。第二步。我说要切换回这个Windows系统。也不可以这么做。你要打开一个窗口,你慢啊少。Idea是不是自带的刚才的CMD窗口?请个平安。不一。GPS-L1回车。大家请看。给我惹事儿的县城。是不是叫带洛代?干嘛?现在运行的一个,你哎,你你怎么知道找这个。回答我。报名你总该知道吧?啊,这事是你惹的,其他那几个都是什么系统默认的或者D的工序,干嘛通过勾啊,看Java的后台运行程序找谁记得这货,这货就是进程编号听懂。好。
16:00
接下来。第二个命令。J。啥意思啊?Try catch finally里面是不是有个1.printsta,就那个sta,就是Java的异常对账信息给我打出来,那你打哪个。进程编号,说话听懂。那么第二步go sta几?9636首先我先看看出事的这个进程编号,用Java命令查查,如果Java命令查的出来就说明什么,有可能是Java程序惹的祸,你现在这个程序慢了,它不见得是Java惹的祸,有可能数据库惹的祸呢?缓存中了的惹的祸呢?网络故障惹的祸呢?防火墙病毒惹的祸呢,多了去了。那这个时候你先证明一点点排除啊,这个特别难,但是对你的综合技术能力要求特别高,那么答案同学们一回车。Find one,戴德洛克马上回去跟运维说,我把整个故障报告给你打出来,一句话,是不是100%堵住人家的嘴?现在卡不进去,一定就是思索导致。
17:02
这空出拿命令打出来的,那你怎么知道呢?兄弟们。往上看。爽死你了,这么多对吧。重新来一次。Java吧,做的好不好,Java的站运行信息,对于这个线程的list above,通过上面的一个小总结,一条线还给你分割啊,我当时我看JAVA8的时候,再想起JAVA6那种烂情况,我感觉JAVA8好爽。我现在就觉得你要不装加八很可惜哈。冰冰,现场请看。锁着2A3连。AAA线程,我正在等着2A3连对不对?BB线程,我正正在等着二九。F8AAA线程,我正在锁着29F8,所以说AB2线程之间找到了一个look,你把这个故障报告抓出,邮件上一发,你们的运维。
18:03
即除除非他是神经病,否则他一定要明白了这小子定位故障,他故障现象导致原因的分析,这小子应该是靠谱的。你跟我讲这个是不是没有人敢怀疑你?OK,那么至少我们就明白AB这两个线程产生了死锁,那么干嘛?重启服务器,停下程序,你不要说什么这么去修复啊,这不不不大可能听懂了吧,这就相当于你天生出来手上长了。你只少我们长了六个指头,那第六个你只能把它剁了,你比如说那塞回去,你有哪个生哪个女的,生完孩子以后说不想要了再塞回去的,不可能。干嘛天生弹起,停下来,找到你对应的业务逻辑,进行对应的修改和整理。然后让思索避免。OK,那么所以说小总结。代码。干嘛呢?同学们,晚上回去写一下,你不要小看我,就算你现在听懂周洋写的,你不相信,你自己写个思索,你写着写你写不出来了。
19:01
CC easy,嘟嘟hard,知易行难。第二个。解决两部GPS定位。J查看进程号,那么你干什么?就是刚才我为什么看你,就就比方说你要去大场面是要问你的故障,哎,项目经理直接到什么啊,行了,你说点我不懂的,你就告诉我你排除故障,你除了会去看后台控制台监控的那些东西和看你的日志,你还没有用过其他的故障排查手册,你说没有。啊,行了,你遇到的故障的级别也就这么回事,如果你说那必须啊,要用Linux底层命令。比方说a state state free Dis等等,或者我们要用GPS和G等等,OK。突然发现问了十个,那前九个都是跟我说是看日志,结果发现会有一个抓内存的,看底层源码的,OK,你从你排除故障的这个工作经验,我就知道你是要我,你是我要找的人,这个时候你才能到我的碗里来。
20:01
那么呢?GPS最后看一眼我们干嘛呢?这么一个进程编号,大家看这两个没问题吧,好,那么死锁的相关的什么。编码及定位分析,那么同学们下课可以去练一下。
我来说两句