系列 4:P9:【JVM调优实战】著名的三色标记算法 - 马士兵北京中心 - BV1VP411i7E4
okK这里。CMS。他是这么来玩儿的。他的原理呢也非常简单。虽然说从最底层角度讲,它由6个阶段构成,但是你跟面试官聊基本聊够聊聊通这四个阶段就可以了。这四个阶段分别是什么呢?分别叫初始标记、并发标记。
重新标记并发清理。11。1点来讲,他很容易理解。这里面最难理解的是这个阶段,这个阶段就是著名的三色标记算法。今天看时间吧,好不好?现在已经10点了。看到里。呃,这是。它的四个阶段四阶段是什么呢?
初始标记初始标记的意思非常简单,就是找到根儿上的对象,找到那些root对象。大家知道我们垃圾回收过程就是从根上开始找。先把这根上的对象找到这部分叫初始标记,注意它依然是STW的。
但是他SDW时间会非常短,为什么?😊,原来的SEW6时间是要你把所有工作全干完,所以它时间非常长。现在这个SW6时间,你只要找到根上就可以,根上对象毕竟没那么多,所以。这个SCW时间特别短。
一一般来说没有多长,所以没有关系。接下来就是最重要的阶段。这个阶段是什么?这个阶段是我们的业务线程继续,不管你有多少个业务线程,几十个,或者你们哥仨,你们几十三随便玩儿。你们在哪玩的时候,我垃圾回收器。
就在工作了。垃圾回收器开始工作,我就开始找哪些是垃圾,哪些是垃圾,哪些是垃圾的是垃圾。你一边玩着,我一边清着,我一边标记着啊,不能叫一边清着叫一边标记着啊,这个是垃圾,这个是垃圾,这个是垃圾。
这个不是垃圾,全给你标出来。😡,等我标好了之后,注意它一定会产生错标。错标主要有两种情况。第一种情况是。好好听我讲,原来这哥们是个垃圾。原来这哥们儿是个垃圾,但是呢运行过程之中呢又有一个引用指向头了。
okK他就变成不是垃圾了。这种的你后面不能把它给清掉,你得把它修正过来。还有的呢,原来这哥们儿不是垃圾,有人有引用纸箱的运行过程之中呢。好。引用没有了,它又变它就变成垃圾了。好,这是两种经常见的情况。
这块大家能呃听得懂吗?这块是最难的内容了,concurrent里面就是CMS里面最难的内容。嗯能能盖到吗?嗯。讲错了吧,宋海强。一定是你错了,你放心,我这不会错。凡是怀疑老师错了的,你们都错了。
引用没了,怎么又会引用回来,我一会儿讲给你听。😊,那个叫做先引用了,然后我们的垃圾回收器以为引用没了三色标记,我一会儿讲给你听好吗?引用没了也能引用回来。我告诉你。😡,虽然情况比较特殊,但是完全可以。
比如说缓存你命中了。然后你那些没命中的,你要清掉了,突然之间他又来了一个命中了。比如说你重写了finalize方法,原来死了对象你又给他复活了。😊,放心啊,我这儿没错,我这没bug。
成员的bug就像自己的内裤不会展示给别人的,放心。Okay。总而言之,会发生两种情况。就这两种。这两种情况最终都要进行修正。好,这个修正过程要重新标记。修正过程不能让原线程继续,业务线程再继续的话。
那你不断的新错误再产生了肯定不行。所以从整个的CMS角度,一共有两个阶段是STW的,一个是初始标记,一个是重新标记。毕竟出错的不会特别多,所以重新标记的这个STW时间也不会特别长。好。
最后呢我标完了确确定标清楚了。这就这个哥几个是垃圾,那哥几个不是垃圾,好嘞。并发经历清理完了之后,下一步。好,这是大体的过程,这里面有很多细节,最差的最多的细节就在这儿叫做三色标记算法。
著名的三色标记算法。勾浪采用什么算法?狗浪。知道吗?三色标记。是。那小点点问SW了怎么能出错?大哥,你看看这是SCW吗?我说的是出错,是在这出的。嗯。😊,三色标记勾浪也是啊。
所以你不要说那个java超勾浪,别扯。好嘞,下面我聊我我详细给大家讲。这个问题可以吗?就这讲这有点难。今天我告诉你,我讲完三色标记就没有时间讲G one。
就没有时间给你们讲G oneZDC she能doahexllent。你是想听Jg还是想听三色标记,你们自己挑。都要。Okay。我能做广告吗?我告诉你想听全了,找老师报VIP来。我VIP啊告诉你啊,那个。
我先不跟你说,我们VIP课程有多牛,我就直接先跟你这么说。😊,就是我们的VIP。全中国我们要说第二,没人敢说第一,我VIP课好吧。呃,内容先给你解释,我们VIP课有一个非常显著特点。我们叫做快速有效。
注意快速这件事儿超级重要。叫做不仅有效而且快。有效。而且快。快点写错了。姚急,我今天肯定给你讲完,不管是三色。还是。还是还是Gone哪个都成。快速有效。这是我们原来VIP学员,全部都是真实的截图。
你自己随便看。非常非常的给力。呃,我我我大概给你打开几个看看,好吧,这这好像是最近的啊。如果你要是跟着我们。
每天的课在跟的话,你会发现这个页面会天天更新,每天都有新的这入职一车涨薪的6K啊,课程没有帮助啊,课程是很有帮助的。其实不只是面试,实际工作也很有帮助啊。😊,这个是我们呃一个女孩入职京东,涨薪50%。
呃。其实给大家看呢,你就你会发现呢老师呢除了给大家讲课之外,还给大家。告诉大家怎么去面试,怎么去对付面试官,怎么去跟HR聊啊等等。最关键这哥们儿这姐们儿有点后悔。果然像你说的,我是少要了少要了。
我是我要少了,一分钱没砍,直接成了啊。他原来十6要了23直接成了,要太少了,亏了。一年运维转闸了,低薪涨到30万。他原来那个他原来是一年一年的运维经验转到粘了。经过我们我。
然后赵老师周老师在一个群里头不断的辅导他,看见了吗?这一个群里头是6个人,6个人里头只有一个学生,剩下全是老师。然后一年日月为准的占了,地薪给干到了30万,这就我们课成特点啊。课程特点叫做特别快。
然后呢又又有效。好,听我说,我先简单跟大家聊一点点课程的特性。不过别着急,我一会儿就会给大家讲后面的内容。呃,所以我们课程来讲呢,有这么几个特点。第一个特点呢叫做课时特别长。我们课时超长。长到什么程度?
我们已经讲完的课大概是已经是2000个小时左右。
这个是我们讲完的课啊。这是我们讲完的课。如果要从头拉到尾的话呢,基本就没完了。你你你可哎。啊。从最基本的。Yeah。Yeah。到。太多了。继续啊往下拉。到进阶的到网络。
到Junit注解反射前端的没稳的嗯多线程的啊。我今天给大家讲的呢,实际上是JVM的部分啊,所以这里面每一堂课都是两个小时,这这内容非常多啊,reis zookeeper。
myxico高并发activeMQsp boot一级流量电商嗯n。好,ELK区块链my catDBC,然后架构算法项目,网约车第一节二版3版TDDspring cloud。然后整个架构大数据还有。好。
不玩了,不演示了,太多了啊。好,我跟你说,就是这个课的特点呢,这是第一个特点就来了。😊,第一个特点叫特别长。好,第二个特点呢叫特别深。因为只有成才能比较深,原因是什么?你课时不够,我想跟你讲特别深入。
那不可能的。第一个超级长2000个小时以上,有同学可能不明白这个概念。我直接告诉你,同学可能大多数的凡是跟你说,每周四每周三次课,每次2小时,你自己去算去。他们这课讲一年差不多也就300个小时左右。
我们是2000个,是它的7倍。我们要照他的速度讲,得讲7年才能讲完。但是我不是这么讲的,我们讲的非常的深入,我们只有讲的课时特别长,才会讲的非常深入。我会深入到每一个算法。
比如说我今天给大家讲的三色标记,我们要给大家讲的G one,我会跟深入到每一个算法,每一个源码,知道吧?深入到那个hosport的源码来跟你聊G one里面到底是怎么进行分区的。好,听我说。
讲的这么深入,同学们的第一个观感一定是说大哥,你这个太过分了,我怎么才能学得完啊?就这是我们课程最大的特点,就是我不需要你学完,你也不要学完,你慢慢学。你首先拿到你想要的。
然后再跟着老师慢慢练这辈子你就跟定老师了,永远让你站在技术最前沿。我们怎么教你呢?这么来教。你入学之后。我我们有呃专门的老师来了解你的什么呢?了解你的基础。了解你的诉求。帮你设计一条最短达到目标的路线。
沿着这个路线进行一对一的定制学习。可以这么说,我们是一个大学的选课制,一堆的知识点。一堆的项目。作为老师来说,你想拿到一个,比方说你想涨薪5000最简单的要求了。3个月涨薪5000。
老师就给你拿出A加B加C,再加一个项目搞定。举个最简单的例子,作为社招生,你已经参加过工作了,你想涨新的6加2。3个月之内搞定。好,作为。比方说大学生,我想进大厂7加1加1。
最好的是大二和大三跟着我们练,这是最好的时间。基本上你学校不是太差的,保定大厂。好,老师,你说我特别着急,我已经辞职了,我想短时间内回到行业,涨顺带涨点薪水,一个月之内3加1搞定。老师,我想全系列提升。
我们MCA架构师带着你一个项目,带动你N多个知识点全系列提升。老师,我零基础。A课程一直到MCA。从零基础一直到进阶半年左右。老师,我那个想进某一个特别牛叉的厂子,他特别看重算法。左老师的左神算法课。
左神算法从最基础的数据结构,最基础的算法开始。到BAT体格的刷题班。搞定。好,这就叫做一对一定制学习。全网唯一,没有第二家。笑容。我的人说老师这是能行吗?自己看效果就行了。
25岁英语专业5天突击进携程,携程回复19乘15啊这个。他那哪说了5天,我记得啊。看了吗?5天后你面试携程,也是想突击一下,定制一份学习规划。对,5天突击携程就直接给了19乘15。有逼吗?为什么?
因为我告诉你了,注意先学脉络后学细节,老铁们。学习方法叫超级重要。滴滴神舟两个offer。大专生不幸错过阿里,暂时入职申通申通,他为什么不幸错错过阿里的?我告诉你。
当时啊他在入职申通的时候面试阿里的那个HR给连着给他打了8个电话,他都没接着。惨了,不然就进阿里了啊。嗯。阿里三面的时候正在四面的时候打了两两次,8个电话都没接到,都在面申通,太惨了。史上最惨大专生。
三轮面试进入腾讯。这是明哥给做的指导。其实从这里面你会发现,我不知道大家发现没有,在这里面呢会有老师的大量的指导过程啊,我的民歌的连老师的、周老师的、曹老师的都有。左老师的啊全有。呃。
有很多时候呢就是大家伙在学习的时候,很多人的学习他没有方法。他也不知道把时间一小时,我该用在这个地方呢,还是用在这个地方。我是去抠这些细节呢,还是去掌握整个脉络呢?他根本不知道他不知道重点。
所以全部都浪费了,太浪费了,不要这样。在咱们这儿有一批牛逼的老师就直接带着你。今天你该学啥,明天你该学啥,啥你都不用想,你人过来,我就让你长薪,就这么简单。你只要人过来听话就行,你听话我让你学啥。
你学啥剩下的什么怎么面试,怎么写简历,怎么优化简历,怎么去投递这件事你全都不用想,全交给老师就行了。我就需望你做到一件事,听话。以前有人已经吃过这个亏了。我记得我们有1个30多岁的女生,知道吧?找找。
哇,这个。看到吗?哦,这是39岁的一个呃小伙儿,这是大大专专科学历。薪蕊翻了一位啊,他只要听话就行。OK。😊,是。还有一个看看这个了吗?38岁大龄女成员,年薪4万,听话就行,就怕有那些不听话的。
就是我因为我知道我作为老师这么多年的教学经验,我知道你应该把重点放这儿,你就拿到大厂offer了。你应该把重点放这儿,你就轻松涨起薪水来了。但是你是自己是不知道的,我一会儿学他一会儿学习,一会儿云计算。
一会儿学习一会儿大数据,一会儿学习,一会儿后端感了兴趣聊聊前端又有这个有时间了,聊聊shall,你扯淡呢。集中精力工益点。好,把这点躬身了,比什么都强。而这一点功在哪里,每个人其实是不知道的,我们知道。
今年重点。大厂的重点是四个方向,你们知道吗?我一说哎,我知道你不知道。所以老师给你带来的是什么呢?你原来是带来的你的你的你的这种。呃,发展机会,改变你人生轨迹的机会,知道吗?什么叫人生轨迹?
就是你原来是这种路线,如果没有人带着你没人指点你,你就是这种路线慢慢往前走,到一个程度开始往下跌。跟着老师走,跟着我们20位左右的认准了。因为课堂上有很多很多抄袭我们的,知道吧?
但是他们没有这种这么多的老师,也没有呢一线大厂的这种工作经历。一线大厂工作经历很容易就能找着的。比方说他说在阿里工作过,你问他花名是啥?阿里一查就能查着,知道吗?比如说你想问我们老师的画面。
随便问黄老师画名博熙自己去查去,一定能查着。我们20位一线大堂的老师带着你,你的人生曲线是这样子的,所以别后悔。千万千万抓住呃,就是跟我们跟跟我们飞的这个机会。OK。呃。
我们课程呢大概是每个课时在55块钱到7块钱。呃,你不要看总数,因为人家的课时是300个,知道吗?人家课时50005000多到6000多,但是你自己算一下,人家每课时是20块钱到30块钱。
我们每个课时5块钱到7块钱,性价比超高。同一课堂都受不了。同一课堂说不行,你们再这么玩的话,我不允许你们送这个送那个,不允许你们把这么多的课时怼在一堂课里。Sorry。到目前为止,腾讯可能受不了。
一直在逼我们拆。目前还没有还没有拆拆开。如果要拆开的话,我告诉你MCA会拆成P5P6P7P8。四个可,但就不拆了啊,现在不拆。全给到你,因为有的人的基础不一样,有些人认为他具备P7冲P7水平。
实际上他连P5的内容都没掌握住。我可以这么说,在座的诸位,99%的人有一些屁股的最基本内容,你没有掌握住。比如操作系统底层,比如我就问你0X80的标用过程。80终端调研过程,这是阿里P9面试的一道题。
你能答出来。很多很多人都答不出来,好吧。哪个计存器放的什么参数,你能答出来,你答不出来。这是我们听话的同听话的同学看到了吗?我特别想在公开课的时候能够多影响一些人,让他们在职业生涯规划中尽快走出迷茫。
但是人家会以为我是兔儿,所以只能先忍着啊,你别来了,没事儿。托儿呢到处都有,不用,我们这没有托儿,也不用当托儿,不需要VIP学员来这当托儿,直接看结果就行。半年涨了9K的。
滴滴快手双offer的。这个没有加载完啊,加载完的话就太多了。还有像特特别有人的,就特别的那种那种那种有什么呢?有有有疑问说老师我大专能进大厂吗?
我有很多每次每次讲这课的时候都有都有人问我说我大专时候能不能进大厂。有这种疑问吗?有这种疑问给老师扣个一来,我认识一下。陈润基对,石家头,没错,刘志祥。我给你搜一下啊,我不太想跟你聊行还是不行。
我给你搜一下。
这个是大专生,不幸错过挨里赞术这进行申通的。其实你刚才看到过了。阿里已经给他在四面了,能不能进啊?有绝对有机会。这是大专学历,收到多家大厂的offer看了吗?一鸣哥,非常感谢帮忙P开简历。
也感谢我们马上教育的课程啊,接触到不少的东西。😊,按照周老师的说法就认知偏差了。经过三周面试,我目前已经收到了不少的offer,后期我会继续学习,真是想不到大专学历的,我也不再只是那种中小型公司。
喊会去面试。所以小伙伴们啊,有很多大厂有一些大厂啊,是他是不太在乎学历的。一线大厂,我们认为中国有一中国IT界有10家左右的一线大厂,他们是头部。那么这十家大厂里头呢,有几个是不在乎学历的。
分别是阿里、京东、滴滴,这几个不在乎。当然,再往下那些二线的、二流的、三流的,也有好多不在乎的。小伙伴们,大专学历的,你已经改变不了你学历的情况下。请记住,加强另外一条腿就行了。技术。
说着我老师忍不住给你们看看点简历啊,大专生的简历算了,一会儿再说吧。呃。这是大龄的大专生,从没工资到就业啊,这个年龄比较大了。
30毫几了啊。大专学历不到一个月,薪资翻一倍的啊。
还有好几个就是大专拿拿两个滴京按那个京东跟滴滴两个offer的,呃,可能没记录大专生这件事啊。所以各位同学们,你们记住这一点,就是说学历呢在你改变不了的情况下,加强另外一条腿儿,没毛病。
你千万不要自暴自弃,大专生有的是机会。如果大专生候有机会,你们想想你作为。其他的这种学历的那就更甭题了。这是32岁大专生,这哥们拿了60万到70万年薪。有同学说怎么还不固定,因为他拿了9500股票。
这股票的来回的升降,他不一定。这个大专生。你仔细看看他的个人优势,他的写法,这就是学完我们课程之后的轻松可以写上去的东西。😊,瞅一眼。5年夜样开发管理经验,这个有点夸张,负责项目日活300万。
注册人数1。3亿。这个项目上的呢有点稍微有点夸张。高吞土低延迟分布架构分布分布经验。一会儿我有机有时间我给你介绍介绍我们课程内容就知道了,这是我们的一个非常擅长的一个点。呃。
JDK的各种集合队列所多线程高并发NL相关底层制能原理,这都是我讲的。数据结构与算法设计模式。我跟左老师讲的GC垃圾回收算法,丰富JM调学经验。我现在正在讲给你们听的。5条大厂就已经向他开门了。
660万到70万。当然我们课程要是学完是什么水平?我课程学完大概大概是这种水平,你真要能学完。大概是这种水平。自己看。给大家时先读一下吧。你真要学完啊,大概是这种水平。没有精通的废话,你跟着老师学。
你就精通啊。你要听完我这个M课,不敢写精通的那你这是是你太太太把老师看的太低了。😊,还是一个啊,就是我们这儿的课说第二,没人敢说第一。随便倒。不继续讲课了啊,讲讲讲讲讲。😊,看完这简历我们就讲行吗?
还想看吗?不想看我就关了,想看我就带你们看看。😊,简历我可不敢写精通,懒洋洋,恭喜你,你以后尽量的什么都不要写精通。然后我的学生们都写精通,你猜猜看谁会拿到面试机会。傻不傻呀?Okay。上什么怎么样。
随便他上什么下什么随便好吗?我不是针对谁啊,是针对所有人是吧?嗯,有有的人可能呃广告做的比我们好啊,这个影响面比我们宽,但是就课程质量随便玩。你拿大腿想想,我这的老师可是来自于BAT勾一线的。
而不是在线下干了很多年来回来去翻来覆去讲的那些老师,好吧。我们说还是那了啊,我们要说第二,没人敢说第一。好,看这里。就是你你学完用整体课大概是这种水平。分贝系统架构。海量数据。高并发系统架构。
高可用加构高性能架构。O。项目水平大概是这种技术水平,大概是这种。好,这个小伙拿了多少钱?阿里的P7加。80万底薪加40万股票,120万每年。恭喜你最近跳槽了。叫做薪水,非常的具备竞争力。
叫做200万左右加股票。Okay。当然他有他的天赋,有他的优势,他的学校比较好。但是我想是这样的。我作为我们老师讲,我不管你的优势天赋,那是其他方面,我只负责把技术给你们讲到这种深度。听到了。
就是我呢我们我们这的老师就负责一件事儿,把技术给你们讲到这种深度。就行了。他这个学历是本科,但是他学校比较好,好吧。但是你就想吧,你就算不是科班,你薪水比他低。你拿他3分之1薪水行不行?
啥学校这有点那个隐私啊,反正不是清北啊,但是他学校确实也很不错嗯。嗯。你就想吧,你就拿它3分之1左右的,然后慢慢以后慢慢长嘛,怕啥?😡,核桃花生礼哇塞。你们是怎么猜出来的,怎么那么牛刀。😊。
好了好了好了。😊,呃。说这么半天呢,今天晚上呢,金金明金明吧金明我们都有一个秒杀,但你不要错过啊,我今天晚上既然是第一天,其实第一天没想打广告的,结果聊着聊着开始打了广告,打一点就打一点。
我们今天晚上金九涨薪剂。我们MACA马兵认购架架构师的这个课。涨薪最快,20天内让你涨最快的。最慢的90天。最高涨薪500%,这不是说着玩的。有同学说老老师涨薪还能500%的涨呢。他我也奇怪呀。
但是人家就是长上了,有一定的狗屎运,只能这么说。你找找这哥们啊,留着呢。你像这种5K涨到15K的这这都算是相对简单一些的啊。就是那个这么这么跟你说。
其实这里面帮助你能够走出来的最重要的一点就是老师在群里头真的是手把手。步步指导你哪步没走通的,没关系啊,都有一堆牛人带着你。找找。找找那哥们儿啊,就就这个应该是这个。啊,问我CMS三个过程。
三色增量remarkFDC。啊,不不不不是这个哪个来着?哇。找不着了,找不着了啊,你你们你们自己可以去找啊,这个这个这个界面就是这个呃这个网址就在这儿啊,你们自己上面看就行了啊。
每一个都是非常真实的一个聊天记录。这聊天记录里面呢,你们要体会老师在这里面花的心血,你知道吗?😊,你会发现这都是一个很很明显的一个互动过程。我觉得呢教知识这块我们肯定没问题。
但是其实最重要的呢是在服务这块。就是我们的这个服务呃,应该也是number one,好吧。嗯,他是大概原来在长沙拿5。5K,然后跳到杭州,直接拿了25。接近5倍啊,就这么强。呃。
今天晚上呢有10个秒杀名额,0点之前秒杀截止。今天晚上找腾讯申请的8000的大额优惠。如果我们要不申请优我们课程呢是非常贵的。今天晚上申请完大概5到7块钱一个课时1万1万多的课啊。
报名呢送你一个樱桃红红豆键盘,你要是不要可以给你折现。9月9号首次开启的源码班。今天晚上报名送了。15号我们开始讲多线程的第二版左老师的算法全都有。好,如果有有有有意愿的去找我们小姐姐。
骚or扰他们一下,好吧。随便找哪个小姐姐都可以。当然你已经加上小姐姐,就不用不用再找其他的小姐姐了,不要三心二意。啊,要用成专业OK。折现多少钱,你问问小姐姐,这个是他们市场部定的OK。好。
我呃是这样啊,你们骚扰小小姐姐,我来我去上一个小小的厕所。回来我给大家讲三色标记吧。三色。今天讲高兴了,我讲完三色之后。在顺带的给大家讲讲G oneZGC Sheandoahepllent。可以吗?
要可以的话,给老师扣个一。一般上课什么时间?晚上8点到10点,周末所有的时间。就我们课呀。我我我我觉着啊你们一定要擦擦亮眼睛,一个是什么什么什么点呢?就是呃现在有好多网课。
这是肯定的网课呢有很多是每周就三次课,每次就2小时。小伙伴们。同学们,你们拿大腿想一想,每周三次,每次2小时,他得讲多少年才能达到我们课程量?这种呢想讲深的不是扯淡吗?怎么可能?我们的课是怎么上的呢?
这是我们一周的课表。嗯。这是我们一周的课表啊,这周课表还不算不算多的。我们课表一周最多的,找找看上上一上一周的这是上一周的,看到了吗?每天都有课,每周末都有课。不断的在更新。当然这是我们课程特点。
我们课程特点就是特别全。所有点基本全有,然后每个点都在独立更新。更新更新更新更新。然后你需要的时候帮你组合,组合好了之后,老师再带着你整个一条路全部走完。这周还不算太多的。这周呃今天晚上好像没有那个。
周二那天没有没有没没有VIP嗯。
呃。慎掉忘了啊,我我我我我我去我去拍空一下膀胱,大家稍等我片刻。5分钟最多5分钟。在这个时间段找一个别的老师算了,你你们稍微等我一下啊,回来我再跟你讲。三四标记今天讲高兴了,都给你讲完了,好吧嗯。😊。
这个膀胱不足以伺候你们了,得去排空一下。🤧。Okay。Yeah。Yeah。嗯。Okay。嗯。今天白天呢睡的比较多,我跟你说,原来呢都是基本上我晚上就讲俩俩时课。呃,2小时算多了一个半小时。Okay。
今天白天睡的比较多。今天晚上讲开心了,主要你看。今天晚上又失旭东在。石旭东啊,哎,正是因为有你在。今天晚上多讲一些,好吧。Okay。呃,课程是怎么学习的?直播加录播,老师一对一辅导。你带着人来。
然后老师让你干嘛你干嘛?老师说这周把这个掌握。你就把这掌握住,老师说下周把这掌握,你就把这掌握住搞定。你说3月我想涨个新,涨5000来就是了。在这儿还没有人长不了新锐的,好吧。一对一是每周几次辅导。
有问题随时你一周有10个10次问题。就十次一对一。你如果一周有100次问题,就100次一对一。如果说想去快手呢,一共多少钱?一共1万多块钱吧,一万出头嗯。MCA对。我们要推我们自己的标准了。
因为我们讲啥他们都抄,你知道吗?我们说我们叫P8P7啊,他们抄我们我说我们说我们说P8,他们抄,我们现在就是整个java培训会界的标准,知道吗?
我们现在推MC叫马士兵 certifiedtified architect。那你再抄。2。对。😊,XCAX什么意思?X战警吗?😊,Okay。不好。你出个主意。怎么灭怎么用得抄袭。关紧抄完了之后吧。
他们就一个老师还号称自己有2000多个课。😊,拿大腿想想大哥。一两个老师三四,然后每周就讲三次课逗我呢嗯。😊,Okay。几个月可以去快手。你你说的非常特定的一个企业呀,我跟你说。
万一这家企业现在正不招呢。这个不能把自己锁在所有鸡蛋放在一个篮子里啊。我希望你面对的呢是整个这种水平的企业,你懂吗?我们整个企我们整个呃。课程呢是这种就是一流大厂。一线呃一一线城市一流大厂的水平。
至于说。二流的三流的,你降维打击就行了嘛,无所谓的事儿啊。快手现在只招外包。对啊,你要万上万一遇上人家不着呢,你你不惨了嗯。你让我想起了哪个老师?Yeah。怎么怎么让你想起的,我怎么没get到嗯。😊。
说好的回来就讲三次了。没错,你你先让我把这个补充点补充点营养行吗?先补充补充啊,毕竟老师6060多了。一口气讲太多也也够累的啊。嗯。这个课程是不是需要有很多年的经验,不需要没有从零基础开始的。没必要。
嗯。你来就是嗯。来就是了,好吧,解决你所有的难题就在今天晚上。我操60以为40对,你以为的对了啊,开个开个玩笑,开个玩笑,没那么老啊。😊,嗯。7几年的70年代人啊。😊,🤧小姐姐头像好漂亮。
这都是小姐姐的真人,不是头像。好。课程太深,听不懂咋办?从浅的开始。所有人啊都是从浅到深的。每个人都是从零从零开始慢慢走到这么深入的。你们知道你们你们为什么喜欢听老师的课吗?因为老师讲课也下功夫。
还是过期了就没了。呃,如果是录播,是终身都有的。如果是直播的话呢,呃现在腾有可堂限制我们有没有我们原来是那个终身制的会员,你都可以终身听直播,但是。现能有可能限制我们是两年。然后第三年。
你想继续听怎么办呢?88亿年88块钱,大哥总得有点仪式感啊。听得懂,但是过段时间就全忘了。恭喜你。说明你是个人。你要是听一遍全记住了,那你就不是人,你是神。嗯。嗯。😊,没关系啊。你拿张纸。
把重要点全给我记下来,没多少,老师都帮你总结好了。😊,你就干一件事就行了。😡,面试之前拿出来看看。吃饭之前,饭前饭后。变前变哄。只要你别你别变后变后变后用了就行了嗯。Yeah。运维需要往这方面转吗?
现在感觉上不去了。你看你多大年龄。如果你年龄比较大了,我建运维呢往两大方向。第一个叫做。那个CICD知道吧?
就是和开发结合CICD叫呃continuous integration和continuous developmentCICD这一大方向。第二大方向叫安全,这两大方向运维可以走。还还有还有涨新机会。
Yeah。は。便后用的饭前用啊。VIP课程没时间上怎么办?😊,其实我们VIP不太多,多数人。不会有所有时间全赶上。但只要效果到位就行,我觉着不用赶所有时间。没看能涂啊,就这样涂。这上我们课的到课率。
你看这哥们儿这倒客率,这哥们儿到课率是0。7。😊,嗯,1000堂课来7堂。但是整体完成度是百分百,看到了吗?没关系啊,你那个没赶上直播看录播嘛,录播还可以两倍速呢。而且你跟老师在群里,你有啥问题。
直接问老师就行,不用担心没有互动的,放心。
Yeah。你追求的是效果。Okay。10个,今天晚上。放完就没,不知道还剩几个,所以有需要的你抓紧找小姐姐啊,我喝完这点水,咱就开始下一步。最后一口啊。让我稍微吃点喝点。开始吃播是吧?2牛9随便看。对。
没错。腾讯课堂啊在哪儿?腾讯课堂。完成度什么概,有作业吗?呃,我们有的课是要留作业,有的课没有这个分课不一定。老师三七女怎么发展?一对一指导,我是需要了解你的背景的。就是你以前是做什么的?做了多长时间。
有什么项目经验,从哪毕业,分哪个厂子,哪个城市,这些都很重要。你这么简单一句话,我很难跟你说清楚怎么发展。🤧嗯嗯。Yeah。那就要我最后一口喝完,吃完喝完我就开始啊。要完三个月涨薪后。
再给跳槽搭成了的一对一指导,没问题。于是知道知道你到底。就是你相当于啊这1万多块钱买了什么呢?买了20位导师,这20位导师,你想听他们过来人的一些建议意见来就是了。像这些都是在阿里呆过的。
美团呆过的oracle呆过的银行呆过的。亚马逊外企待过的这种双大厂都待过的。就是这些人给你两句,你很可能就少走了很多弯路,你原来得绕着弯的才能走到这个位置。现在你只要直接就过可以过来了,少了很多坑。
这个不值钱吗?太值钱了啊。而且不要担心这点学费,第一个学费可以分期。第二1个,你这学费谁掏的?😊,三年之后下一个不是sorry,3个月之后下一个。接盘你的场子替你掏的。
因为3个月涨5000块钱是我们的基本承诺。我们对你的唯一的要求,让你学啥你学啥。老师,明天讲吧,要洗洗睡了,你先洗洗睡,我先讲啊。😊,好了,我们准备好了吗?要找小姐姐找小姐姐啊。
不少道小姐姐的我们准备好。我们开始讲比较难的难点,三色标记,三色标记超级难。我要讲完的话,基本俩小时。但是我先给你讲入门知识,你了解CMS到底是怎么玩的,好不好?😊,准备好的老师扣一来。哎,我跟你说。
老师从我这讲课,我就喜欢特别难的东西,给你拿什么来演示呢?动画。嗯。嗯。嗯。Yeah。Yeah。Okay。放心吧,我这讲的课你别的地儿都没都听不着的。😊,那个。我跟你讲三色标记,也许你在网上看到过。
但是你想在网上看懂三色标记真心没那么容易。但是我通过给你动画的演示,很容易你就能理解。嗯。来准备开始。下面我们要聊的是三色标记算法,用在什么地方?并发标记阶段。注意是并发标记。他还没有清理。
听我说还没有清理,只是在标记。回想这个场景,你们哥仨在这里不停的扔线团,扔线团,扔线团,垃圾回收器,在这里不停的找。哎,哥们是垃圾吗?哥们儿是垃圾吗?哥们是垃圾吗?在你一边扔一边找的过程之中。
会产生各种各样的问题。他的这个扫描过程是这么来扫描的。由于这个县程是隔一段时间才能运行,隔一段时间才能运行。所以你必须把上一次运行阶段要保存下来。上一次运行扫描到这个程度了。
下一次要在这个基础之上继续扫描,什么时候扫描所有的完事结束为止,然后才开始清理。这块大家能听懂吗?我再强调一遍,这个扫描过程是本身分了好多步,而且是不确定的。为什么?
因为现成的运行时间是由操系统来进行调度的。它调度的以及执行的时间片时间长,时间长时长都不是固定的。linux内核采用的叫CFS线程调度算法叫completely。fairness strategy啊。
complete fair strategy叫嗯嗯嗯嗯完全呃呃公平算法。嗯,它并不是平均分配啊,这这是完全两个概念。这是我这是我在讲操作系统课的时候讲讲的概念。在这就不跟你说了。总而言之。
我们开始对整个对象图开始产生标记的时候,垃圾回收现场在这里面会议运行好多次,每次运行完这个时间段段之后,一定要把这个。当前你已经标记到哪里了,给记录下来,我标记到这个对象了,还是标记到这个对象了。
还是标记到这个对象了,给记录下来。😊,这个概念能get到的给老师扣个一,然后下一个阶段再回来的时候继续。😊,那么怎么才能记录下来呢?它采用的方式叫做三色。标记算法。VIP课人也聊天嘛?
VIP课上就不怎么聊天了嗯。😊,关客聊天聊的稍微多一些。好,下面我们来聊三色标记。我们首先明白第一件事儿,什么叫三色。三色的意思是,在他标记追踪整个对象的过程之中,如果一个对象。他自己已经被追踪到了。
就是顺着线我们已经访问到他了,已经捋到他了。找着这线头了,并且这个线头的孩子们我也标记完了,我也标记过了。好嘞,这哥们儿叫黑色黑色对象有一个特点,就是当我下一次垃圾回收现程再回来的时候。
黑色的对象我就不再去扫描了。不再扫描。黑色对象不扫描了,为什么?因为他标完了,他孩子也标完了,那没必要再扫他了。所以这个呢叫黑对象。叫black。好,那我们在扫描的过程之中,我扫描到黑色了。
也扫描到他的孩子了。但是他孩子我扫完了,像这种的,本身他扫完了,这哥们儿是个不是垃圾啊,不是垃圾,扫完了。😊,但是他的孩子我还没扫到。这种叫灰色。那我们当我们垃圾回收线程暂停之后,再次回来。
发现灰色对象的时候,他干一件什么事儿呢?他不去扫描他自己,只去扫描他的孩子就可以了,继续往下进行。Okay。YeahYeah。古城我说的是标记清楚。标记清楚的标记过程不就是三色吗?哎呦我的天哪。😡。
这个累呀三色是解决什么问题,不就是标记吗?我第一句话就是说三色是解决标记还没有开始清除。😡,好,能能继续的给老师扣个一。那白的是啥?白的是没有便利到的节点。这叫白。Yeah。嗯。😊,这个。Hey。
Bethley。这就是三色标记。当然。Yeah。有同学会说。那个老师我我我以前啊讲课的时候,真的有人问我说。老师,这这这这颜色是怎么标标识的呀?这这个怎么能把这个对象给给他染成黑色呀?😊。
这个呢我告诉你啊,你可以拿一把刷子把那个对象呢蘸点黑色的漆,就可以把它染成黑色了。听明白了吗?H。黑油戏讲的就是黑色嗯。嗯,原来是这样子的对。开个玩笑啊,我觉得问我这个问题的人应该是没写过程序。😊。
大哥,你的年龄是50,你的年龄是15,你怎么标记的呀?不就是一个变量吗?黑色白色、灰色怎么标记的?我告诉你,就是在对象上做了一个记录。比如说。有两位01代表它是黑色,1一代表它是灰色,10代表它是白色。
不用我讲了吧。那有同学可能会深究老师啊。他这个011011这些标记。是放在哪里的呢?😊,恭喜你,你问到了一个触及灵魂的问题,它是放在了这里叫m word。在m word里面。
8个字节的m word四个字节的class pointer,N个字节的instance data以及N个字节的padding。好,就在这里。这里面有四类信息,第一类三类信息,第一类叫锁信息。
第二类叫hash code。第三类叫GC。这个GC就是CMS的脑袋记录在这儿。Okay。又来了m克 word废话,前后都是相通的,好吗?怎么着,那还不给你来买味的了。嗯。好啦。当然那是另外的知识体系。
那个我也会讲VIP课里也全有。我们今天先来这套知识体系,这个知识体系是这样的。自己标完孩子也标完黑,自己标完孩子没标完灰。还没标到的白好。由于在整个标记的过程之中。
它的不阶段运行以及我的业务线程也在不间段运行。那么他会发生什么情况呢?第一种情况是这样子的。当我们经历一次时间段的垃圾扫描之后,扫描到这种程度了,还没来得及扫描到白色对象的时候。由于我业务现成的运行。
我B指向D的引用消失了。就会导致一种什么情形啊,就会导致我扫描到B的时候,找他孩子,本来我要扫描到D呢,扫描不到了。地会把我们被我们当成垃圾,他没有便利到。本来应该便利到。但是还没有便利到了。好。
这种情况会产生什么严重后果吗?不会,没有关系,大不了啥呀,大不了它就叫浮动了。你下一次我再次扫描的时候,就会把它当成垃圾给找出来。这个没有关系,所以这种情况没有关系,听懂了吗?最严重的是另外一种情况。
仔细看。这是最严重的情况,认认真真看理解了这种情况,理解它是怎么解决的,就理解了CMS。Okay。看这里。扫描几次。你扫描多少次,总而言之,你整个对象图扫完了为止嘛?你所有都扫到了,全都变黑了。
那就是扫描完了,这跟扫描几次有半毛钱关系吗?我刚才跟你说过,多线程线程的调度是被操作系统调度的,它调度多少次,每次运行多长时间,这事儿我们管不了。改到了吗?Yeah。好,我们继续。B纸箱D的引用。
这个时候注意看,在我们正在扫描的过程之中,我扫描完黑色了A扫描完灰色了,B,还没来得及扫描B的孩子D。这时我的业务逻辑开始运行,B指向D的引用。消失了。与此同时,A指向D的引用增加了。来再看一遍。
B纸箱D的引用消失了。A指向D的引用增加了。同时发出了这两件事儿。来,你猜猜看。再想象一下啊,在我们扫描完A之后,经过一次扫描一个线程,那就围绕线程运行了一小段时间。A扫描完了B扫描完了D没有扫描到。
下次回来的时候。你会发现发生了中间发生了这种情形,业务线正在运行的阶段,A指向低的引用产生了B指向低的引用消失了。同学们,你们发现没有?当我们下一次垃圾回收现生再回来的时候。
如果我们不对这个问题进行修正的话。还记得吗?A是黑色的。我会去扫描他的孩子这个地吗?不会。那我B本来呢能扫描到地,但是由于它的引用消失了,那我还能扫描到这个地吗?扫描不到。因此,这个D既然扫描不到。
你猜猜看是不是会被我们当成垃圾呢?所以回来的县城如果不对它进行修正的话,这个地会被我们当成垃圾。这个地不修正,就会把它给清掉。再看一遍,这是最严重的问题。第一次垃圾卫生现城标记到这种程度了。
在下一次标记中间。B纸向底的引销是A指向D的引用诞生。OK这个D就淡出了你的视野。你生了个野孩子,你们哥仨生了个野孩子,扫描不着。来get到这一点呢,老师扣一,可以继续的。嗯,go。好,怎么解决呢?来。
你们拿大腿想想怎么解决。应该把A的颜色清除掉,扫描不到是不是就不会被清除了,扫描不到的才会清除啊。大哥,你扫描不到的不就是垃圾吗?😊,对你看琼克杰斯啊,杰克琼斯啊,jackjones。
jack看人家是吧,大腿多么的发达,把A标成灰色不就行了吗?也就是说,如果有一个黑色对象,他的孩子又指向了新的对象的时候。你的程序必须得跟踪,如果这对象是黑色的,他的孩子。又指向了新的对象的时候。
OK要把它自己变成灰色,变成灰色有什么好处啊?变成灰色,就是下一次垃圾回收县城回来的时候。😊,会重新扫描他的海纸。修改B为白色,你疯了,这跟修改B为白色有半毛钱关系吗?小点点。所以这是。
这是CMS解决方案。CMS解决方案就是把A。换成灰色。白标灰就行了。看懂了吗?这种解决方案叫做 incrementalcrement update。所以三色标的是什么?CMS解CMS解决方案是什么?
应该都能get了。B要改黑色吗?B如果他已经标完,他孩子标完了,他自己就标成黑色了,这个无所谓啊。总而言之,你A改成灰色,下一次我回来的时候就知道哦,A是灰色,我又要扫描他的孩子好D又被我们扫描到了。
Very good。好。讲点更难的问题。还要讲吗?毕业这孩子对毕这个孩子已经扫描过了嘛嗯。
系列 5:P1:全网独家私人定制直播教学、N对1辅导模式! - 马士兵学堂 - BV1E34y1w773
课程大纲给大家看一下啊。
这个课程里面的话呢,我们把它分成大概是十个模块,搜一搜啊,也就是说在这一期里面呢,我们会主要围绕这些知识点,这些第一个的话呢是属于架构基础啊,就是会去讲一些基础内容。
然后第二个的话呢并发编程的一个核心原理,第三个的话呢像比较重要的PV每条U,然后下面的话spring的源码,然后还有包括spring cloud。
阿里巴巴就是微服务的核心,然后底下的话包括MYSQL性能调优。
REDIS实战啊,Rock q,然后三高架构设计以及网络与类型,也就是说这里面是十个模块,十个模块的话会有不同的老师来讲,可能有的老师可能讲两个啊,有的老师可能讲一个啊。
这个的话呢是根据每个老师的一个技术专长,来定的,大概的时间的话,我们是准备坐在3~4个月,就是一个季度,原则上面的话,我们不会超过四个月的时间啊,这个为什么可以做到这一点呢,是因为我们会把这些东西啊。
不是说全讲的,就是不是说把所有的这个面铺开,而是去讲,比如说当今比较核心的点,面试比较关心的点,以及现在市场上面这些项目当中,经常用到这些点,然后我给大家看一下,就是在下,因为我们今天是一个开张仪式。
所以我们的这个时间的话,大概就是只讲一个小时啊,然后后面的那个上课时间,基本上是每天晚上八点到十点,就是会上大概两个小时,然后在这两个小时里面的话呢,我们会为了去加强互动啊,我们在讲课之前。
我们会要求就是老师就是花一些时间备课,然后备课的同时也是在上课之前嘛,可能会把这节课的一些相关的,是一些预习资料啊,或者是你要需要注意的一些点啊,可以去就是提前发放到学员,通过班主任。
然后如果说有些学员跟班主任联系了,我要上中国班,得活的时间是固定的,每天晚上或者是说基本上每天晚上有时间的话,就可以来跟啊,然后同时的话你也可以看一下这个课的话呢,就是讲的内容适不适合你。
我们会在这个讲课之前发一些备注,就是可能上课之前,比如说有可能要上十分的源码,对不对,那可能有一个源码,有一个前置知识,spring的一些使用,spring的一些主体流程,至少能够防空。
OK然后我们再看一下吧,就是作为架构基础的话呢。
呃我就来讲一讲啊,因为大家平时其实作为现在面试啊,嗯基本上不会不得太浅,所以的话呢我们会抓一些常见的数据结构,就像这种帕奇麦克,像这种什么,我们常说的这个哈希麦克里面肯定有红黑树嘛。
所以像这种234树红黑树,然后一些集合SC啊,然后Mac啊,历史啊,这种集合的源码进行讲解啊,然后除此之外的话还会去提一下IO,另外的话呢像里面会讲一些比较常用的,像SYCHONNET这种关键字啊。
这种关键字的话呢,虽然原则上它可能会属于多线程,但是在架构基础里面他可能会讲的,那么就是说偏向于基础一点点啊,这是我们的第一部分,然后第二个部分的话呢,呃这是郑老师为什么会没来呢,郑老师还在注意看。
郑老师嘴上起个泡,所以说亲下说下对郑老师,反正那个住院的话也住了挺久的啊,我每天都打电话给他,然后呢我给他给就是给大家讲一下,因为做并发编程,其实它也是非常重要的一个模块,就是三大特性和原子性,可见性。
有序性啊,这些东西是必讲的,然后除此之外的话呢,会去讲一下cs wt cr各种锁,然后SYCHIZAKAK,然后range Mark还有包括比较核心的一点,像线程池的一些原理啊,另外的话呢。
还可以去讲一个比较经典的数据结构,叫康复的话,先买它的源码解析,所以这个呢应该来说是作为并发编程的一个,大体内容啊,然后第三个部分的话呢是GMGUM的话呢,这个部分是严振涛严老师去讲啊。
但是严老师因为他在我隔壁上课,所以我给大家讲一下,在JVM讲这个课的时候,会更多的体现像JVM的调优实战,就像这种大家可能平时在工作当中,就是问职员们大部分是原理问的什么方法区啊。
站啊堆啊这些东西对不对,然后这个课程呢就是会严老师也跟我说过啊,他备课的时候,更多的会嵌入他以前的那些,在项目当中的一些调优技巧,所以这个如果说同学们在工作当中,想去做这个调优的话。
可以去参与一下这个基本的课程啊,然后第三个部分就是这个上面的顺序啊,再给大家说一下,它不代表严格的上课顺序,因为我们要根据老师的一个排课,然后他的费课,他的计划安排定,所以的话呢这个我先把它列举出来啊。
然后像spring的源码的话,我们知道基本上源码可能是问的最多的,就是面试嘛,面试的话IOC啊,然后DI啊,然后像AOP啊,还有包括分配的事物啊,所以我们会抽一些重点来讲,因为源码课程讲的话。
可以我记得SPM源码别宝石,之前是讲了70个小时了,对不对对,那么我们肯定不会去做70个小时的一个讲解,所以像思科的源码,就会更偏向于面解决这种面试问题。
然后底下的话呢像spring cloud cloud,阿里巴巴这个我们知道像微服务其他附件很多,这个spring cloud阿里巴巴的话,我们会去,就是说在这一期里面我们不把所有的源码都讲。
我们会去讲一下拉克丝,然后ROBBY,然后我们还会讲apple fe,主要围绕这三个东西来进行讲解,然后可能到下一期,比如说可能过完年之后,对不对,我们可能会进入下一期。
下一期的话呢他们主要会讲一些其他的组件,包括像什么C卡,像一些其他的神贴吧这种东西,然后像MYSQL性能调优了,也给大家分享一下啊,就是MYSQL性能调优,其实这里面的话会去补一些常见的视频。
因为我其实我之前给大家讲过,MYSQL的话,它分成底层原理和实战上这两个部分,首先你要去搞定像底层里面的B加数索引,还有像他的一些执行计划,还有他的一个什么MVCC这种机制,然后有了这个之后的话。
你就可以去根据执行计划,然后进行对应的什么成本,基于一些我们的C口的这个条件的一些调优,OK所以呢这是我们的MYSQL的一个线程调优方面啊,要么我感觉我是一直在讲周老师讲一讲,周老师讲一讲,讲一讲。
我说好不好,对这个网络IO和NT这块,然后曾经有讲有一个IO精讲的那个版本,后边要如果再讲这个这个和net的话,就准备偏重于这个,因为前一次那个RBC起了个头,就有一个初级版本,然后呢0~1个代码写法。
然后呢最后重构这个分层,如果后面讲的话,其实我觉得就是咱们这个属于架构师进阶班,这个坑以及墙上那个东西就是特别偏离,特别死之类的,肯定会加特别多,老师都是在原有这个已有的一个模块之上。
向上拔高的一部分内容,无论从见解啊,归纳啊,然后他的一个一个深度或者源码,是思想上的这方面的输出,增强大家的一些话术,因为我刚才看到很多人说,这个课不是在美国抽出一些他以推理,都是这个拔高的一些东西。
就是所有的一些东西我们都会想到一个拔高,老师也是对老师的一个1111次考验,像那个网络IO的一个,你比如说我之前讲过,还有精讲的,有那个版本,然后这个课我就不会说,这东西再给你重复讲一遍,给你混入时长。
所以一定是继续的,把这里面就是把那个应该讲到二二十七,二十六二十四小时,把那个小时里边的东西我做一个总结归纳,然后给你做成一个一个一个思维导图,然后那个知识敲定之后,接下来就是延续这个RPC的完整体系。
因为听过昨天那个因为最近班我也说了,其实像呃分式治理和服务治理,就是这两个治理里面,然后其实他最最重要的还是和那个RPC这块,相关的RPC网络,网络这块连接上出问题啊,或者是对对方的不明确性。
协议上出现的问题,所以在这一侧的话,RP的深度针灸的话是是是很有必要的,对我们这个所有程序员,对于架构上的三方都理解,所以这个课后面肯定这么设计好吧,对周老师没有李老师的嗓子大嗓子这个咳咳。
上岁数上岁数,对他说这个内容有点偏少啊,我给大家解释一下,其实我不是这个,我跟你说啊,这叫大纲,对这个每一个点,然后它背后刚才说你要把它译成是一个拔高的,我刚才说的这个问题就是真的太难了。
同学刚才发了几个疑问,所以说一个一个一个重复的,把之前我们讲过一个录播,然后再给你重新讲一遍,不是这样一个课程,这个标题大,这个课的标题已经看出来,就架构师进阶版是我们一定是讲的是进阶的,提升的对。
有有营养有素质对吧是的,然后重点的话呢就是我们的右手边的曹老师啊,大概讲一下,像这一个就只能听到吧,来来来放近一点,来来来能听到吗,我我站起来站起来可以礼貌礼貌一点,礼貌礼貌一点啊。
那个就是比如这还得蹲着,所以你坐这,你就在这说,那个就是这个三高项目的架构设计课啊,就是呃这是这个我们是安排了,有大概四节课是吧对,然后这四节课呢就是计划把里面的,就是架构设计的重点。
在这里给大家讲清楚,就是从请求进来经过什么节点,然后每个节点该怎么去设计,比如请求进来什么CDNDNSL负载均衡呀,然后缓存呀,消息队列呀,然后后面的数据库,然后中间可能服务之间调用会遇到什么熔断。
降级,限流隔离等等,这些东西呢,都给大家把它就是讲到它最精华的部分,就是让大家嗯知道在实际的企业当中,你只用哪些,因为其实这里面的方案会挺多很多的,就是比如说熔断的方案很多,但是在这里面。
其实一个企业当中基本上只用一种,就可能程序员熟悉这一种,就用这一种,然后我们呢在这里面就会把比较主流的,在呃在这系列课中挑选出来给大家讲啊,就是三高设计课呢主要就这些内容,争取四节课给大家。
把这种主要的设计方案都给大家讲清楚了,你看有同学说给郑老师多拍些歌,郑老师现在都都拍给都拍给他,我们听着的歌,郑老师现在是在做一个痔疮手术,嘴上嘴上起个泡,好好好,OK这个里面的更新它肯定是有的。
因为啊我们的这个课程呢,它其实是基于一板一板的这个优化,然后优化的一个前提,就是要根据现在的市场的一个面试需求,因为我们最近包括我们在座的,包括曹老师也好,周老师也好,每天都要服务比较多的学员。
从我们的服务这些学员,比如说解答问题啊,对不对,然后做这种简历指导啊,或者做这种学习路线的规划,或做这种面试规划或者模拟面试,我们会就是获取一些,比如说包括现在的最新的企业的一些,招聘信息啊。
现在基本上企业招聘的话呢,他会更偏重于你的动手能力啊,就是原来的话可能就是我们常说的面试八股嘛,就是面试的时候,然后问这个原理,问职员们问什么多线程对不对,问锁啊,问一些什么源码之类的。
然后现在卷呢就是说卷的更多的,就是他考验你的动手能力,就是说首先他要验证你以前那个项目,是不是这么干过,就像曹老师说的啊,我做熔断限流对不对,那你说你简历里面你写的熟悉这一块。
那是不是你要把这个你以前公司做这个东西,应该给我讲清楚,这个课里面的计划就是怎么说呢,因为我讲别的项目里面也用到了熔断限流,然后这里面我把那个案例代码都给大家带出来。
到时候大家就是比如说我们讲到熔断限流,然后到时候会告诉大家有什么地方有案例,大家看一眼就会了,这样就我我我刚才看到同学,你像这个叫弹一闪,就问了一个非常有价值的一个问题,前几天变拼多多。
然后问了中间建的高可用方案,这个就符合这个问题,就符合架构进阶班的课程内容,所以就这样吧,咱们今天临时起意啊,这个到时候准备一个一准备一个接口,这个接口你看是定义,我们是准备一个留一个邮箱。
还是留一个什么什么地方,或者一个就让同学能把问题,那就是你这个接口别太复杂了,然后还得经过几手,就最好有一个地方,然后啪啪啪就搬砖了,班主任班主任就是你们找班主任,就像刚才弹一闪,这个问题非常好。
就说哎前几天面皮多,问了中间件的高可用的方案,那这个问题你们就咣咣就发,发的时候呢,我们老师这边,然后所有人扑上去,然后开始梳理这个这个问题会在哪个模块里边,然后这样你们问的多越多。
然后就带大家一块去思考,怎么把这个课可以讲的更有高度讲,讲得更好,而且更贴贴切于十这个时实际这个方面的好吧,所以我们就是咱们之前那个老学员应该知道,就是咱们很多课程都是这种互相打磨着出来的。
只要你咱们同学能积极的反馈对吧,然后我们就一定会把这个这个课程做得更好,因为是更符合你的需求的,对这个说任我行说把面试题收集起来,对面试题的话,我会收集一些比较经典的,对对对,叫技术众筹,叫技术众筹。
我们管这叫技术,不是费用,众筹,是技术众筹,抛出这个问题,或者遇到这种,就是比如面试的时候遇到这种场景啊,对不对,这话可不只不只限于面试的公司里,面试的你在平时蹲厕所的时候,突然想到一个就是坐在马桶上。
突然想到一个事儿,说哎这个这个架构挺有意思啊,说这个怎么做都可以,就是把你这个所有问题抛出来,但但但是啊这个你你们随便随便随便发讲,不讲的是我们的事,这个任我行发了个在职证券,好像也挺容易的。
发一个也可以也可以,这个他也也别,他要他要那种填的形式的在线问卷,如果说他比如抛出问题的话,那肯定就是那种类似于填空题,时间长短,反正就两三天填完,填完再收集一下,比如说收集一下,大家对这个对。
那我记住这件事情,对我记得这件事再推一波这个手,我们再把直播课程再推一波,然后收集过来之后的话,这个就是咱们直播互动的好处,你们多聊多想,咱就好好方法,对不对,对,这个问卷的话,我们是就在对。
反正我们就做一期嘛,就是一个期做一次这个问卷嘛,我不可能天天问,天天问的那个问题,就这样弄,那个咱们网站上,然后单开出一个页面,或者单开出一个链接的,有很多那种共享的VIP,可见他有的是点进去之后。
然后就可以开个第三方的各种问卷,挺好用的,其实在那个问答里面开一列,就提问的时候选一个什么课程,不是最简单,最简单的就是我们可以在这个班的,就是咱们弄一班的班班的,直接就说这个这个线几号到几号之内。
只有VIP学员有权限,然后呢点点我,然后提交你们想听的知识点内容做这么1banner,然后咱们同学在场的,不在场的,有没有看那个视频呢,他找访问咱们网站了,他大概率看到你班长。
然后再加上班主任那边再去推一下这个事,然后我们三五天之内或者三天之内,然后把那个文件这个问卷,然后就就尽量出到更多的学生,把问题收了,我们先做也别一下这个这个收购,收收收收收太多。
毕竟我们要一个能核算一个工作量,比如三天输三天的,拿回来之后,这些问题我们能能处理完,然后能排到后面课里边,这大纲就跟着变了,然后这个事如果发现好的话,我们就比如说每每个月定每个月定一下。
周一号到5号就是收集问题的对吧,咱们这么玩是不是也可以,你觉得可以,同学来敲门,六六啊,可以吗,这么来这么搞,嗯嗯有30万的事,我知道有30秒,30秒对,你看这行,这这这可以这可以对。
就给他弄成一个长期化,对有节奏有节奏的那种,就是希望大家都参与起来对,因为这种直播课程的话,其实就是说如果按照做项目的话,我们是我们还是你们是甲方,你是甲方爸爸,对不对。
然后这刚才是讲的这个三高的架构设计啊,然后我就给大家着重讲一下,比如说今天坐在中间的李老师会给大家讲,所以在这个rock q里面,你也可以看到,我里面更多的是去给大家去讲一些实战相关的。
因为像这种中间件啊,其实面试的时候可能会问到这种,就高考用三高架构嘛,其实除了这种三高架构之外,就是有一些学员他其实有一些痛点,这个痛点就是我可能在这个公司,我压根没有用过它,但是呢我去面试的时候。
我要写上,结果我写上啊,比如说李老师帮你写上了之后,面试官一问结果反正你都答的不顺畅,因为你现在一面试一答的不顺畅啊,是阿八阿八之类的,基本上面试官就会断定你这个没有用过,或者是非常的生疏。
所以这里面的话我会给大家去讲,更多的偏向于实战的,就是你不要看这种实战的话,它其实不是说一定要把这个代码,嗖的一下拿下来,而是说我讲清楚很多的业务场景会怎么去用它,因为像你讲的rock q的话。
其实像rock q卡不卡,那就差不多了,因为MQ的话,这个东西就是说你只要熟精通其中的一种,其实这三种这三种像ruby的,像卡夫卡的话基本上也就差不多熟悉了,除此之外的话呢。
我还要去讲一下像里面的一些原理机制,因为这个消息的存储,消息的确认,然后还有包括他的网络框架啊,所以我会着重去从这几个点,给大家进行一个突破啊,也许大家可能会觉得,中间件这个模块的话还是比较重要。
但是的话呢就是很多小伙伴就是没有发力点,所以这个rock q的实战与原理的话,就更多的会从同学们去面试,或者工作当中的一些发力点来进行出发,然后像这个release的实战与原理啊。
这个release的实战原理的话呢,我列举的点很多,其实这里面呢前面的东西可能会比较浅一点,一些基础运用吗,这里面比较复杂一点的,可能就是b Mac不能过滤器和happy log log啊。
前面的这五种数据类型还是比较通用的,然后底下的话呢,就是涉及到像它的持久化的原理,像他的这种内存淘汰的原理,然后还有包括我们的这个做主从啊,做哨兵啊,做集群啊,以及分布式锁以及缓存一致性的这个方案。
所以在这个课程里面呢,看起来跟我们之前讲的差不多,但是我会把内容适当的拔高,就是拔刀的这个业务场景,也会要和架构设计要挂上一定的关系,就是大家知道就是在你的这个工作当中。
可能就是在你的项目里面会写着release,对不对,但是你要了解这个release你到底用它来干嘛,对不对,有的人我做缓存,那缓存其实有很多的缓存,也可以做e catch的缓存,也可以用MONGODB。
对不对,那你REDIS为什么要用它,然后release这个里面呢,具体的话还会涉及到一些bug,哎我记得周老师之前讲了一个release,早期版本的时候,好像提出了一个,我记得有一个你还记得吗。
一个AOF的一个bug,但是那个bug的话在release7的这个版本已经修复了,我们学员就直接给我们做了一个反馈,这个反馈就是说,诶好前周老师讲的这个release里面的那个演示的bug。
在release7的这个版本里面,他其实已经修复了,就已经没有那么bug了,所以我们讲这些东西的话,尽量的会去讲比较新的版本,因为比较新的版本,你像release啊,就是他新的版本出了多线程嘛。
然后release里面的话它支持了更多的数据类型,所以呢这是我们讲release的一个实战与原理部分啊,同学又反馈了几个问题啊,就是说现在最近面的大厂基本上都没啥罢工了,然后全是实战相关的。
然后算法都基本上是数据结构精讲那些基础的,然后是这样的,弹一闪,今天给的反馈都比较清晰,然后这个而且又有有有细节,这个这种这种方式很好,我想想基于他的说法,也是就是我们既然要做这个文件系统。
然后你们在骑的时候就不要太模棱两可,就比如说那个加一个什么新课,加一个就是两个字,或者一句话,你们稍微说的具体点就是哪方面的,然后呢比如像这个面试官问的相对比较垂直,那这个就是垂直。
可以举个example啊,来个例子,你比如说可能我我因为我遇到了什么什么,他问我哪些问题,这个这个所谓的垂直到底是垂到什么程度了,对吧,然后呢或者你有你对这个这方面有一个什么,想达到什么效果。
老师让老师应该讲到垂直讲到什么程度,你给定一个问题,然后并且给定对这个问题的描述对吧,然后12345,然后这样的话,其实大家平时在公司工作,应该也是这样的一个工作,一个交流方式,就是信息传递的时候。
不能说这个信息是一个模棱两可的,要要稍微精准一些,然后呢减少这个对方对于分辨你信息的时候,这个这个容错或者其他的问题好吧,也就是希望大家能多用点心思,然后呢每个人也不用想太多。
然后呢到最后众人拾柴火焰高,问题一收起来肯定也是很多的对吧,那个牛将军这个同学,我给你回答这个问题啊,开源项目的话,我们其实开源了一个请叫马士兵严选看一看啊。
这个课程的话原来是我们的诶。
我知道他大概说的啥意思,对这个跟那个不是你说的,我知道他是说开源项目都参与嘛,其实那个的话大家可以去参与的。
搜一下吧。
就是其实我们马士兵严选的话,我们现在已经把它拆解的很细了,原来的话呢是一个大的壳,现在的话我们把它拆成了像它的框架,像它的基础基础的一些组件,就是大家知道你说你要去写一个这种。
或者是说站在架构师的角度去封装,一个框架的话,你肯定要去封装像这种什么接口啊,异常啊,然后像这种大家可不要觉得这些东西简单啊,其实你要动手写的话,你可能没有思路,没有头绪,比如说日期时间的管理啊。
然后一些基础的统一组件啊,一些工具类的封装,这个你应该说的就是这些东西,就是你如果说你真的要去参与编写,开源项目的话,他一定要具体到某个点啊,你不能说你参与了开源项目,然后面试官问你参与了哪个。
我参与了架构设计,那设计的哪个,你跟我细一下,你是设计了它的统一的什么接口响应,还是统一的异常处理,对不对,或者是统一的一个组件,所以说这个课的话应该是可以满足你,包括里面一些实用的东西。
你看使用的东西的话,这个地方其实就是对于一些我们常用的注解,开源架构进行修改,嗯啊就是你说的所谓的,在有些部门叫做组件开发部门,他干的活就是说我对这个组件进行增强啊,我们使用一个统一的缓存组件啊。
这个地方你的细节不用管了,拿数据的话,缓缓存帮你有对应的set方法,有对应的get方法去处理就行了,对不对,然后你比如说那个接口做限流,我们统一的限流方式,然后封装的统一。
封装的就是能够满足日常用的这种限流算法,所以这个就是刚才那个刘将军啊,就是你说的问题,我给你进行了当场的答复,好接着继续刚才说到的。
这是release啊,按release的话呢,我们之前是讲过,我记得讲过一把源码嘛,其实包括我后面讲这个release,我也涉及到了这个嘛,藏一下这个吗,对对对,好好好对对对对对对好。
就是刚才的这一个圆嗯,REDIS里面呢为什么讲到他的一些源码呢,就是因为像这种基础的数据结构,我发现在最近的去年到今年,很多面试官他喜欢问一些数据结构的源码啊,他不是问你什么这个地方的整个流程的源码。
因为大家知道release是C语言写的,他不可能问流程,他就问你像string它的底层的源码是怎么实现的,像它的list的hash sz,sat这种五大基础数据类型啊,因为REDIS为什么说非常好用。
或者rise为什么说经典,它主要是它的设计在每一种数据结构底下,他都用了至少两种以上的实现啊,所以以后你就记住这个点,就是你看到的这个string hash list set,在它的底层。
它至少有两种结构啊,这两种结构一般是适用于不同的业务场景,就是有的可能是数据字段比较长,那我可能用这种,有的呢可能比较短,我用另外一种就是站在这个存储啊,站在这个算法的角度来说,它是最优的好。
那么刚才呢我给大家讲的,就是我们整个大纲的这几个部分啊,卡住了还是怎么,他说老老乡民扛不扛不住。
每天都得都得上上个香,对很虔诚的,然后这个部分的话,我们进入第三个部分吧,我们大纲其实也介绍清楚了,就是大纲的这个十个部分啊,形式互动对我们讲究的是互动形式,然后因为我们今天是一个开班仪式。
所以在这个开盘仪式呢,我们会给大家去分享一些,就是老师自己的一些学习技巧,那么在我右手边的这个曹老师可以说一说啊,首先我回答一下这个任务新的问题啊,这个用到我们项目里不用付费吧,自愿的啊,我们不收费啊。
目前是不收费的啊,对对你来了没有,那个下下一个是啥,分享学习技巧是吧,嗯大家可能问到学习上最多的问题,就是这个东西学了很长时间过后之后就忘了,可能比如说学了个JVM调优,过了一个月可能要到面试的时候。
确实是真忘了是吧,你也不仅你忘了,我也忘了,然后这个这个问题怎么办呢,其实就是我就是辅导了这么多学生的面试,然后给他们的建议呢就是一个学了一个知识点,然后呢比如说嗯比如说限流吧,举个例子啊限流。
然后你做好那种在JITTER里做好一个压,就是那个压测的那个thread group,做好一个这个,然后呢写好一段,写好一个测试限流的代码,OK这个把它打包在那个git上打个tag存好了。
你这次看看懂了,你下次再来看的时候,把它就是把这个tag这个代码牵出来,然后再跑一遍,然后简单看一看,你马上就能回顾起来了,然后这里面反正就是写那个代码的时候,写的详细一些。
然后基本上你好踏踏实实学过一遍,最后再来看一眼,基本上就会嗯,还有一个就是那个,经常尝试着给自己买一个东西,讲清楚,像我们做老师啊,有的有的时候其实我们呃看书,或者说看官方网站。
可能这个东西就是我们作为老师,可能觉得我们懂了,其实就是我们觉得自己懂了之后,和给你们讲道讲清楚,其实这中间差别还挺大的,不一定说我觉得我看懂了就能给你讲清楚,其实中间确实比如说表达的时候有时候不流畅。
或者说不是那么有条理,或者说不是那么的全面,讲到可能到后面的时候想起前面某一些点忘了,其实我们我们平时也会在内心去模拟很多这些,所以呢就是能给大家一些建议呢,就是大家平时比如说学了一个点之后。
也尝试着是吧,给自己的女朋友讲清楚,比如说左老师算法讲的那么好,为啥是吧,天天在家给老婆讲算法是吧,你们能你们要这么做到了是吧,也挺牛逼的,好话筒给到林老师啊,我给大家说一下,其实像学习技巧这一块的话。
刚才有同学提了很多这种学习方法论嘛,嗯我给大家举一个比较通俗的例子,就是一般在企业里面,就是你做项目的时候,其实运用的技术啊,它不会像我们大纲全用上,你不可能说一个就是如果全用上的话呢。
那基本上都是大厂的架构,但是在大厂架构里面呢,你如果不是这种大厂架构师,基本上你可能是负责一个模块啊,我可能是负责订单,我可能负责支付,我可能是负责商品,对不对,然后在这里面我强调一点。
就是说你像我们展示了这些东西,它就有点像我们平时所说的,你说24节气,那听到说到什么什么清明,还有什么秋分,对不对,可能你听到一两个词,你能够冒出来,但如果面试官问你,你给我说一说24节气大概有哪些。
我估计90%的人是背不出十个的啊,这个区别点在于哪里呢,就是你这项这项知识的话,如果你经常用或者是经常敲或者是经常做的话,或者哪怕做一下笔记,或者做一下命令,或者敲一下代码的话。
他可以做到一个温故而知新,所以我我给大家的一个学习技巧,就是在于你学这块知识的时候,首先的话要多动手,就是你动手首先要敲出来,你像我讲release开始都是去讲命令,讲五大基础类类型的命令。
为什么要讲这些东西呢,以后你用到的可能是JS,用到的是REDITION或者是release template这种东东,但是其实这些东西你命令熟悉的话,你看它的API接口,你一眼就明白了。
所以以后你在工作当中你把命令敲除了,你会发现你用API的时候很爽,诶,这个地方我要用哈,希对不对,那就是一个对应的对应的一个API就出来了,然后I第一弹对不对,但是如果你命令不熟。
那这个地方他怎么会有两三个参数啊,怎么送啊,对不对,然后这个命令,它这个操作的命令到底有什么区别啊,对不对,所以这是我给大家分享的一个技巧,就是你一定要在几个大的主要技术里面,要多花些心思。
就是你要多投入一些时间,可能老师在给你讲的话,可能是讲把这个命令快速的给你一两节课,敲完了,对不对,然后具体的知识点,这个时候你要去自己在工作当中也好,或者是你工作当中有时间是最好的。
或者是说你学习的时间好多去敲,然后敲完之后的话,其实你去面试的时候,你就压根不慌了,你跟面试官讲的时候,这些东西你没那么容易忘啊,很多人就是说容易忘的一个点,就是我只看就是有一句话叫什么。
甚至叫我收藏收藏我就学会了,我们称之为学费啊,那就叫学废了,OK啊,这是我给大家讲的一个学习的技巧,然后我我我帮大家分享一个。
就是一个比较理性的一个东西,就是学东西,这个大家说学记不住也好,或者这其实都是一个借口,为什么,因为你就没有用心思,就是如果你喜欢一个女孩,尤其你的初恋,我也是哈哈哈哈哈,太多了。
不是就是如果你像你的初恋是会记一辈子,就是你看你用心的程度,然后呢这个你你初恋为什么可以记一辈子,因为你记住了他很多的细节,比如说他哪儿好,哪儿温柔,然后你能说出五六十个来对吧,或者七八十个。
但是比别的女孩子,你就说出来很少注意听,刚才那个就是就是本质,如果你想把东西学好,学东西的过程当中,就一定要关注这个东西的方方面面,也不要这个一平板大屏的逛逛,或者是死记硬背背一些调理的东西。
这是不对的,有任何的一个技术里边的,任何的某每每一句定义,你要去展开它,然后但是这种写法呢,你初听上去就好像说每一个东西我学的很细,很细腻,比如说一个我就像连连连老师讲了一个spring。
他要讲70个小时,然后你听他的课,听70小时,我是不是还得画出来啊,200小时,然后再去钻研它里面每一句话,然后这这就是错误的,我教你一个正确的学习方式,就是第一个是先宽什么,先宽,你先呃不要让自己说。
每一个看课我都要达到老师那个程度,或者学得很很很很好,先快速过课,先打开自己的认知,因为有一些东西就是呃咱们举举举例子啊,把知识分成两类,一类知识很死板,很刻板的,比如说像if else循环哎。
另外一类它就属于我们这个编程,逻辑思维的东西,逻辑思维的东西它就是很很很泛,但是他又有很很有规律的,你必须打开视野,我就举个例子啊,就比如说咱们讲呃MQ啊,或者讲我讲大数据的时候。
讲所有的找凡是涉及到这种通信的RPC的,然后等它都会有自己的这个command,然后就抽象的过程,然后呢都会有命令的这个匹配的,适配的和DDD拍摄的过程,那这个时候其实当我看第一次看的时候。
比如我第一次看到spark啊,我见过这种形式了啊,他以这种形式展现出来了,后边我去讲这个卡不卡诶,又见到他以另外一种形式展示了,但是大差不差,他的逻辑框架已经出现了,然后我再去讲这个诶。
还是我就我就你再去看任何没Q的时候,你就会发现我不是要去看,我是要带着前面那个东西,我去论验证和论证这个东西,所以你只有你的认知,或者你多看课,先看,看完之后,然后就等于一个课程。
比如说全算下来是400个小时,你要先用11。5倍或两倍速度,先给他突突了一遍,突完之后,然后再翻回头去,然后呢再涂了一遍,就是你拖个两三遍,这个课程它比你说每一节课按在这两个小时,我要拿出三四个小时。
研究这两个小时到底讲什么东西,它要更更有效果,再举个例子,你们自身的一个一个感觉,就是这个我听了A老师的,比如说REDIS听完之后啊,然后还还行,我去听了毕老师的REDIS。
我看这毕老师讲师讲的特别的好,我可以跟你说,未必是这个B老师讲的特别的好,是因为你前面先听了一遍,在听毕老师的时候,你在已经有认知的情况下再去接收一遍的时候,你的条件反射就有了,你又共鸣了。
你就知道他这个前后的关系,你你就能适配这个东西了,所以学习啊就是不要只学一遍,而且是那种特别死板,特别细的学,你要尽量的啊这个课都快速过过个两三遍,然后呢第一遍裤子过的时候呢,也不要只过。
然后呢你要随手留个纸和笔,永远记住,昨天我讲课的时候说这事儿了,不要相信自己脑子,你脑子会欺骗你的啊,就是我我我我学会了,我听懂了,我理解了,我记住了,这全都是假的,都是假象,你又在纸上去写写大纲。
写他的这个拓扑,然后你要抓的是这个脉络,第一遍,第二遍的时候,然后再基于这个脉络里边,你要敲重点,然后呢圈这个突然的那种条件反射哦,原来老师刚才那那那那那那课讲了这么一点,我没有get到。
或者原来原来前后前后的课程111,这个后边的东西为前面一铺垫,原来真的是这回事,你只有这么去学,然后东西就很难去,就是绝对的忘记它,让你的复习也会变得非常的快,而且这个才可以满足香港的老巢说的说。
你如何给你的女朋友,给你媳妇,或者给你的朋友同事讲清楚,就是这种费曼学习法,就是你自己这一关要过了,你如果自己在学东西的时候,嗯是一种就是这种这种应付式的学习,就是我就这个这个使劲嘎学。
你很难去给别人讲讲的,因为你没有没有没有这个拳击的概念,你给别人输出的时候,就跟大家说,我要说一个事,但这事我还没想好呢,我要跟你开始说,那这个收起来肯定很复杂,但是这个事儿我自个儿心里想了好多遍了。
我也预言了好多遍了,那这是我在跟别人聊的时候,我一定总分总的我现在跟你说一个事儿,这事儿大概是一个什么事,然后具体会有几个点,然后之后几个点分别是什么东西,就是你最后你要让你的知识灌到你脑子里边。
你能总结归纳的能力,比如我说我跟别人聊release release,大概的跟你说啪啪啪啪有几个点,对不对,他的单机这方面呢,他在自己内部数据结构的,在于它的这个这个性能优化的,在于它的持久化可靠性的。
然后再说的多机这方面在于集群方面的,把你有一个逻辑性条理性给他说出来,但是这个东西你说我随着课程慢慢学的话,你很难去在脑子里建立这种这种感觉,你没有感觉,只有你先快速突了一遍课哦。
老师总共就说这么多东西,我又回去看了一遍,验证了他说的他这个思路,逻辑思路在这,其实有的时候你们学一个课的时候,第一你只学了一遍,你是不知道老师,因为一个课每个老师讲法是不一样的。
就REDIS李老师和我讲讲法绝对不一样,但是我们都会我们自己的逻辑在里边,你听一遍,你是很难最后能悟出了我们的思维逻辑,我们是在偏向于哪个点上去讲这个课,你只有快速爬过一遍,然后知道先先找这个点。
你回去再过一遍的时候,你就特别能感感悟到哦,这个老师可能是偏他的这个里边的架构的,这个老师可能偏源码的那个老师,可能偏它里边这个经验优化的等等,好吧,我们就利大家说这么多。
就是希望大家能在学习的时候能驾驭这件事情。
系列 5:P10:10、程序真的是按照“顺序”执行的吗? - 马士兵学堂 - BV1E34y1w773
一般来说呢关111谈到多线程的时候。
一谈到并发编程的时候,我们都会讨论它的常见的三个特性,这三个特性这三个特性呢分别叫做可见性。
有序性以及原子性。
这里面最简单的实际上是可见性。
就是多个线程之间改一个数据之后呢,另外一个线程要及时可见。
这一般来说我们拿过拿volatile修饰一下就可以,第二个呢就是有序性。
有序性稍微复杂一些,原子性是最复杂的,这里面牵扯到各种各样的啊五花八门的。
甚至给你开放了,你可以自己往里填的五光十色的锁lock是吧。
呃今天呢我们聊这个有序性这件事,我们先从一个有意思的地方聊起,就是程序真的是按顺序执行吗,有同学说老师你在这逗我玩呢,那个那难道程序还不是按顺序执行呢,当我们看到两句话的时候,比如说X等于X加加。
这是你的程序的写法,一定是先写的先执行吗,X等于先执行,然后X加加再执行,X变成二,不可能X加加先执行,那样的话,那编译都会没准都报错是吧,所以程序当然是按照顺序执行了,但是未必,比如说像这两句话。
X等于一,Y等于一,你说这哥俩谁先执行,对最后的结果有影响吗,没什么太大影响,所以程序真的是按照顺序执行的吗,来我们来看看小程序就行好,大家看这里啊。
呃这个小程序是非常经典的一个小程序。
这个小程序最早开始的时候是拿C语言写的。
呃,关于这个小程序呢,我简单给大家解释,你认真听。
需要一点点小小的业务逻辑知识,逻辑知识,不能说业务逻辑逻辑知识。
数学的推理相当的简单啊,你看我这里面有四个值。
XY是一对,AB是一对啊,可以说是有四个值两对。
那么在这四个值里面呢,我做了一个循环。
这个循环的不停的循环,每个循环里头我都会起两个线程。
这是第一个thread,这是第二个thread,这两个线程干的事特别简单。
第一个干的事呢就是A等于一,X等于B。
第二件事呢叫B等于一,Y等于A哇,太简单了,不能再简单了。
好我们主要分析的是什么呢,主要分析的是当这两个线程结束的时候。
Let await,然后最后我们两个拆线程都结束的时候。
我们最后的这个X值等于几。
Y值等于几,再说一遍,这是我们第一个线程A等于一。
X等于B,第二个线程B等于一,Y等于A。
由于他们两个是位于不同的线程,所以它们之间有可能交叉执行。
交叉执行之后,我们X等于几,Y等于几。
这是我们需要探究的话题,大家听懂这个问题了吗。
能听懂的,给老师扣个一,嗯嗯嗯搞点反馈啊,Hello,幻雨星辰嗯,都是活人,对不对。
太难了,嗯这是一个证明题。
不是让你从头到尾设计的,你能听懂就行好吧,四种可能啊,胡服你看胡服多牛多牛叉,他居然分析出了四种可能啊,哪那么多可能啊。
我们来分析一下好不好,好大家看这里啊,呃既然是两个线程,我们假设这是第一个线程,这是第一个,这是第二个,这两个线程啊,由于它又会交叉执行,所以说不准是哪条语句先执行哪条语句后执行,正常的情况下。
比如说像这种情况,A等于一,X等于B先执行,然后B等于一,Y等于A后执行,那么这种情况我们分析一下,这时候X等于几呢,X等于零嘛,因为B初始值为零嘛,对不对,所以X等于零,Y等于几呢。
由于A已经设为一了,所以Y等于一,所以这种情况叫X等于零,Y等于一,或者是什么呢,第二个线程先执行B等于一,Y等于A先执行完了第一个线程才执行,A等于一,X等于B那最后的结果就是X等于一,Y等于零。
哎超级简单,那剩下的呢就是各种各样的排列组合了,比如说我第一个线程先执行依据,第二个线程执行依据,第一个线程又执行第二句,第二线程又执行最后一句好,这种情况是X等于一,Y等于一好,第二个线程先执行依据。
第一个又执行,第二个线程又执行第一个右执行,总而言之,这样执行完好,X等于Y等于一,如果说第一个线程执行完一句,第二个线程执行两句,最后第一个线程在执行一句,X等于一,Y等于一,如果发生这种情况。
第二个线程先执行一句,第一个线程两句,第二个线程又回来,X等于Y等于一,Ok,这就是我们分析出来的所有的排列组合的结果,这块你没有跟上,关系也不大,我呢就跟你已经分析完了,反正总而言之就是这三种结果。
哪三种分别是X等于零,Y等于一,X等于一,Y等于一和X等于一,Y等于零,来我们来跑一下,看看他最后的结果到底长啥样,run见证奇迹的时刻好。
这程序由于是个特别长的循环,不停的循环。
什么时候这个循环才会退出呢,只有是发生X等于零,Y等于零的情况。
他才会退出,他会给你打印出来,说第二次的情况下发生了X等于零。
Y等于零,这种情况。
这个需要看,人品的啊。
看运气的,看看石子的人品到底好不好。
如果好的话,我们很快能见到这个结果,如果不好的话,我们今天晚上估计够呛了。
没事,明明周末是吧行你们想得开就行。
不会吧,真不给面子哈哈。
听我说啊,就算是嗯就算是没有发生这种情况,我给你把我以前跑的那个截图,给你揪出来就行了,这是我以前曾经跑过的两个截图,第27万,272次循环的时候发生过零零,这个大概跑了得有半小时。
第11问万次的时候发生过零零嗯,Ok very good bingo。
很给面子啊,说明石子石子同学人品不错。
第41万1206次的时候。
发生了X等于零,Y等于零的情况,我勒个去。
啊我讲到这。
你们还能跟上吗,有问题的直接问,没问题,给老师扣一。
嗯哼哼哼。
很好很好,好那现在问题又来了。
这这这这是为什么呢,这玩意不可能啊。
因为我们分析来分析去,你不是发现了吗,只有三种情况,X等于Y等于X等于Y等于一和X,一等于等于一,Y等于零,不可能啊,没有这种X等于零,Y等于零的情况啊,你看你看鹿鹿晗都来了,鹿晗是我们的VIP是吧。
嗯好大家看这里同学问你,我们来分析一下,只有在什么情况下才会发生X等于零,Y等于零呀,注意看只有在这种情况下,首先执行的是X等于B,再执行Y等于A或者先执行Y等于A,再执行X等于B,然后A等于一。
B等于一,放到后面去执行的时候,他才最后的结果才是X等于零,Y等于零,所以通过这个结果来倒推的话,你会发现,看这里你会发现这两句话换了顺序了。
这句话要换到这句话前面去。
这句话要换到这句话前面去,只有在这种情况下才会发生。
X等于零,Y等于零,好讲到这还能跟上的老师扣个一,那说明什么。
说明我们平时看到的这两句话的执行顺序。
并不是我们想象中的,先执行这个再执行这个NO不一定。
也就是说我们回过头来再来看。
我们最初始最最开始的时候这个问题啊,程序真的是按照顺序执行的吗是吗,现在告诉我是还是不是,当然不是好,那现在问题就来了,为什么会发生这种情形啊,为什么他会乱序执行呢。
系列 5:P11:11、为什么乱序? - 马士兵学堂 - BV1E34y1w773
简单说就是为了提高效率,有同学说what乱序执行居然是为了提高效率,没错,举个最简单的例子,大家都知道CPU的嗯,严格来讲应该叫CPU内部的寄存器的速度,寄存器的速度啊,访问寄存器的速度。
就是我们CPU计算单元访问寄存器的速度,要比计算单元访问内存的速度要快得多得多,快多少呢,大概是100比一,比如寄存器的速度是内存速度的100倍,那么假如说我们有两条指令,第一条指令啊。
它是跑到内存里面去读数据,但是由于我的ALU我的计算单元访问,我们计算这个这个这个内存的速度呢,它非常非常的慢啊,我发一条指令过去,然后等着这个内存给我返回回来,数据的时候大概得得有99个时间周期。
那如果后面还有一条指令,这条指令的话呢,它是不需要访问内存的,它只需要在本地的寄存器做计算,比如说对某个寄存器ENX加了一个班好,我就直接在本地做一个计算就可以,我有必要等着这99个时钟周期返回吗。
如果前后的指令没有依赖关系的话,完全有可能是在第一条指令执行的过程中,第二条指令优先执行完,这样的话效率反而是最高的,如果你还听不懂,我给你举个生活中的例子,比如说你要烧开水泡茶,正常的情况下。
你按照顺序执行,是洗水壶,烧开水,烧上洗,洗大壶,洗茶杯,拿茶叶泡茶,但是完完全全可以并行执行,怎么执行呢,洗水洗完水壶之后,烧开水的过程之中,我就直接洗茶壶,洗茶杯,等烧完开水之后,拿茶叶泡茶。
好能get到这一点的同学,老师扣个一,人是有灌鸡汤,有点学不动,灌鸡汤不用我灌,找那个我们的看看看我们最近就业的信息,你不就直接给关了吗,学的动的都已经薪水翻了倍了,它不香吗,嗯好我讲到这儿了。
总有同学也会有疑问,回答同学们的一点点的疑问,哎,几分钟EDD问呢,单核CPU会乱序吗,废话说的就是单核CPU,这跟多核有半毛钱关系吗,单核CPU现在执行的是两条指令的歌,后面这条指令有可能跑前面去。
发生几率小,一旦发生了还会对程序有影响,总感觉弊大于利,上官元恒这里省了99个等待的时间,你居然说弊大于利,你是脑袋进水了吗,发生几率小,发生的几率非常高,我们这个程序为什么发生的几率小啊。
难道你理解理解不了吗,我讲到这还能跟上吗,我下面给你讲,为什么这个程序发生的几率比较小,底层发生的几率超级高,这个程序是一个证明程序,它发生的几率相对小的原因是什么呀。
每一句话翻译到汇编都是好几条汇编指令。
这句话也是要发生这种几率的情况下。
得把这好几条跑到这好几条前面去,当然它就会几率小一些。
与此同时,这两个线程同时发生,这个线程X等于B跑。
前面这个线程Y等于A也得也得跑前面大哥。
这是一个成方关系。
学过概率,这里的发生几率小,指的是那个我们证明程序里头。
并不是只说的底层的发生概率小,这个是必然发生的,那这样业务代码不都很危险,你写的业务代码很危险,你要是理解了,你写业务代码就不会威胁发起执行,还是按照顺序后面执行,先执行,结束,没看懂,请说人话好听。
我说我讲到这呢,很多同学应该能理解了,为什么有可能会产生乱序呢,就是为了提高效率啊,就是为了在前面等待的时候好,后面的呢可以留下来执行,那现在现现在问题就来了,就说什么情况下我们讨论一下啊。
就说什么情况下能够提,能够呃呃乱乱序来执行呢。
系列 5:P12:12、乱序存在的条件 - 马士兵学堂 - BV1E34y1w773
什么情况下好听,我说这种情况呢叫做一条原则,这个原则呢是这样的,前后的指令一定不存在依赖关系,你不能说前面指令是X等于一,后面X加加存在依赖关系,绝对不可能换顺序,但是最终的顶顶级的原则。
这条原则叫做as if serial,来这个单词应该都见过,This is zero,看上去像序列化的好,请给我记住这条原则,这条原则叫做不影响单线程的最终一致性,什么意思,X等于一,Y等于A嗯。
好就这么说吧,无所谓啊,这两条指令先执行后执行,在我这个县城里面,影响最后XY的结果吗,ab的结果不影响啊,这俩这哥俩谁限制性都可以好,这就是乱序的最根本的条件,就是只要是不影响单线程的最终一致性。
那么你就可以做到整个程序看上去像序列化,实际当中有可能是乱序的,好了,这个东西叫做as if serial,看上去像序列化的,但实际当中是乱序的,只要是单线程的最终一致性不受影响,没关系。
里边的顺序随便换,这单词见过对吧,那个最近有同学说我们讲课的问题啊,嗯好像是最近啊。
A1周VIP啊,嗯上了一周课,就上了一周的课,上个月看java并发编程的艺术,还有深深入理解java虚拟机,完全一头雾水啊,学完课程全都懂了,对你们自己看看,基本上听不懂啊,嗯嗯咋说呢。
你们如果看到这个单词a serial,估计很多同学也理解不了到底什么意思,现在大家伙应该都能理解了,就是很简单,因为我们CPU需要提高效率,所以他最终有可能乱序执行,乱序的最终的原则就是。
只要不影响单线程的最终一致性,可是他现在影响的是,不影响的是单线程的最终一致性,但是我想问你的是,如果多线程会不会出问题啊,多线程会不会出问题,当然会啊,你看我给你举的这个例子不就出问题吗,X等于零。
Y等于零,是你期望想得到结果吗,未必,但是它就出现了,当然这种问题呢是存在于面试里头,我再给你看一个问题,这个问题看大家能不能找得出来,当你理解了乱序这件事之后,我们来看这个问题,来看这里来。
我先跟大家说啊,嗯这个问题是出自于一本书,这本书叫ja and currency practice,那本书你从头到尾看,你也看不懂,听老师讲你就能听懂了,这个小程序是降子底,小程序呢有两个值,第一个类。
第一个值是布尔类型的ready,第二个值是number,ready等于false number,它的一个初始初始的默认值就是零是吧,我们有一个线程reader thread。
它执行的时候是我not already,只要你这个还没有准备好的时候,Not already thread yield,我的线程就不执行,继续下一次循环,什么时候你好了,我就把那个给你打印出来好。
我们的主线程干了一件事,让这个线程启动,把number给它设好,number等42诶,设好了,设到number里,然后把ready等于true,那我们这个值就已经打印出来了,最后呢我们等这个线程结束好。
我想问你是不是我们打印的这个number值,一定就是期望我们这个42期望的是42,是这样的吗,另外仔细阅读这个小程序,给我挑出来这个程序中的两大毛病,两个大毛病,给大家30秒时间,读一下啊。
这小程序有两个大毛病,30秒钟,看警方问了个问题啊,说那个其他高级语言也会有类似情况吗,听我说所有语言都一样,今天我讲的内容跟语言没有半毛钱关系,我现在讲很多东西都跟语言没关系,我讲了rust语言。
讲过go语言,讲了N多N多的语言,我们的课程包里都包含这些语言,但是你理解了一门,其他门呢理解起来就非常的简单,罗哥哥说join join是个什么鬼,这小程序已执行结果是对的,你执行1万遍。
这个结果都有可能是对的,单手我直接告诉你啊,就变成如果按变式来讲,它有两大毛病,米兰的老铁匠不是ta run吗,老铁匠同学呢是一个零基础的小伙伴啊,你非常的可爱,其实你比较面的时候最好不要说话。
因为你说话容易让别人知道你比较面,先从我们零基础的课开始慢慢跟,好不好,老铁匠,95kg嗯好我们说问题出在哪,这里面有两大问题,第一大问题是呃,这个线程很可能结束不了,什么意思呢。
就这个线程呢有可能结束不了,这里面说的是线程的可见性问题,可见性说的什么,这里有一个ready吗,ready是在我们内存里false,然后我的主线程main线程,我把这个false给改成了。
我把这个RAR给改成了true,它是改的哪部分内容,实际上改的是他本地的缓存,改的是这部分,把自己缓存的这个给改成了true,所以如果这哥俩不做同步的话,而另外一个线程我们的reader thread。
他读的是自己本地缓存的这个R它是false好,如果这哥仨之间不做同步,我告诉你这个县城有可能都不结束,当然由于线程可见性,它底层的内容呢牵扯的比较多啊,MES是一个主动机制,它就有可能给你做了同步了。
像那个volatile是一个被动机制啊,就是lock指令帮你做的,这个呢今天就不聊就不聊了,反正总而言之,如果你想让这个程序写的比较严谨的话,这里要加一个关键词叫volatile,还有这是第一个问题。
如果这个问题没听懂,放一边,我们讲有序性,主要聊的是第二个问题,这个问题是什么呢,这个问题就在于同学们,你们想一下,如果说这两句话发生了顺序,再看一遍,仔细分析一下,如果这两句话发生了,换了换了顺序。
ready等true等于42放到前面去了,我们正常的情况下不都是这么写吗,我先把这number改成42,然后再把ready设为true,正常应该就打印42了,不一定的。
如果ready等true在我们执行的时候被放到了前面,跑前面去了,那么这时候ready就先设为true,也就是说这块就先结束了,打印的这个还没有来得及来得及设计,42的时候,打印出来就是零,好。
能get到这一点的同学老师扣个一,所以这个程序不单单是有那个可见性问题,还有还有什么有序性问题好吧,这种情况有办法解决吗,当然有,Sure,必须有,这种情况解决的最优雅的方式,你们可能都想不到。
叫做atomic preference,当然还有其他的解决方案,比方说加synchronized,加入entry lock,这些都可以啊,但是最优雅的方案其实是这个atomic reference。
把这两个值设为我们一个引用类型的,一个一个一个成员变量,然后呢设好了之后,统一性设好之后再开始执行啊,这个就不展开说了,我们继续说有序性的问题啊,如果说这个面试题还算是相对简单的话。
那么下面这道面试题就比较难了,看这道题啊,我们来看这道题,这道题我得给他恢复一下原型好,大家看这里啊,New thread,This number,好看看这个小程序哎这小程序特别好玩。
小程序呢就是我我有一个类,这个类里面有成员变量等于八,然后我构造这个构构构造,我们写我们构造方法的时候,直接new了一个thread让他启动,就是说构造构造完成之后呢,我就new了一个thread。
让他启动打印我们这number的值,当然这个打印呢你其实可以理解为,我就是开始使用这个number的值啊,比方说他让他加加呃,让他跟其他的数值做计算,那么我想问你的是这个小程序有没有毛病,这块比较难。
我先说答案,这个是著名的this1出问题,这个是绝对有毛病的,有毛病,有同学说我这么简单的程序居然也有毛病,没错是的,你说的很对,为什么会有毛病呢,好好听我说毛病出在哪,要理解这个东西。
有毛病这件事你得理解另外一个东西好,现在还能跟上吗,同学们,我现在有点把控不好,你们每个人的这种对这种这种这种基础啊,还有同学跟不上还能跟上吗,没问题吧,可以是可以,我们继续啊,还行。
OK这个小程序怎么会有毛病,他毛病出在哪呢,好仔细听我说,为了讲清楚这个问题,我们必须得弄明白一件事,就是我们new一个对象的时候,就是new一个对象,new谁呢,new这个T03。
this escape啊,new这个对象的时候,你有一个对象的时候,他背后到底发生了什么,为了弄明白这件事,我们写了一个特别复杂的小程序,这个小程序太复杂了,看大家能不能读懂好,这个小程序,就一句话。
object o等于new object,这个世界上最复杂的程序,美团曾经围围围绕这句话,提出了九个系列性的问题,答出来,你的年薪就大概在50万左右了,好听,我说我们先说其中一个比较简单的这句话呢。
它背后到底执行了什么操作,什么意思,大家都知道啊,这个我们高级语言,这是我们的高级语言,他翻译翻译翻译总要翻译成为第一级语言,翻译成汇编,java呢又是一个java虚拟机。
JVM虚拟机就把它当成一台虚拟机器,它有它自己的汇编语言,这个汇编语言就是我们的二进制字节码,叫bite code,好下面我们就来看一眼,当这句话执行的时候,它会翻译成为多少句二进制的字节码。
嗯distance说算了,还是去学C加加吗,现在去学C加加的全是傻帽,多说两句吧,有一门语言,那叫Rest,如果你有希望有机会的话,我希望你好好学学,当然我们课程里就已经包含了啊。
Rust rust rust rust rust rust。
rust在哪来着,好像就在我们课程包里啊。
嗯rust语言呃。
这个呢我讲过了,大家听我说啊,嗯可以这么说,现在世界上有很多很多的语言都在抢呃,有一门语言的这种市场占有率,这门可怜的语言就是C加加,好多好多的语言都在抢它的市场占有率,那么有谁呢。
有著名的go on是吧,有最新的Rest,当然还有和rust其他类似的各种各样的语言,原来还有java是吧,哈尔听我说C加加呢,由于它太复杂,当然一时半会儿呢,它的市场占有率也不会被占完,原因是什么。
他以前开发的很多类库太多了,大家用的顺手了,但是我觉得大概未来几十年内,他慢慢的不能说淡出历史舞台,但是他以他的占有率会依然会缓慢的下降,毛病出在哪儿,毛病出在C加加比较复杂,他要手工管理内存。
当然它比较好,它效率比较高,效率比较高呃,他要手工管理内存,但是如果有一门语言,如果有一门语言是什么样的呢,不需要手工管理内存,执行效率跟CC加加一样高啊,跟汇编差不多,那么你说它的市场会不会被抢到呢。
有人长得跟你一样漂亮,还比较便宜,还比较能干,你说你的市场会不会被侵占,好,这门语言叫rust,你们一定要抬头看世界啊,别闷着头往前冲,傻了吧唧的那个路都已经走歪了,还还在闷着头往前冲呢,别这样啊。
好了不废话了,我们来看这个啊,就是你跟着老师走呢,你就永远站在世界的最前沿,it界的最前沿,好大家看这里啊,包括我们讲的service mesh,很多人都没有讲呢,我们都已经开始落地了,就是总而言之。
这么多大厂的一线大厂的老师肯定不能便宜了,他们是吧,得让他们多多的好好的呵呵,压榨他们的价值,都让他们讲课,嗯你呢正好就得到了最好的训练,好看这里object o等于new object呃。
这句话呢它翻译成字节码会有好几条指令,View should bite code with class library,这是一个小的插件,直接拿来用就可以好,我们找到methods两个方法。
一个是构造方法,一个是main方法,main方法点code我们就得到了哦,原来在这里它有这么多条指令构成,好这么多条,看一眼,一共有五条指令构成,12345,第一条指令叫new。
第二条指令叫duplicate,第三条那叫invoke special,第四个叫a store,第五叫return,好,为了让大家能理解这五句话,我专门做了一个,PPT这五句话呢不太容易理解啊。
你认真听呃,这个呢跟我在JVM课里讲过那个class漏到内存,有一个中间态跟这个差不多有点类似,看大家看这里啊,嗯我们假设有这么一个类class t,它有成员变量int m等于8T,小T等于6T。
当我们执行这句话的时候,刚才我们看到了它有五条汇编指令构成,第一条叫new,第二条指令叫duplicate,我们先把它略过这块,我要给你讲的话比较复杂,我得给你讲那个呃县城本地站啊,栈顶指针啊。
怎么压榨,怎么出战,太复杂,扔扔一边,而且跟咱们现在讲的乱序没关系,先扔一边好,接下来invoke special调用特殊的方法,invoke调用special,特殊调用特殊的方法,什么方法呀。
initialize调用它的构造方法好,下面这条叫door store的,意思叫做,把这个小的局部变量,和我们new出来的对象建立关联,它指向一个new出来的对象,所以当我们执行这句话的时候。
return先不管他一共执行了三条最主要的指令,第一条叫new new是什么意思,申请空间,把这块内存申请下来,相当于C加加里面的new,相当于C语言里面的memory allocation。
好第二条呢叫做调用构造方法,第三条叫建立关联,那么这几条指令执行的过程是什么样子的,仔细看,当我们执行到第一条指令new的时候,它真正的会在内存里面申请出一块空间来,这块空间就是我们new出来的T对象。
当然就是一个T对象里面,由于他的有一个成员变量小M的歌,所以这个它里面一定要有一个小M的好,这个小M的值是几呢,在java语言里面,当我们new一个对象来的时候,里面的成员变量都有一个默认值。
这个默认值int类型的默认值是零,很多同学可能没想明白,我说老师他为什么有一个默认值呀,他没有值不行吗,我反正申请了这块内存,这块内存原来装的什么值就值呗,上一个程序留下来的,我就直接拿来用呗。
反正我新的程序要对它赋值,我干嘛,我我我我没有必要说,我再去自己去给他初始化一遍啊,没有这个必要啊,这块讲能听懂吗,尤其是写过C语言的人,写过C加加语言的人,当我们申请完一块内存,这里面有个值。
它的值是什么,这块能确定吗,如果是C和C加加的话,这个值叫做上一个语言留在这里的上一条语句,上一个程序留在这里的是几,就是几,说不定正好上一个程序留在这里的是一个password,是我的一条密码。
Very good,太好了,我就把你密码给你破了,有安全问题,OK所以在java里面就干了这么一件事,申请完这块内存之后,马上就对它进行一个默认值的初始化,这个默认值是几呢,零,好这块还能跟上的。
给老师扣一,现在大厂面积的时候,都是从一个简单的问题开始,一直顺着往里面面面看,看你能聊多深,聊多宽,刚原来开始还是聊多深的问题,现在开始都是聊多宽的问题,越来越难了,所以我每次都得给你展开来聊好。
大家看这里再来继续看,当我们执行到这句话的时候,new new对象的时候好,申请完内存里边有一个默认值是零,调用构造方法好,就用到这句话了,这个时候才会把它的值给改成八,他这个八是它的初始的值是吧。
给它附了一个初始值,所以中间有一个从0~8的过程,好零这个状态M等于零的这个状态,这个状态叫半初始化,刚初始化了一半,那最后一句呢叫a store,HISTORE的意思是建立关联,什么叫建立关联。
这个小T指向了我们初始化好的这个对象,我们再来看一遍,当我们new就这么简单,一句话,new一个对象是怎么执行的呢,执行到new的时候,申请内存设默认值好,new执行完了。
接下来执行invoke special,改为初始值八,执行a store建立关联,三三步由三部构成,抽烟喝酒烫头,周老师三大爱好,抽烟喝酒剃头,主要烫头,他就他那头皮就给烫了,好三步构成申请空间。
设默认值建立关联哎,要申请空间啊,这个勾呃调构造方法建立关联好吧,好了我们继续听我说,当我们理解了这句话之后呢。
我们再来看这个小程序,不知道你现在是不是能发现,这个小程序的毛病之所在,来看这小程序,不知道大家能不能发现,这个小程序的毛病之所在,就像关于毛病的隐藏的比较深,我就不卖关子了,直接讲给大家听。
这个呢我们仔细想一下啊,当我们执行到这句话的时候,New t 03this escape,好好听,我说,当我们执行到这里的时候呢,其实我们是有一个隐藏的this变量,当前对象嘛。
然后这个this变量指向谁啊,指向的是调构造方法的时候,这是我们调这个构造方法的时候,一个局部变量类,如果这块你实在理解不了的话,这会应该能理解啊,如果你实在理解不了的话,我稍微给你演示一下啊。
看大家能不能看得到,我们依然看他的那个呃,汇编码,V show bite code,Buy buy buy bubbite code with the class library,找到这个构造方法啊。
Initialize,这是我们的构造方法,看他的code,我们不要看它的code啊,看他的这个呃,Local variable table,局部变量表,大家看这个局部变量表里面是不是有个this啊。
看到了吗,所以说这是我们构造方法里面的一个局部变量,局部变量this好,所以说我们在new这个对象的时候,我们有一个this变量,this变量指向谁呢,指向我们正在new的这个对象。
当前的这个对象this指向它好,既然是这样的话,他new的过程不是有三步构成吗,有印象吗,第一步申请空间,第二步设初始值,这个值为零嘛,是默认值,然后把它改成八,然后呢让this指向它。
所以我们这个线程打印this number的话,我们打印出来是八,但是很不幸的是,我刚才说过,说这个东西呢它是有可能会发生指令重排序的,what会发生指令重排序。
对不对,好在哪会发生呢。
系列 5:P13:13、乱序真的会扰乱“并发”吗? - 马士兵学堂 - BV1E34y1w773
同学们你们想想看,如果这两句发生了重排序,这两句,会发生什么情况,这两句发生重排序会发生什么情况呢,会发生这样的情况,就是当我们呃new出来,然后把它的值设为零,设好了之后呢,我并不是调构造方法。
而是直接先给建立了关联,那这个题指向的就是我们班主任,就像这个this指向的就是这个number是为几为零,而这时候我们启动了线程,线程一启动输出的值是几呢,是零,好能听明白这个问题的同学,老师扣一。
所以在这个小程序里面,这就是著名的this溢出的问题啊,它叫做英文的名字叫this escape,你要你要去读那个多线程专业的书的话,你读到你未必能理解的了,而这种程序还能出问题有问题。
所以一般的情况下我们怎么做呢,这个程序怎么去修改它,听我说啊,一般来说呢,你在你的构造方法里面不要去启动线程,你可以让这个线程初始化,但是不要去启动,看这里你可以这么来写,指尖的旋律,没懂旋律的旋律。
小伙伴,你是那个什么水平啊,你可以定义一个线程threat,然后在这里呢把它给初始化了,注意看,T等于new thread是吧,new完了之后呢,我们在另外一个方法里面再让它启动,带另一方法。
Public void start,叫start t吧。
嗯然后在这里呢调用start,这块大家能看懂吗,new出来之后调用start t这么来写,再说一遍,为了防止this溢出的问题,不要在构造方法里面new线程,有同学说,老师啊,我平时从来不这么干。
但是不耽误你,有的时候很可能调用第三方的类库,不小心这么干了,所以这种问题呢一定要小心,嗯而且呢这种问题可以说出现之后呢,八辈子你见不着错误结果,可是见我见到一次之后,很可能就是灾难灾难性质了,好吧嗯。
加volatile,这跟volatile没有半毛钱关系了,目前目前跟volatile没关系啊,实际可以跑出来这种外形的效果,跑不出来,不好跑,相当的难跑,所以这个东西是存在于面试之中。
而且是特别值钱的面试之中嗯,稍微的巩固一下这个问题,这这这会大家还能跟上吗,我看有同学说跟不上,是不是跟不上,我得问问你的基础在哪里啊,如果基础太弱的话,先跟我们零基础的课去呗。
我要从零开始把你培养成为上海名媛的嗯,我们在座的上海名媛,每个每个都是有一定的经济基础的,是不是嗯,好好OK我们继续,你们继续,当理解了这个问题之后呢,我们真的来看一眼这个美团的问题啊,美团嗯。
这个美团的围绕我刚才不是说了吗,美团啊围绕着这句话,就这句话啊,object o等于new object,就这句话,这哥们大概问了七个问题啊,后来又加了两个,一共是九个问题。
第一个问题要解释一下对象的创建过程,就是半初始化,我刚才给你解释过了,第二个呢就是DSL和VOLA的问题,这个是指令的重排序,我一会儿讲给你听,第三个呢叫对象在内存中的存储布局,分成四部分。
分别是Mark word,Class,Pointer,instance data以及padding,第四个呢叫对象,投者包括什么,包括两个大项,一个叫Mac word,一个叫class pointer。
我可以这么说,大厂的面试题里头关于底层,这哥们大概承担了30%以上的面试题,Mark word和他相关的太多了,务必把它搞清楚,第四个表对象是怎么定位,直接定位还是间接定位,第五个是对象怎么分配。
从站上开始到县城,本地到伊甸去到old区,到底在内存中占多少个字节,压缩不压缩都是16个,第八问,为什么HOSPORT不使用C加加对象来代表,代表java对象,HOSPORT本身是拿C加加写的。
它中间采用了OOP2元模型,而并不是采用的C加加对象,直接代表java,为什么这里面主要涉及到虚函数表的问题,第九问,class的对象是在堆还是在方法区这块,能答对的人也不多。
十个里头有九个基本上都答不对,好不废话了,我们今天呢主要聊这个问题,这个问题呢也是跟重排序有关的,这个问题是什么问题呢,仔细听看这里嗯,嗯我们来读一个小程序啊。
这个小程序看大家能不能读懂这个,这个这个这个小程序嗯,劝退哈哈没有劝退啊,嗯你的目标呢就是个30万,这样的水平就无所谓了,这题懂不懂的,基本上都能达到,你的目标,有30万以上。
大哥这些问题好好跟我学一遍,薪水就让你涨上来了啊,这真不是开玩笑的。
好看这里啊,这个这个小问题是这样子的。
呃,大家看这个小程序,看能不能读懂这个小程序呢,是单利啊,雪狼兽都没工作,从零基础开始玩啊,我们从那个零基础的3月就让他拿了,薪水不太高吧,8K左右,零基础吗,来看这里看这里看这里啊。
我们来看这个小程序啊,这小程序呢实际上是单例模式的一种写法,我一提这个估计好同学又开始头疼了,老大什么叫单例模式呀,单例模式是单例模式,是一种非常魔性的模式,就是他的要求呢非常的简单。
当你设计一个类这个类的对象,大家都知道啊,new new这个类对象可以new好多个吗,person p1等于new一个对象,person p2等于六,一个对象好,有一些是不能new好多个的。
wife w等于new wife,一个对象又new一次又一个对象,我靠你这疯了,不可能的啊,你家wife肯定不同意的好,这时候怎么办呢,wife就想办法把自己设成单例,就是您您老人家。
甭管你有多少个放心,拿到的都是同一个人,这玩意怎么完成啊,这非常简单啊,wife2话不说先new出一个来,作为wife类来说啊,wife作为外服类来说,二话不说,先new一个出来,new一个出来之后呢。
他把自己的构造方法设成私有的private好,别人new不了,他只能我自己new好,那什么时候我想用一下这wife怎么办,专门有一个方法get instance。
把我们new好的对象给他返回回去就可以了,这样的话呢,不管你调用多少次的get instance的方法,不管你得多少次,你拿到的都是同一个wife对象好,这会儿能听懂的,老师扣个一。
这就是最简单的单例模式,单例模式嗯哼,我们重点讲的不是单例模式,单例还是相当简单的,当然呃为了追求单例模式的,比较牛叉一点的写法,人们是那个在这里面呢各种细节锱铢必较好,现在问题来了,有人就说了。
我现在还没有用到这对象呢,您二话不说给我new了,出来,啥意思,这不是占内存空间吗,能不能等我用到的时候再new,哎这简单改一下,当调用get instance方法的时候,先判断,如果等空。
最开始我有这对象,但是我不给它new出来,如果等空把它new出来,如果不等空,说明已经有了,直接拿来用,当然这种写法有问题,问题出在哪,就在于并发上面。
假如要是多个线程都调用这get instance方法,你拿到的绝对不是同一个对象,你会有多个wife,虽然这是你梦寐以求的,可是实际当中是不允许出现的,所以这是不行的,那怎么办,判断一下第一个线程来了。
判断为空暂停,第二个线程来了,判断依然为空啊,没有人new吗,那我就二话不说,new一个,第一个线程继续又new一个,所以这里会有并发访问的问题,数据不一致,因此要求修改,怎么改。
锁good方法上上锁很对。
使用这种写法加synchronized,还有多少同学理解synchronize这个事,可以这么说啊,如果说Mark word担任了30%面试,synchronized估计还要再单身10%。
这俩哥们加起来有40%的面试,都是因为他俩synchronized呢,Synchronized,等会我就不给你展开了啊,Sychronized,它涉及到的知识点非常多,我讲的话没有四个小时,估计讲不透。
Synchronized,首先第一点它锁定某个对象,这里面有个管程的概念,有个monitor的概念,我就不给你展开了,锁定某个对象,持有这把锁,你才能干某些事,这里头是两个概念啊。
第一个是锁本身这个概念被监控的对象,我们一般称之为monitor,这里监控的是谁,监控的是this,准确说监控的是this,Sorry,这不是this static,监控的是class对象。
零四的class对象,准确的说是这个对象上面的Mark word,一会看时间吗,有时间我给你展开来讲讲,没时间就算了,总而言之,synchronized所代表的含义是,只有一个线程能执行整个方法。
而且作为一个原子不可不能被打断,这个很重要,这就是并发编程第三大特性,原子性加上了synchronized的代码之后,这段代码叫不可以被打断,它具备原子性,同时也具备可见性,好我们先不聊这个问题。
总而言之,言而总之,我上了synchronized,上了锁之后,下面的这一大段不可以被打断,一个线程执行完另外一个线程才可以执行,所以绝对放心,我只要有一个线程把它给弄出来了。
那么另外一个线程再来访问的时候,他一定不为空,那这就可以保证了,不过很不幸的是,那有的人又继续的吹毛求疵,说大哥,您的锁的力度太粗了嗯,多台服务器叫分布式锁,锁的力度太粗了。
呃我看有同学说那个嗯多台服务器是吧,多台服务器的那个叫分布式锁,分布式锁的话呢,很多很多的讲讲讲的讲的太多了。
我们课程里。
在这里来自于阿里的曹老师给大家讲了。
分布式锁,分布所实现C它用的特别多。
大概分锁我看讲了多少节课呃,这是分布式事务,这是分布式分门锁。
大概呃黄老师讲的应该是两节课左右啊,各种各样的实现,那是分布式锁啊。
那个是另外的概念,我们现在讲的是单机,你先把单机弄明白了,再聊分布式嗯,我们刚才说了啊,又有人挑毛病了,这毛病什么叫做力度太粗,就是您这锁啊太粗了,别人承受不了怎么办,什么意思,就是我不能被打断的。
原子性的这段代码代码太多了,比如说这有一些业务逻辑,从数据库里读一个数据显示出来,其实这部分可以不上锁的,可以不放在我们原则性里面的,所以你能不能把这个力度给我改细点。
这个事当然也很简单,我相信很多同学应该都知道,就这么玩吗,来看看我们把这个代码业务代码给它略过去,先判断in since等于空,如果它等于空,我们再上锁上锁,Synchronized major。
零五点class static的吗,嗯上完锁new对象搞定好,15秒读一下这代码,想想看,并发情况下拿到的,是不是能够保证只有一个对象可以吗,看气问了个,为啥要sleep11呢。
sleep不sleep关系并不大,我主要是让他sleep之后,我做实验的时候能让他快速的发现这个问题啊,就是为了fail fast,Fail,这个也不行啊,原因是什么呀,同学们,你们想一下嘛。
一个线程来了,判断哥们儿,你是等空吗,等空好,第一个线程暂停,第二个线程来了,哥们儿,你是不是依然为空哎,依然为空,因为第一个线程还没有new呢,所以第二个线程继续往下运行,它怎么运行呢。
锁定对象上锁new对象好,把它初始化了,解锁把锁解开,线程结束,and好,第二个线程运行完了,这时候注意我们的instance已经有一个对象了,那么我们第一个线程继续,第一个线程下面去申请锁,抢锁了。
能抢到吗,可以为什么,因为第二个县城已经从茅坑里出来了,他已经把锁给解开了,所以第一个线程上锁成功,又new了一个对象,new了俩,所以在这里呢,虽然看上去你觉得能够解决多线程的问题。
但实际上他没解决,跑圈看看吧,我在这里睡一个毫秒呢。
主要是想快速的给你暴露出这个问题来,这样很容易就能看到这个结果,它不是同一个对象,你看我们打印的还是code,这里有什么287结尾的,这464结尾的是吧,前面还有032结尾的。
所以这100个县城里头,说不定丢了多少个对象出来,好了,菜碗豆腐司机,你等会儿你先把这个问题保留着好听,我说讲到现在为止。
我觉得你应该能理解了这种写法是不行的,因此就诞生了著名的写法。
就是这种写法来同学们读这种写法,看能不能读懂这种写法是这么来玩的,首先第一步判断诶,哥们儿你是不是等空啊,如果是等空的话,上锁哎,探头探脑了,哎哥们儿,你这个门里头是不是有人没有人呢,一探头啊,没人啊。
没人呢,哎赶紧进去是吧,上锁啊,先先持有这把锁去申请这把锁,专业的名词叫竞争,这把锁竞争好了之后,我才能进去干事,是吧,噗噗噗便便,但是有没有可能在我竞争所的过程之中,被别人给抢了,有可能吧。
所以在你竞争完所拿到锁的过程之中,再去判断一次是不是依然为空,好这就是著名的双重检查锁,英文叫double check lock,先检查一遍,哥们儿是不是等空等空上锁开始初始化,在初始化之前再检查一遍。
有没有人在我上锁的过程中,把里边的值已经给我初始化了,好,如果依然没有,那么说明没事啊,这件事我可以安全的初始化了,这叫做双重检查锁,叫double take log。
Double check check,第一次check,第二次中间加了一个lock,上锁的过程好,这个著名的double chloe,如果你愿意去阅读一些开源软件的话,就像我们课程里。
我们大概讲了20多种开源软件的源码。
你会经常性的见到这种写法。
这种写法是用的非常非常多的,啥也别说,好好掌握住double check lock,Double check lock。
两个check中间加了一个lock好,这就能保证我们现成的一致性,因为有第一个线程,如果说结束了,被第二线程已经new完了,你第一个线程上完锁之后,再判断instance已经不等空了。
那我就不需要再弄第二个了。
所以拿到的肯定是同一个,好像那讲到现在为止还能跟上呢。
老师扣个一,做一点小小的答疑吧,这里用think this可以吗,来告诉我static的方法有没有,This king,你作为一个king,一定能回答出来这个问题,当我们还没有new对象的时候。
就可以访问static,不需要对象就可以访问static,它有this吗,没有啊,没有,好菜碗豆腐司机蔡文dog,来看看是什么问题,这么一大坨,这活干的有点多呀,老师我这里有一个问题,目前这样写。
注意是目前屏幕上这样写,static第一个线程调用get什么什么,你说的是枷锁的方法和不加锁的方法,是不是能同时执行,答案是yes,反射可以破坏DCR单位,反射有可能吧,底层判断有用吗。
老师你,你问的问题简直深入骨髓,好我们先先问你一个问题啊,很多同学读到这个程序的时候都会问大哥,您这判断有用吗,完全可以不用啊,把它去掉不就完了吗,直接上锁搞定啊,喂同学们告诉我一下。
为什么第一层判断还要留着,哎说的非常非常非常的对,这个是效率问题,这是交流问题啊,什么意思,同学们,你们想一下,我现在有1万个线程来new这个对象,如果我没有外面这层检查。
我这1万个线程每一个人都要抢一遍锁,都需要锁竞争过程,这是一个很耗资源的操作,它的效率比较低,但是假如我有外面一层检查,就会发生什么情形呢,只要有一个线程new完这个对象之后。
其他线程只用执行到这一句话,不用强锁就可以不用再继续执行了,Very good。
提高效率,好了讲到现在为止还没讲完,这个程序有没有什么毛病。
如果我们这么写,有没有什么毛病。
结合我们刚才讲的this溢出问题,有没有什么毛病,你们想想,有吗,可能返回NO,你怎么会怎么可能会返回,now大哥,好我们这小程序截下来,对照我们刚才的,半初始化对象这块,回顾一下啊。
new对象呢a new1半调构造方法初始化,然后建立关联是吧,好我们来看这句话,来来来来对比一下小程序,我贴到这啊,看这里对比这个小程序,我们现在假设第一个线程来了,大哥第一个线程,第一个线程来了。
第一个线程刚刚new到了第一,就是刚刚我第一句话new也就是初始化了一半,这时候M值是几是零,正好在这个时候发生了指令重排序,刚才我们说过这个指令重排序呢,这这哥俩换了顺序了,再看一遍。
第一个线程判断为空没问题,上锁没问题,然后开始new这个对象没问题,new到一半的时候,指令发生重排序,然后这个小T就建立了关联,注意这个小T指向的是一个半初始化对象,哥们儿穿衣服穿了一半就出来了。
那么你猜猜看,如果这个时候正好来了,第二个线程会发生什么情形啊,还没有来得及调构造方法的时候,第二个线程来了,第二个线程来了之后,首先会判断哥们儿,你是不是等空,对不对啊,等空吗,不等空。
你已经指向对象了,怎么可能等空,那既然不等空的话,来直接拿过来使用好,尽管你穿了一半衣服,我就直接拿来凑合用吧,能看懂的意思吗,所以这种写法是有问题的,这种问题呢比较的晦涩难懂,看米兰的老铁匠。
你又开始跟着卖弄了,我已经向劝过你了,当你水平还不够的时候,尽量少说话,volatile保证不了原子性,volatile只能保证可见性,只能禁止重排序,感觉他是故意的嗯,有道理,好这块能跟上的。
给老师扣个一,再通过这几个小问题的讲解,我觉得你现在应该梦小二跟不上是吧,可不想回头听我们珊珊老师课啊,我们是零基础的课啊,有有一个有一些小伙伴自己带的,就是那个那个我们零基础是小班课,特别小,十个人。
一个班不超过十个人,有班主任老师带着你,然后由我们的授课老师在里面,有什么问题随便提,哎就这么一个小班慢慢辅导你走向成成年好吧,小班多少费用,七八千块钱吧,好像是就是带你到就业这种程度。
好听我说嗯嗯只到现在为止呢,我觉得你应该会产生一个很大的印象了,就是嗯乱序这件事儿,在单线程情况下是没有问题的,为什么,因为它本身就是说单线程,不影响单线程的最终一致性嘛,所以单线程一定不会有问题。
但是在多线程的情况下,可能会有各种各样特别麻烦的问题,所以我们必须得有一种机制,能够在特定情况下禁止他重排序,这是架构师的课程吗,对这是架构师课程里头的三大部分那种,其中一个基础算法架构。
三大部分中的基础部分,架构师,我们肯定得奔至少30万到70万年薪吧,好在这种程度下,底层是必问的,必问底层,很多人死就死在底层上好了,大家听我说,再重复一遍,我讲到现在为止很,12我们得有这种机制啊。
得禁止他,不能让他重排序,来告诉我怎么让它不让它重排序,不让他重排序这件事怎么完成。
当然刚才说了啊,这种情况下会产生不必要的后果,好下面有一大堆的问题。
一大堆的问题,第一个呢我先呃呃呃先解释这个吧。
就是哪些指令可以换顺序。
其实刚才我说过这个问题了,如果是在底层的话,任何指令只要是能满不满,不影响单线程最终一致性,他就可以换,但是在JVM层面,这个规则叫happens before原则,估计有很多同学应该是看过这个单词的。
叫happens before,这话意思是说呃,某某东西一定要发生在某某东西之前,这是JVM的规定,并不是指令的具体实现,借着这一点好。
如果你想详细了解这句话的话,去读老师看过的书,这本书叫java language specification。
这本书只有像老师这样无聊的人才会去看。
一般人不会去看这本书,第17章的第4。5节。
Happens before order,There are two actions,Can be ordered by a happy relationship。
我就不给你从头到尾念了,一共有八条规则。
只有开发java虚拟机的人,只有开发java语言编译器的人才会关心。
一共有八条不讲了,请你不要去背它,没有任何意义,没有人问问也没意思,都是很很简单的这种这种呃很自然而然的问题,比如说县城只有先启动了之后,才能执行其他方法,这不废话吗。
好。
我讲到这里。