马士兵-MCA-架构师课程笔记-六-
马士兵 MCA 架构师课程笔记(六)
系列 6:P127:学完RocketMQ之后对面试有什么帮助? - 马士兵学堂 - BV1RY4y1Q7DL

啊,所以我们再回到后面这个问题。就是学完,比如说你对req读了一部分,或者是把它读了大部分,对你的面试和工作有什么帮助?😡,O。你觉对什么帮助?😡,啊,就是今天你你你把这个零考贝说出来,对不对?😡。

啊,你的帮助在哪里?其实我前面给大家。

说了一个比较泛的点啊,这里给大家说一个比较具体的点。😡。

你读原嘛,第一个。亮点搞定。对不对?有东西说。啊,你不然的话呢,你说你读了一个源码,你结果跟面试官去说我的流程,那肯定不行的。好,这是第一点,有东西可以说,并且的话说的话说主线。😡。

同学们。说主线啊,你不能说跟很多面试关军说我的原码这里也读了,那里也读了。😡,吹牛逼,反正他也听不懂,怎么可能?啊。啊,这里给大家说一下,如果是一个java开发。😊,他听不懂,难道听不懂锁吗?😡。
你要听他能听懂的。所以你再去比如说你去面试的时候,你跟别人去说业务,他肯定听不懂啊。你说你你公司有什么业务,我是啊我是什么医疗项目的。我听过我是什么keys项目的,我是什么外包项目的,你给他讲业务。
我怎么听得懂,你给他讲锁啊,你给他讲什么哈西 mapap啊,你给他讲零拷贝啊,他如果听不懂的话,就是他菜嘛。😡,所以大家知道读元吗?为什么说。😡,你的流程其实是次要的,你的主体是主线亮点主线亮点。
就是跟跟你的简历写的是一样的,你去描述你简历的时候啊,你其实有一句话叫做什么?我们去学这个热Q。😊,啊,学到后面或者是学很多的这种源码。😊,后面你会发现有一点就是你开始是向他学,后面叫做向他学。😡,啊。
就是我首先学这个ro是学它的技术点,然后向他学的话呢,是学他的一些。😊,方法论或者是学它的一些设计。就是向他学习。OK那你你平时我们所说的,哎呀,大家使用的这种什么,为什么要面试的时候考多线程。
考什么县程安全,考所机证。😡,那我的代码里面目没有多线程,那你看一下ro的源码,它都是多线程高并发。😡,他扛阿里的双十一,我记得是去年今年的2呃,就是去年的双十一。
还有前年的双十一reckconQ是百亿级的数据流转,就是它可以架很多集群。然后reckQ可以扛住百亿的数据。😊,ok。打印的数据流转,你你知道什么概念?😡,对不对?然后。啊,第三个点。
这个跟我们的自身相关。现在大家发现为什么面试的时候总问圆嘛啊,有的同学说了,问圆嘛就什么卷。😡,对不对?今天老李给大家一起来卷,大家卷起来啊,卷死他。其实本质上面不是的啊,因为李老师的话呢。
我工作13年。😊,这个现在这个卷它其实是跟我们现在的项目或者是跟我们的市场相关。哎,你会发现在其实我早期啊我给大家说一下,在早期里面呢。😊,那个时候他非常鼓励叫什么个体开发啊,叫做个人开发啊。
包括我很多同学啊,还有一些朋友啊,他们之前做什么。😊,啊,记得最早的做那个iphone的这种游戏开发,做这种iphone的APP开发啊,IOS这种开发赚了不少钱。后但是到了近几年没市场了。
包括安卓的开发也没市场了,为什么啊?因为现在慢慢的他都是往这种大型项目。😊,就是你虽然说你是一个小型项目,但是慢慢的话呢,它就算这种大型项目或者是小型项目,它慢慢都是往这种什么分布式微服务,对不对?
往这个上面去发展,然后很多东西他都要做什么性能调优,要做什么高并发,然后要做什么高拓展,要做这些东西。😊,啊,这些东西就是市场的要求。啊,为什么是市场的要求?你你现在我们把视频教育,我们也招老师。
我们也招招开发啊,我们内部有系统,我们招开发的时候,我们要求的至少是中级高级啊,薪资的话我们可以谈的很高。但是的话呢,你说你一20K,我不要。😡,啊,这种一二0K左右的或者是低于120K的,我不要。
为什么?因为饱和了啊,因为现在我们整个系统的要求就是我要提高并发。😊,啊,我们的学员要什么就是提出很多各种需求,这个需求是建立在一个更高的体验上面。😊,啊,所以大家所说的为什么问源码?如果不问圆码的话。
这些东西你怎么去卷嘛啊,我招一个过来CULD我们公司已经有CLD了啊,我们的开发团队已经有很多的CURD了,我还想淘淘汰一些,对不对?😡,啊,所以现在你就会发现面试中间为什么总问员嘛?包括毕业生。😡。
也问啊,就算你是个大学毕业生,那我肯定会问最基础的ssp的源码,你要懂一点嘛,对不对?然后你至少是说mycyclical数据库。😊,啊,然后再加一个readdis要用过MQ的话呢,可以选两个啊。
卡夫卡或者是rockcomQ。😊,啊,中间几叫做精通或者是熟悉当中的一种。那除此之外,我还可能会考核多线程,还会考核GVM啊,甚至我还会考核一点这种设计模式相关的东东啊,比如说常见的23种设计模式。
对不对?然后大场的话肯定会考核算法。😊,就是我对算法也一定考核。😊,所以你看到东西是不是足够卷,那这里面圆码就非常关键了。😡,因为原码的话给大家说一下,其实包括卡夫卡,包括radies。
如果你有这样的时间,我也建议你可以去读一下它的原码。就rease大家知道是C写的。😊,啊,redies的源码的话呢其实也非常经典啊。为什么经典的原因啊,我告诉大家举个例子,大家知道在redis里面啊。
我们经常所说的redis它是干嘛啊?readdis我们是一个key value的数据库,对不对?key value的内存数据库。那我问你这个地方它怎么组织的?😊,怎么存储的?你就懵逼了。

啊,在听的各位小伙伴知道就是readdis作为一个keywi数据库,它的key和wi怎么存储的,能回答我吗?😡,这个地方不是valueue的数据类型啊。😡,🤧Yeah。哈希表对。
跟我们今天讲的东西哈就是一张哈希表。😊,好,你能回答哈哈希表没有问题。那说哈希表底层实现。😊,最基础的数据结构有什么?有数组吧。😡,一般来说就是数组加链表。

这一点是不是不是没问题?好,没问题,我接着问。😡,接着怎么问?你要知道在哈西表里面,我不断的往readdies里面。我们知道我不断的去往这个readdius里面,我去设置。😊,T设置value啊,设置。
比如说我的K数量。😊,很多。这个时候是不是会涉及到我们数组的扩容啊?啊,大家知道书。😡,不足的扩容阻塞,因为他要重新哈希。我们称之为瑞哈西。就是重新把这些元素放到不同的位置上。进行分散。好。那接着我问。
那这个地方它会阻塞。😡,我readds好像没有感觉到堵塞,我readdis里面存了1万个键,我也没阻塞,它的原因是什么?😡,啊,你能回答出来吗?😊,这个地方会涉及到一点点。源码相关的知识。
其实内部你会发现它里面使用到的是两张哈希表。啊,就是它里面用到了两张全局哈希表去存储我们的keyvalue,就类似于我们经常所说的垃圾回收里面的什么S0和S1就是。😊,一般只用一张。是一般啊只用一张。
好,但是一旦涉及到我们在进行扩容。扩容里面的话呢,注意他就会用到另外一张。但是这个地方有个关键点,这个地方它在扩容的时候,你要知道readdis它的这个并发非常非常的高。
它动不动就10万的这种什么QPS。😊,啊。因为radis它不能达到10万的QPS,它的性能就会很差。因为它是挡在我们查询上面的第一个层面。😡,ok。那大家可以发发现redis并发10万家的话。
这个地方我前面一旦说我的数组,因为大家都道知道数组的话,你把它创建出来16。😊,那就只能存放16个,那超过16个的话,有哈西冲突就变成链表。链表如果过长的话会影响性能。所以在这个地方我是不是要扩容。
比如说比如说把它变成32,把它变成64,把它变成640等等之类的。好,在这个地方这个阻塞怎么解决?😊,这个阻塞它的时长它其实已经影响了我们的性性能,对不对?所以在reds里面,它有一个叫做渐进式的哈希。
😊,渐进式的维哈系。怎么做的?原理很简单。你这个地方要阻塞,比如说我阻塞的时间要阻塞1秒钟。😡,那瑞利斯说我受不了。😡。

啊,你要阻塞一秒钟的话,那我的reis会卡,对不对?我要卡住一秒钟,所以渐进式哈希它的处理方式是说在我们每一次。😊,啊,叫做每一次比像readdies,比如说有个客户端cl端。
然后去向我们的这一个啊对应的readdies去发消息的时候,比如说我是get也好,是st也好,是其他东西也好,没关系,对不对?我就发这种请求的时候,那么我就转移一个元素。😊。
请注意为什么可以转移一个元素?因为我有两张哈希表。😊,系。啊,我转移数组的一个元素。比如说第一次我转移位置是0,第二次转移数组下边是一,第三次转移下边是2,第四次转移下边数组是3。
所以大家发现当我readis在这里不断的进行处理的时候。😊,我就转移一个。就是我在进行re哈的时候,我这两张表它都可能存数据。哎,你去访问的时候,我再用一张表做个记录,对不对?你这张表的记录可能在老表。
你这张表已经转移了,在新表。那么每一次。😊,我在进行客户端访问的时候,那原来假设里面你在进行约哈西的时候,有1000次,有1000个元素要重新定位。到这个地方,那是不是我可以把它分摊到每一次。
所以每一次它的开销就只有一毫秒了。😊,因为这个地方我总共干完是1000嘛,我要把1000个元素全部转移完,它的整个耗时就是一秒钟。那现在我每一次在客户端访问的时候,我阻塞的时间是不是就只有一毫秒了?😡。
所以这就是渐进式的维哈西。所以大家看到没有?通过技术,很多情况下面有通用性。就是你一次干的时候阻塞的太厉害了怎么办?每一次访问的时候,我转一个元素。😊,啊,比如说第一次访问转移下边是零的。😊。
第二次转移下边是一的23,然后再不断的啪啦啪啦啪啦啪啦,对不对?因为res请求的话,它肯定有非常高并发的请求去访问我。所以的话呢很快我就可以把所有的元素把它转移到另外的一张哈西表当中来。😊。
所以在执行命令的时候,我们进行对应的转移。ok。😊,啊,所以大家前面所说的,你看到没有?为什么卷的原因?其实卷的原因说白了就是现在菜的人太多了。😊,哎,所以你你要知道你写简历的时候,为什么像多线程。
还有GBM,还有一些什么readdisMQ,还有mycyclcle spend的源码,还有像这种设计模式,还有像这种算法,这些东西才是核心。😊,好不好?这些东西才是核心啊。😊,啊。
同时的话呢啊就是大家还要注意一点,你要去补补一些什么计算机的基础。😊,我们常说计算机的基础里面会包含网络通讯。😊。

基的基础知识。基础知识有哪些了?我给大家就是不再这么去画了啊,给大家看一下。😊。


基础。基础你像linux是不是基础?😊,因为你玩系统的话,lininuxmin你必须熟。😡,对不对?linux里面还涉及到网络命运,然后还有包括什么?像我们经经常所说的。
还有一些就是rockkenQ里面的也有基础。你像如果说你能够去懂一些汇编或者C语言的基础的话啊,也不错。😊,啊,所以大家可以看到基础知识的话,还有像这个什么TCP。😊,啊,TCP里面的话啊。
最简单什么三次握手啊,四次挥手啊,半连接啊、红泛攻击啊,然后当中TCP的豹纹啊,还有包括呢keep eye,然后TCP的这种什么流量控制,就是那个呃我们常经常所说的滑动窗口协议,还有了端口。
还有TCP当中的一些场景,一些工具。😊,对?就是说如果你能够把这些东西补一下,那你去面试的时候就是非常的有竞争力啊。😊,同时的话呢嗯。

。注意啊,同时的话除了大学生。😡,其实很多小伙伴呢在昨天也好,今天也好,给我这样的一个反馈。我发现了一些叫做大龄巨婴。😊,啊,什么叫大龄聚婴呢?就是年龄在30岁甚至30岁以上啊及以上。😊。
然后基本上是CURD的水平。啊。基本上就是1个普通的C1D年龄并且在30及30以岁,30岁以上啊。😊,大家自己可以看一下,就是前面我们讲的这些技术点。😊。

啊,这些技术点如果说你中间某一些基本是知道的很少的话,你工作超过3年。那可以定位成你就只有1个CURD的水平啊,就是这些技础点的话,你不能掌握30%、40%以上。基本上啊你就是一个平时CURD。😊。
怎么跟GUM的增量收集是一个概念。😊,其实技术的延伸,当你学了这个技术之后,很多技术的思想是通用的。就是我们为什么去读源嘛?😡,啊,就是你如果说你跟你玩的这些人跟你在写代码的这些人,对不对?
天天只是说哎想哪个妹子好看,然后的话想着哪个时候我们去吃个夜宵,或者哪个时候啊去玩个其他东西啊,老想着这些这样的话呢,你们就在一个层次啊。但如果啊我读了这个源嘛,然后我的思想架构,我的技术架构。
我在这个层次。那么其实我看其他东西的时候,他就会是站在这个点。😊,OK其实要老李说给大家就去说技术啊。😊,你如果说想拿到高薪。😡,或者是说啊大家所说的不单纯是高薪,对不对?
平时大家可能遇到了很多这种什么叫做危机感。😊,啊,觉得太大家太卷了。同时有的小伙伴说啊,我想转行。😊,啊,原来可能不是做java的,原来是做什么其他东西的啊,可能是做测试的,甚至是说我想去冲击架构师啊。
我冲击这种什么高薪岗位。😊,好,在这里面你首先要改变的是思维。😊,其实改变的不是说啊你说啊我去读断代码,对不对?然后的话呢,我去把这个API写的很好,然后把我的这1个API写的更快。😊,他并不是。是的。
他是在思维,就是同样看一个东西啊,就是同样看个代码啊,为什么别人有收获?😡,啊,或者是别人他有成长。😡,啊,你可能说没有成长,对不对?我们看代码的时候看源码。😊。

你看到这些东西的时候,可能就这么过了。😊。

啊,在这里面的话呢,一段两段三段三三段啊,但是核心。😊。

找重点,找主干。找亮点,就是包括我们项目也是这么回事。其实项目里面它会充斥着大量的CRD,但是往往去提高你技能的,它可能就是那么不到百分之。😡,5的代码甚至不到3%。😡,啊。
就是100行代码里面可能只有5行写的比较好一点,然后甚至只有3%的这个代码,它的技术含量相对来说比较高。为什么?你就算阿里的rock andQ啊,这里面这么牛逼的框架,它里面刚给大家演示的时候。
是不是也一大堆的ifS。😊。



啊,这种判断if else其实这些这些东西不用太在意,好不好?你要在意的是里面,比如说方法的转跳,比如说涉及到一个核心内的处理,比如说它的主干,你不可能说把这个源码背下来。😊。

对不对?你读spring也好,读其他框架也好,你不可能背下来。但是你要去说你在工作当中运用或者面试当中,你要展示出来,你拉一个主线。😡,什么主线reQ无非就几大组件。
然后proder我们的consumerbro和name server每个组件做什么用?好,第二个第二个主线怎么启动的?启动,当然是name server先启动bro后启动那么name server的话。
当然要把所有的数据加载在哈 mapap里面啊,然后利用读写索的方式提高性能。然后作为bro的话,大家知道。😊。

啊,我回到这张图啊,作为我们bro的话,是不是要把我们的这个存储文件要完成零拷贝,就是提高我们去写的一个效率。😊。


然后再站在另外一个点,这个角度的话,你去发消息有个主体流程,发消息的时候对不对?接受这一方怎么处理,一层层转跳,然后里面用到了countable future异步调用,里面也用到了锁机制。
因为这个地方它是一个文件,如果不用锁,它会有多线的安全,但是锁的话也不能用reent默认情况下面是CAS。😊,那除此之外的话呢,我去消费的时候,他还有更多的逻辑。😡。

所以呢你可以看到像我去讲源码啊,这个地方我讲rock andq的源码。😊,里面呢就很多了啊,就是这个地方呢其实还有一个叫做定时任务的超时呃。
就是剔除超时name server的无状态化读写锁基于内存启动流程,对不对?里面有功能号的设计,存储设计消息写入流程M map自选锁对外内存机制啊,你在进行消息发送的时候,有对内选择,有 lock。
有建立客户端的时机,你在进行消费的时候,有什么有并发消费,它的整体流程,它数据怎么在里面落地的。😊,啊,还有包括我们的这一些常见的问题,因为消费当中容易卡死。😡,啊,除此之外的话呢,分布式事物怎么玩的?
😊,分布式师傅他的整个的源码流程,他的消息确认流程,它的回滚流程,它的回查源码的流程。😊,啊,所以这个的话呢,你才能去把这个runq整体的这个源码把它全部搞懂。😊。

OK啊,所以呢你可以看到,这是我们MCA的一个高级架构师。为什么称之为MCA呢?啊,这是我们针对的是互联网架构,然后大厂的一个相关的一些推荐啊。😊。

啊,里面是218门课啊,李老师在里面讲了很多,比例不少啊。你像不单纯是rockQ,比如说readdies。😊。

Read is。😊,呃核心技术与实战。😊,讲的数据结构。啊,数据结构讲的list set z set啊map。
然后高级数据结构讲的beat map讲的hplock lock慢查询拍 plan事物发布订阅,然后还有持久化机制,高可用哨兵集群缓存应用大厂问题设计实现啊,然后还有包括lay。😊,媒体大家知道。
Yeah。Yeah。雷体的话呢,这里面。我们讲了java的网络编程,就是lay。如果说你要从零门槛入门啊,就是可能前面网络编程知识很差,所以要补。一些java网的编程的知识。
就是scket啊s soet这些知识,然后再到NIO,再到late入门。然后四节课解读readdies的呃lateate它的底层原理以及它的处理流程。😊,啊,就是站在两个点,它的底层原理的支持。
它的整个线路的处理流程的这个流转。😊,O。吓。😊,所以这个当然了我们里面还有一张大纲图啊,就是MCA到底是怎么回事?MCA包括哪些东西?有位同学提出这样的一个问题,对不对?MCA包括哪些东西。
包括我们架构是启航,这个就是针对那些相当于基础比较差的。然后呢对数据库不太了解,对我们的java编程基础不不够了解,了解我们的网页开发不够了解,对不对?没有做过相关项目实战的。
包括没有接触过微复架构 cloud呢这个呢你可以去看看它如果说你有一定的开发经验,这个时候应该你要深入向性能调优。性能调优里面会分成这几个部分啊。
就是我们常见的my然后GVM n几个就是站在这些我们常说的GVM调垃圾回收my的话呢,要涉及到表优化索引优化,以及my排查,还有包括我们的一些啊就是里面要去。😊。






做一些性能优化。然后还有t的话要调我们的模型,要懂它的处理流程N的话,我们要实现动静分离啊,除此之外,并发编程它里面很多点都是优化。因为并发编程的话,锁是一个很大的优化。那除此之外。
线程池怎么配参数用哪种线程池。那并发容器今天其实讲了很多,今天讲的哈西 map那里面还有什么写池复制容器,还有我们经常所说的delayq这些东西要要了解要熟悉。还有像异步编程,今天我们也讲了案例,啊。
但是异步编程的话呢,这里面不单纯是con futurefu task,还有它的流转,它的每个方法,它的整个的一条线是怎么回事。那除了这个之外的话,你像框架源码。大家知道框架源码的话呢。
spring是核心。😊。



sring的底层源码有了spprintring源码之后的话,你再到MVC myies再到我们的这个spprint boot到cloud阿里巴巴这些源码,你就会轻松很多。还有像我们we webfls。
我们也会进行一个深入的实战。😊,OK然后再到我们的这个中间键啊,中间件的话,所有的现在所有的开发不可能不用中间件啊。如果说你写的项目里面没有用到reies。😡。


对不对?基本上我可以断定这个可能就是一个毕业设计的项目。😊,啊,redis或者MQ一般来说都可能同时使用。如果你res没有使用过的话,那这个项目你要建来有多low逼,对不对?你没有缓存啊。😡。
所以呢我们会去讲。😊,分布式的缓存中间件分布式的消息中间键。作为消息中间件的话呢,我们会讲很多种。😊。

就是包括。最新的paer我们都会去讲,就是最老的rapq到卡夫卡到rapq,然后到paer,我们都讲好。除此之外的话呢,你像这种分布式的存储中心件。😊。

就是不不是我们的单纯的readdies啊。readies的话呢,我们。😊,基本上讲的比较透彻啊,然后再会去讲多级缓存架构啊,这是readdies。在很多场景当中。
你单纯靠分布式readdies也不一定能够解决性的问题。就是你的并发要求的更高的话,那这个时候你像我们经常所说的啊叫做Hcaash,还有像我们的这一个数据同步工具canal。😊,是什么呢?
就是mycycl在进行同步的时候,经常会用cana去捕捉mycycl的 bin lock的日志,然后进行一些数据的分析。😊,除此之外的话呢,像芒果DB啊,它会可以去完成我们的文件的存。😊。
楚还有像我们的一些什么命IO啊,faDFS啊,然后尼尔基啊这些东西我们都啊其实都已经讲过啊。除此之外的话呢,你像分布式电视任务调度啊,这个地方呢我们什么啊elastic job啊,然后叉叉 job啊。
还有像我们的分布式框架啊,分布式框架里面呢像double。😊。



系列 6:P128:RocketMQ源码分析:Broker的启动流程 - 马士兵学堂 - BV1RY4y1Q7DL
给他们再来回顾一下啊。其实作为一个broer,它的启动流程的话呢,相对来说还是比较简单的啊,怎么个简单法呢?就是它有一个类。😊。


就是我们知道啊你如果说通过源码启动的话呢,它指定的这一个叫做 up这个类。后在这个类里面呢啊我们也知道它的启动是一个man方法。
man方法呢首先调用到我们的great controller这个方法里面来,然后在这个方法里面来的时候呢,前面都是一些参数判断,然后包括一些参数校验。然后呢创建一个我们的叫做bro confi。
就是我们常说的一些配置文件啊,然后它需要去创建啊叫做我们的la通讯的服务端和la通讯的客户端。也就是在我们这张图当中的这一个N和NRC。所以呢这里面它就分别创建出来了啊,然后创建出来之后的话呢。
大家要注意了,这个是它的一些创建的配置。然后创建完之后的话,底下就是解析一些我们的参数。嗯,这些东西呢就是没有太多可以说的啊。😊。







学累了啊,等一下我们待会儿一起来答疑,好不好?那个那个欧同学。😊,啊,我们一起来答疑,我们先把这个源码来进行讲解啊。然后除此之外的话呢嗯它对一些主从架构还进行了一些单独的处理啊。
然后这些东西呢都不重要啊,这些东西都是一些判断参数啊,一些配置参数啊等等之类的啊。所以在流程里面呢我特意把它说成了就是去进行一些其他的参数配置,对不对?
然后的话呢它主要会进入我们的这个方法就是controll这个方法啊,这个方法里面呢要注意了这个方法里面的核心就是第一个它会去加载bro当中的主题信息,注意了这个主题信息保存哪保存在哪里了?
就是比方我在启动的时候,我设置了一个我的目录对不对?叫做D盘然后在第盘里面呢,一般来说数据是放到我们的stone这个文件里面来,然后在stone文件里面呢。
它有一个confi文件这个confi文件会保存什么呢?就是我们每一台。😊。







work启动的时候,它会有保存相关的主题topic,还有保存相关的这个消费的offset,消费的偏移量,还有了一些什么其他的订阅的一些分组,对不对?还有了一些我们消费的一些过滤相关的信息。
所以你可以看到啊,这个地方我们打开这个topic的。😊。

很明显啊,这些东西呢就是你启动一个bro的时候,它底下来会有一些jason相关的配置啊,就是你有多少个主题,对不对?然后每个主题里面有多少个队列,然后呢,它的权限是什么?然后还有一些其他的标识。
所以在源码启动的时候,大家可以看到啊,开始启开始了嘛,已经开始了啊,在这个地方就是分别把我们刚才的这些jason文件进行加载。比如说topic文件啊,O这是加载我们的topic文件,然后除此之外的话呢。
还有我们刚才confi里面的这些什么consumer,然后subscring group这种文件,就是这种订阅组的文件啊,所以这个东西跟我们的这个文件啊,它是一对应的。😊。



好,这就是这部分的代码。所以在我前面的这张流程图里面呢,我们称之为加载bro的主题,消费进度、订阅信息、消息过滤类等等相关的信息。OK然后呢,在我们的这个核心方法里面。
就是这个bro controllertroll的核心的这个初始化的方法里面来,我们再看到它创建了一个存储组件。😊。


就是作为roq啊,其实它的存储组件的就是存储的这个组件,最主要的类呢是defa message stone啊,是这样的一个类啊,这个类的话呢,大家可以看到,首先它把它new出来,new出来之后的话呢。
然后嗯大家注意了,一般来说存储组件刚开始是new对不对?然后底下是一些副本呢一些统计工具的配配置。然后到了核心的话呢,它有一个not方法。然后我们点进这个load方法的时候,要注意了啊。
一定它是叫做defa message stone这个类然后点进去之后,你会发现它其实就是把我们的这些文件进行初始化。因为大家如果使用过roq。
你会发现rock q里面呢它的主要的存储文件是这两个第一个叫做comity log这个文件,就是在这个com log目录下,然后呢,一个很长的0000零的文件。
然后还有一个消费索引的叫做consumq的文件啊,就是你底下对应个多少主题,对不对?比如说这。😊。




还有了pition order,还有一些其他的主题。那么每一个主题它都是一个文件。然后每一个文件下面它会有一个目录,比如说01234,这个01234对应的其实就是队列,它底下呢就有4个队列。
然后在每一个队列里面呢,它有一个索引文件啊。所以的话呢在我们bro启动的时候,它就会把com log进行加载,还有了consomerq它也要进行加载啊,所以这两部分东西干的事情是一样的。
所以啊这个地方我们再点进这个load方法。😊,在这个load方法里面呢,大家发现了啊,它底下呢又是交给了一个叫做mifyq。这个mifyq是什么呢?😊。


大家可以看到啊,这个mifyQ的话。😊,在这个类里面对不对?在这个类里面呢要注意了,它里面用到了一个叫做存储的东西,主要用到了一个叫做写实复制的容器啊。
叫做copy a write every list。😊,就是它是一个我们存储文件的队列。但是在这个队列当中呢,它是本身数据基本上都是放到这个er list里面来。
然后er list里面其实是放的my file。😊,就是我们再把之前的这张图给他们回顾一下啊。

就是作为rockQ,它存储的整个架构是这样的。就是这个send message是属于发消息,query message属于我们去消费消息或者进行查询消息。然后到了它的业务层这一块的话呢。
它的入口都是defa message stone所以这一层我们把它称之为业务层啊,这是我们常说的controll层。然后进入controll层之后呢,它有一个对所有文件进行处理的。比如说com log。
比如说conomer,比如说还有什么index fair,还有一些其他的东西,对不对?这称之为逻辑存储层啊,你也可以把它比喻成我们的serv层。😊,到了ss层之后的话呢,就是你要对所有的数据进行封装啊。
就是所有的数据进行写入,进行读取的话,最终它有一个存储IO。😊,啊,存储IO的话就到了我们的m。😊,OK这个在哪里下载?😊。

这个的话在直接你点击的这个官网里面就有下载,我是不是编辑一个公告了,看我这个公告。这个公告有有没有看到?就直播的这候有个公号公告啊,这个链接你去下。好不好?那,这里面我就不打断同学们了。
这个地方它有一个资料,这个里面资料的话,我把相关的东西都已经放进去了啊。所以的话呢,这个层次是非常清楚的。所以在我们去调用的时候呢,有时候你就看链路看不懂,对不对?
有时候我们的这个load方法明明是一个com log点load的方法,哎,为什么要去调啊。😊。



里面有一个包装,对不对?然后在它点load,然后这个点load的话,你会发现这个m file它本身就包含了很多的这个m。所以呢这个地方它就会一个 for循环,把所有的文件拿出来。
然后把所有的文件拿出来之后,把它 new出来啊,扭出来到了我们的这个文件存储的IO类,就是专门去对文件进行读写,就是哪怕是读消息或者写消息,它都是通过这个m这个类来处理的。O好。
这就是我们刚才所说的这个文件存储中间的一个部分啊,然后文件存储的一部分呢,其实就属于我们启动的时候的这一个加载存储文件的这个功能。😊。


啊,也就是说在我们的这个初始化的方法里面呢,它会要去加载我们reconq几乎绝大部分的这种消息的存储文件。OK多线程写会不会有问题?那个解释复制的话,它只是用来去管理文件。好吗。
那个显示复制它只是用来管理文件,只是用来去管理文件啊。最终它写入的话都是这个m来处理的。😊。


这个m fairq这个东西呢,它只是负责去管理很多个文件。就是我们刚才打开这个目录,你会发现在作为roq里面呢,它stone底下有什么有comil log文件,有confi文件啊。
有这种conomerq文件,对不对?还有一些index文件,那总有个东西啊就行。😊,统一的管理。所以这是mifyq这个东东。好,那么再回来啊,最后的话呢,在这个初始化方法里面呢。
它要去开启一些比如说配置啊,还有一些持久化相关的电池任务。所以在我们源码跟踪里面,大家可以看到。😊。


底下的这些东西就是一些我们常用的这种线程池。要注意了,在reck的源嘛里面啊,你会发现它大量的使用的线程池,包括这种定时任务的线程池。😊。

你可以看到前面的这个东西呢,就是开启这个远程的,它开启一个服务嘛,就是把这个laty remote service这个东西呢给扭出来,对不对?然后这里面我也说了,在老的版本里面呢,它一般提供了两个端口。
一个是10911端口,一个是10909端口啊,但是的话呢在4。5。1之后默认情况下面,这一个端口呢基本上也没怎么用的。因为基本上一个端口也可以解决问题。
然后呢嗯这个东西就是我们刚才所说的这个端口的东东啊,端口呢,其实也不是说它写死了,就是我们可以看到原来它是1个10911嘛,它就是用10911减2就变成了一个10909啊。
这就是源码里面我们可以得知的一个就是什么VIP的一个china的一个端口号。然后底下的这些东西就是开启各种线程池了。比如说开启各种什么一大堆的什么破消息的线程池send message的。😊。





message的,还有了什么que message,对不对?还有一些什么去负责一些心跳的啊,就是很多时候我们还要像 server发心跳,么bitat excuse啊,还有一些大堆的excutok啊。
然后处理完这些ex之后的话呢,大家发现它底下还用了一个方法叫做rejustest这个方法啊,这个redress叫做。😊。



说搜索这个东西呢,大家可以看到它其实呢就是去负责什么,负责一些东西的注册。😊。

我们知道作为嗯这个bro的话呢,它本身是作为一个na的remo叫做NRS称之为la remoteing就是类似于你一个网络通讯的服务端。那么在这个服务端的时候呢,嗯待会文件我把主流程讲完好不好?
我文件待会我会去细讲这个NRS呢,它其实是不是要去提供很多功能。因为你毕竟是个服务端。那你肯定要提供很多接口,一个2个、3个、4个、5个、6个、7个、8个、9个10个。
所以的话呢它用了一个这样的处理方式,就是说你是不是提供了很多的这种功能吗?那么每个功能我都是用这个ex来处理。那我怎么去确保这些东西可以动态的,比如说增加或者删除了,它使用了一种亮点技术啊。
就是大家可能嗯不知道大家有没有玩过,我们把它称之为叫做功能号的设计。😊。




啊,大家有没有玩过这个功能号的设计,有玩过的话,可以刷个一。其实我十多年前就是李锦老师十多年前很早就做开发了。这个功能号的设计的话呢,其实在一些。😊,呃,传统的行业是做的非常的广泛的啊,没有好。
那我就来说一下这个功能号是怎么回事啊。😊。

就是我们会定一个功能。因为我们要进行网络通讯的时候,其实发的消息都会差不多,对不对?然后我们都会通过一个端口来进行访问。比如说都是10911,或者都是一个端口,我们要去发消息,那怎么去区别这些消息呢?
那它的方式就是说在这个地方它的请求的头里面,这个叫request quarter,这个头里面呢,它会去定义一些类似于功能号的东西。比如说你这个里面它叫做send message10,那就是发消息。
如果呢你这个地方它有一个标识叫做query message等于12,那就是查消息。😊。

然后底下呢还有一些其他的,比如说一些什么加锁啊,或者是还有一些获取路由啊,get remote inform by topic就是去获取这个主题相关的路由信息。那它可能定1个105啊。
这些东西我们把它称之为功能号。😊。

啊,就是如果说你要去访问的话,你会发现在我的bro端,我就提供了很多功能号,功能号怎么办呢?通过这个reming service的regest这个东西去注册啊,就是一旦别人有个客户端。
比如说他要去发一个功能号叫send message。😊,那我的服务端是不是会收到这一条send message的指令?那服务端收到这个send message指令,谁来处理呢?😊。
那这个时候就在这个地方去注册功能号,所以呢他只要加上一个叫做reg啊一个这样的方法,把这个功能号注册。注册完之后的话,交给一个ex交给我一个我们常说的啊线程池啊,就是这样的一个线程值的任务来进行处理啊。
所以呢这就就称之为我们的bro就已经注册了很多这种消息发送的东西了,然后底下了还有一大堆的注册啊,其实你会发现这就是一些只要写好一个模板之后啊底下的东西了。
就是不断的去进行CD copypy copypy copypy copypy对不对?就是这种方式的话,以后拓展性会非非常强啊,你的bro增加了一个功能怎么办?在后面的代码里面加一个功能号。
然后再给一个我们的ex对不对?这不就行了吗?😊。







OK那好。😊,回到我们刚才的这个主流程啊,在这个主流程里面,你会发现啊,其实这些启动的这些定时任务啊。

他主要就是为了去处理我们的服务端的一些请求啊,我们作为broer,他作为一个服务端,他要提供很多服务,就是你发消息,我要给你进行存储。还有呢一些我要去提供给客户端的,你像这种别人也有可能去消费消息叫普。
我要拿消息,那我也要提供服务。还有呢可能有一些其他的等等什么心跳啊,有一些其他的东东,他都通过这个功能号来进行处理。好,这个主流程走完之后的话。😊。


在我们代码里面,我们接着再来看。

Yeah。再来看看呢底下的这些东西啊,就是也是起一些嗯我们的常说的这种叫做定时任务的线成池。这个定时任务的线成池呢就是去拿起一些状态啊,然后呢进行一些我们的这个消费的一些consum of的一些更新啊。
对不对?还有一些其他的过滤的一些管理等等之类的啊,所以这些东西呢,其实你去看的话呢,嗯如果到具体的点,可以看具体的任务啊,但是我觉得没有必要去完全去就是钻到里面一行行看啊,然后这个方法是不是就结束了。
就是我们的bro controlt里面的这一个最核心的这个init方法就结束了。然后这个方法结束之后,它是不是就回来。😊。





回到我们的这一个brostar up这一个类里面的叫做grer broker control这个方法里面来,对不对?然后这个。这个里面要注意了啊,就是在这个地方初始化完之后再设置一个钩子方法。
就是钩子方法呢,就是GVM你如果说进行对应关闭的话呢,我会个钩子方法,把一些对应的资源进行释放啊,这也是常用的一种就是开源框架去写慢方法启动。同时的话呢你还可能要去触发一些啊就是GM关闭的时候啊。
如果说GVM通知我关闭了。那这个时候我会把相关的资源。比如说conttrol进行稍down啊进行一些释放。好,这就是我们刚才讲到的这一个方法啊。然后跑完这个方法之后的话呢。😊。


你看到没有?在我的 main方法里面,它是一个双层方法的套嵌套啊,就是great broker controller。然后嵌套完之后呢,再一个star。所以跑完那个方法之后呢,进入这个star。
进入这个star方法,我们看这张流程图,它就是要去把前面这些加载new出来的一些东西全部要进行启动的,前面是不是我们new出了很多什么ex啊,注册了一些很多的ex任务啊。
那么在这个地方它就要启动所以这个star方法呢,顾名思义启动启动存储组件启动 native服务端,然后启动对外的一些通讯。
然后启动我们刚才的这些servservservservserv service啊,然后同时的话呢还要做个事情,就是像name server去发心跳包啊。
所以这个地方呢又使用了一个叫做s service啊这个心跳包。然后呢进行一个每默认情况下面是每隔30秒像name server发心跳包,然。😊。




整个的这个步骤就结束了啊,所以这就是我们刚才b克启动的一个整体。😊。

系列 6:P129:RocketMQ源码分析:消息发送者启动流程 - 马士兵学堂 - BV1RY4y1Q7DL
是也非常重要。因为这个启动流程以后有可能影响你经常去做一些生产上的配置。

那么启动流程的话呢,大家应该要知道。那首先第一个把它拗出来。对不对?那你出这样的一个对象,扭出来之后,最核心的方法就是去调这一个star方法。那么通过我们的这一个star方法,我们点进去。注意了。
因为这个proer它会有几个分支啊,默认使用的是default mq producer底下一个trans mq producer了,是后面我会去讲的事物消息的发送者。
一般的消息是通过这个default mq producer。好,那么掉进去这个star掉进去这个star之后呢,你会发现啊其实这一个default m producer自己没有干。
它是交给了一个实现内叫做de mq producer implication的实现内掉了它的star。
所以作为pro它的启动核心其实是deult mq producer implication就是它的一个实现内点star。所以正如我画的这张流程图是吧?
就是刚开始是default mq producer调star。其实最重要的环节是进入了defa mqpro的implication的这个实内啊,然后在这个实现内里面,我们点进去。😊。



点进去之后。注意了啊,大家都可以拿到我的这一个代码,我的代码已经给同学们了,然后叫this点star。this star的话呢,你会发现我的注释或者是我的注释写的非常的详细啊。😊,但是这个地方要注意了。
就是这段代码当中。他有一个switch。就是你启动的时候啊,它其实规定了几种状态。这个switch里面呢,它判断一下这个service的,就是我们常说的我启动的这个客户端,它处于哪种状态。
比如说你是刚开始创建,我们的代码是刚拗出来,那它肯定进入的是第一个状态,对不对?就是这一个状态叫做great, just就是刚刚创建。所以呢它第一次一定是跑到这个流程。好,跑到这个流程之后呢。
当然你会发现啊,如果这个流程干完了,就是这个流程跑完了,最终这个状态就会变成一个running。😊,啊,也就是也就是说大家应该要知道,其实这个star方法它肯定会多次调用。😡,啊,调完一次不止对不对?
第一次的话跑我们的叫做great just。后第二次的话呢又power running,如果说遇到异常的话,什么s down啊什么都都可能,对不对?所以的话呢我们就进入第一个啊第一个里面的话。
大家可以看到,如果你要去创建一个生产者,他首先要去检查你的配置是不是符合要求。就是我们的生产者的组是不是满足要求,所以这个地方有一个叫做check confi去检查配置的方法,注意这个检查配置的方法呢。
当然啊你你可以发现首先校验为不为空。就是我们如果创建一个生产者,这个地方啊一定是要去送一个东西的,就是这一个group这个pro的这个生产者的分组一定要给他送东西,这是第一点。然后第二点的话呢。
他还不能跟系统的分组名冲突。因为就算你的q没有启动的话,你会发现。😊。


底下还有一些这个标识为系统的主题。

哎,你看到没有?这个上面我只要把这个normal插进去。这就是系统主题。啊,当然呢你会发现除了这个系统主题之外,它还有一些系统的什么proder。所以的话呢在我们这里面的话,如果你建立一个分组。
你也不能是一个叫做defaer producer。😊。

啊,如果说是一个depro的话呢,他也跟你说不行啊,所以不能跟我们系统的这个分组啊有冲突。所以我们就知道了啊,原来校验其实就是校校验这两个啊,然后再回来再回来之后,这一个环节就比较重要了。😊。
这一个环节为什么重要呢?就是很多同学啊就是搞不懂。我们创建的时候,为什么有一个叫做de MQ producer?为什么要有一个deult default MQ的consumer?
然后这两个东西它都属于clan端。对不对?他们其实有一定的联系,联系在哪里了?你可以看到就是。这个地方。这个地方可以说它是去改变我们的一个叫做instance的 name。啊,就是这个地方。
如果说你等于我们的客户端的这个proder的分组的话,他就会把它改改了啊。然后的话呢你可以看到底下最重要的这段代码是这一段。😊,这一段是干个什么事情呢?这一段其实就是获取一个实例。因为作为客户端也好。
作为服务端也好,你生产者或者是消费者,它本身应该来说站在系统的设计角度应该是个实例。所以他通过一个叫做MQ clman一个类,这是一个管理类,然后拿到它的intance。
拿到它之后再去调get or great mQ cl instance。那么就很明显,这个方法就是要去调我们的获取一个MQ客户端的实力的个方法。好,我们可以点进去啊。点进去之后,大家发现没有?
他其实入仓有几个,一个就是我们前面讲的这一个配置参数。对不对?这个配置参数大家可以看到啊,就是首先放在这里。然后第二个的话呢,还有一个钩子叫做RPC的一个hock。😊,钩子东西啊。
这个钩子呢跟GUM有关系啊。好,钩子的话就是说它能够去实现一个优雅的关闭,大家先了解就可以了。然后我们进入这个get or great mQ clean instance,你会发现在这个方法里面。
它就是需要去构建一个MQ clean instance。当然这里面呢使用了有一种叫做缓存的模式。😊,因为我们知道啊就是你在去创建这个生产者的时候,有可能你经常去跑,对不对?
我经常去new一个produer,你有一个produer,你一个proer,难道每一个proder他都要创建一个单独的实例吗?这里面我做一个问答,就是每次。我们去扭一个proer的时候。
又扭一个生产者的时候。都需要创建一个实力吗?啊,觉得需要的话呢,可以刷一啊。觉得不需要的话,可以刷2。就是大大家站在这个系统的角度,我们来思考一下。大家可以互动一下,我的课堂是这样的,我喜欢互动。
因为我觉得如果没有互动的课堂,没有灵魂啊。需要不需要需要讲一讲你需要的理由,不需要讲一讲你不需要的理由。好,这个问题其实。怎么说呢?嗯,我给他们挖了个坑啊。😊,这个问题就是像面试官一样的啊。
可能其实有时又需要,有时候不需要,当然条件是不同的。😊,OK我给他们挖了个坑啊,也不是单那问题。😊,大家可以看到,就是比如说我这个地方。我另外一个类里面再这么去写呢。比如说命名为一个pro。
那大家就觉得肯定不需要。对不对?肯定用同一个。但如果这个地方我改一个,那你又觉得肯定需要。啊,前提是什么?前提就是这个实力,他以什么条件去创建,这才是关键点。所以的话呢你会发现这里面它有一个依据啊。
就是如果我要创建这个实例的话,它跟一个条件有关,叫做客户端的ID calendar的ID。啊,就是它的主就跟我们插数据库一样的,这个ID就是主件。😡,如果说你主件是一个。
那我就可以把这个数据放到一个table表里面。所以与此同时,在这个管理端里面放了一个concorrd的哈西 map。这个哈西麦就是它的主件是cland ID。
然后呢它的value是我们MQ calendar的 instance我们的实力。当然,为什么使用看oon的哈西 mapap?因为这个地方它允许多线程,所以我要确保多线程安全啊,所以这一点就不用去多说了。
所以你会发现啊,它是通过这个东西来干的,首先去获取。如果没有的话呢,就 new一个。对不对?如果实力为空的话,我们就创建一个新的实例,并且加在我们的康过的哈希ap里面就行了。所以这段代码的话呢嗯很清晰。
也很简单。😊。


对不对?很清晰很简单。所以重要的话呢,这个地方就是相当于用到了一个哈 map的缓存嘛。就是以后你如果说在这个项目里面,你要频繁的去创建我们的客户端,然后你的客户端的ID是一样的话。
那这样的话我们就缓存就不需要重新创建了,这就可以节约我们的内存啊,同时也没有必要,对不对?然后这个客户端ID怎么创建的,要进这个叫做bu mq ID这个bu mq ID它跟几个因素有关系。
就是你这个ID的构成啊。😊,不是说你随便取的,而是说第一个跟我们客户端的IP有关系,看到没有?这个IP的话呢,他会去获取本地的一个地址。所以的话你就知道客户端里面第一个因素就是你启动的这个生成者。
它的IP地址属于1个ID的决定因素,但是不是单纯是他。第二个部分是什么呢?实例名称啊,叫做get instance的 name。实例的名称。当然这个实例的名称你会发现啊,除非说你自己去配了这个配置文件。
一般情况下面是default的。大家一般也不会去配这样的一个配置文件。所以大家就想到一个点,如果说你在roq的客户端想做一个,就是我有学生问我这样的问题,叫做多个生产者。多个生产者,多个实力对不对?
然后每一个启动的实例,他可能要去访问不同的rockq集群或者是rockq服务器。那你是不是就可以去通过这个配置参数改一下?啊,不然的话你定义成都是IP一样的,你自己跑的这一台服务器,当然IP是一样的。
你起一个proder是一样的,起第二个proder也是一样的那这两个实力其实是就是一个。所以如果说你想去通过一个客户端,然后去创建两个不同的proder。
这两个不同的proder去访问两个不同的服务器该怎么办?😊,对不对?那这个地方你就要去改嘛,你要去设嘛。你就要通过这些参数去设置。当然这个地方呢其实也很难去设置啊,因为它是拿着一个系统参数也很麻烦。
那那第三个还有什么呢?第三个的话有一个这个做unity name啊。😊,unit time name呢,其实这个更方便一点。呃,大家发现没有?就是unit time默认设置文档。所以的话呢。
它的这一个叫做cl ID的组成叫做IP加instance name加unity name啊,所以如果方便设置的话,就是为什么我在开始的时候有段这样的代码。啊,这个地方如果说你想客户端不一样的话。
最好的方式设置什么?设置unit name不就行了吗?这个是。啊,李景。对不对?然后有的同学说你要改一改,改成奥特曼都可以。😊,那那这样的话呢,他在客户端创建的时候,他就会是两个不同的实力了。啊。
两个不同的实力就意味着里面的参数你就可以随便配了。如果说你不通过这样的方式去修改的话,你就在同一台机器IP1样。然后呢,那个配置参数肯定是你怎么改都是一样的。第一个获取,第二个获取对不对?
那只有通过这个un name去进行修改。所以呢通过多元码,我们是不是就了解了这个点。😊,啊,这个点有没有问题,没有问题刷个一啊,这里面我再互动一下。😊,有问题的话呢,可以提出来。
因为开发当中极有可能有这样的情况。你经常去做一个生产者的时候,你可能在一个工程里面要去发两个不同的这样的roQ是有可能的,并且频次还不低。啊,只有这么少的人刷一吗?大家都在听课没有?嗯。
都在听课没有问题不大啊,我觉得太容易了啊。😊,好,问题不大,我们就接着继续啊。😊,好,接着继续了。嗯,那我们就回来。

就是我们刚才进入了我们的读源码中间的一个部分,就是进入这个star方法,然后它的这一个状态叫做great just。然后进入了一个叫做获取MQ客户端的实力啊。好,这就是我们刚才所说的那容代码。
然后下一个步骤的话呢,其实就是要去注册了啊,因为很多情况下面,我们把这个实力拿来之后的话,我们还要去调一个注册啊,所以这个地方叫有一个叫做MQ factory注册进去啊。当然这个注册进去的话呢。
其实也就是往一个专门的con map里面去存放。

就是作为re good的客户端的话,它当然应该有缓存啊。前面我们讲到了嘛,你要有produer的一个缓存啊,我既然创建了生产者,我当然有生产者的缓存,所以的话呢这里面有生产者的缓存,有消费者的缓存。
还有一些拓展客户端的一些缓存表。😊,ok。好。那这个东西就不用讲了,对不对?然后注册成功以后会怎么样,注册不成功以后就给他抛一个异常啊。然后与此同时的话呢。
嗯这个地方就会去拿到一个我们常说的我们的这么个默认的生产者。😊,他是不是要去有一个啊比如说自动创建的一个主题,对不对啊,然后拿到一个我们的啊就是消息发布的一些东西。好,那么这个东西就可以不怎么去讲。
反正是一个往里面进行put啊,最后的话呢,最终看到没有?里面有一个叫做stard factory。这个start factory呢,一般来说在第一次掉的时候。它是等于Q。啊,就是我们第一次调用的时候。
调用star的时候,它肯定是为te。就是这一个客户端。如果说它没有调过star,那它肯定是te,肯定是te的话呢,就会去进到我们的MQ clean factory点star。那么上面我写了一行注释。
就是最终呢还是会调用一个叫做MQ clean instance,对不对?所以这里面点进去,就到了这一个类叫做MQ clean instance,就是我们具体去执行。😊,生产者的一个实力类了。
OK所以你就知道了啊,他为什么要这么去写,为什么要搞这么麻烦呢?为什么都不放到叫做de mQ producer呢?😊,对不对?OK这里面的话呢就需要给他们用一张图来给他们稍微的说一下。😊。


就是嗯稍微解释一下啊,在rockQ当中,消息的发送和消息的消费它都属于客户端。所以呢它有一个顶层的类叫做MQ clean instance。好,每一个客户端。
它当然就是一个MQ clean instance。然后呢,每一个c的config对应一个实例,就是我们刚才讲到的那三个因素。所以故所以呢不同的生产者或者消费者,如果说你配置上面写的是一一样的。😊。
那他就会共享1个MQ calendar instance。

所以有时候就会发生这样的问题啊。如果说大家去嗯就是有时候你要去重视你进行消息生产的时候的这个group。对不对?这是第一个。然后第二个的话呢,你要去重视你启动的时候,对不对?
是同1个IP或者同一个其他的东西。所以这里面呢大家应该知道,从底下它会衍生出defa MQ producer application,关联出我们的deult MQ pushush consumer。
一个是生产者,一个是消费者。😊。

啊,然后呢他们啊都是通过这样的一个配置文配置类叫做cl confi。去区分的。如果你们的配置类是一样的那你就会共享这一个实例。生产者和消费者是一个实力吗?当然不是大家都想得出来啊。😊。
肯定不是一个实例啊。他是一个客户端,就是一个实力嘛。

因为你扭出来的东西,最终啊你你这个M科 calendar的话是一个实例。然后你调用的时候,我们再回到这个。😊,回到这里。你是不是不是还是一个MQ producer的bro好。当然这个实例里面它会放嗯。
怎么说呢?这个实例你来看啊,你要仔细看你就会发现啊。😊。

他其实里面会放一个proer的 table,放consumer的 table。我们放一些相关的信息。如果你配置相同就是一个啊,这个就不用解释了啊。好,我们再回到刚才的这一个发送者启动的流程。
在这个发送者启动流程之后,拿到这个实例之后,它就会进入MQ clean instance里面的star方法。😊。


好,进入这个star方法。大家。再看啊。哎,我们回到。这个时线内,然后从这里掉进的这个star方法。在这个star方法里面呢,它依然会去判断我们service的状态。比如说第一次你是刚创建啊。
还有呢可能是比如说启动失败了,所以这个地方呢无非就是你是在刚创建还是启动失败。如果是其他的话,它就不用管。好,那么在这一个switch里面呢,大家可以看到。
首先第一个嗯它就是拿到我们cland的一些配置,对不对?判断它得不等于空啊,如果说不等于空怎么办呢?或者是如果等于空怎么办呢?等于空的话。
就从重新在 server去拿一次就是itch server address就刷新一次嘛。如果说我们的这个name server没有拿到,我们就通过这对应的类刷一下,看看能不能缓存里面拿到。
或者网络通讯里面拿到。好,另外的话呢因为你是客户端,最终你要去进行消息的发送,所以我们就需要去启动一个叫做NRC这称之为na remote calendar端,所以这个star方法呢,很明显。
它最终呢就是去把这个叫做的 remoteote calendar端啊,就是remote calendar端把它进行启动。😊,好,那启动完之后,它还要开启定时任务。这个定时任务用来干嘛?
定时任务我们再来点进去。定时任务里面呢,当然他有很多定时任务。啊,比如说我们每隔2分钟,我们就要获取一次路由的地址。就是我们的一些IP呀,对不对?所以这是一个定时任务。然后第二个的话呢,我们每隔30秒。
我们就要需要去修改对应的路由信息。因为有可能这里面的对应的主题呀,对应的路由对不对?比如说对应我们的这一台name server,这台name server底下了它的主题信息修改了,所以怎么办呢?
每隔30秒要进行一次更新。😊,好,那除了这个之外,在我们第一节课里面讲过了,无论是客户端还是leme还是broer,他们都要与name server进行心跳,对不对?那除了这一个客户端客户呃。
客户端主要是跟哪个心跳呢?是跟我们的bro进行心跳。所以这一个定时任务是每隔30秒也要跟我们的这一个bro进行心跳啊,这都是使用的sex底下呢这个配置就是它们的一个间隔时间。啊。
这个就是对应的间隔时间啊,这个东西的话啊,这个除了这个地方是写死之外。下面的都是有配置的。也是可以通过配置参数配置文件去改的。所以为什么这里是30,为什么这里也是30?因为它默认都是30乘1000。
也就是30乘1000毫秒。因为对应的单位的是mining seconds。

好,那么还有包括这种持久化消消费的一个进度啊。其实这里面后面讲到这个消费者的时候,其实这里有用。现在讲的生产者的话呢,你可以认为这个地方对我来说没啥用。

然后还有包括一些我们去啊就是动态去啊就是降一些下线程池啊这种东西的话,我们就不需要去过多讲了啊,所以。

回到我们最主这个流程,就是这些定时任务啊,它主要是一些路由地址、路由信息,还有心跳。OK还有心跳。

好,那做完这个之后。我们定时任务就开启了。😊,然后开启完之后的话呢,它还会开启一些我们消费者的一些拉取消息的服务,还有负载均衡的这些服务啊,这些东西的话呢,你都可以先不看。
后续的话我们会给他们进行一个详细的讲解。好好?然后最后它又去调了一次star方法,看到没有?这个star方法。
相当于是又回到了我们刚才的这一个叫做什么de mQ producerimplication又回到了这个类,就是把这些东西干完之后,又回到这个类,回到这个类呢又去调了一次star方法。
在这个star方法里面,我们就知道它的这一个状态肯定不是great just。😊。


因为只要把前面的这个东西干完,对不对?他的状态就是running了。啊,所以这个地方呢你可以看到嗯前面把它干完,是不是?那这些状状态就没有了。没有之后,那个switch的话就会把它跳出来。😊。
跳出来之后的话呢,你也可以看到他最终还要去及时发一次心跳啊,就是我们之前讲的。

这里面的这些定时任务啊,是起的定时任务发心跳,就是每隔30秒发一次心跳。但是你客户端启动的时候,你把这些东西启动完之后,是不是立刻要向我们的broer发心跳所以呢在最后的这一个跑完之后。
这里面也直接会去send headbitat to all broker with knock意思就是说我们向所有的bro进行心跳的发送。啊,当然这里面具体的这些通讯的细节我就不去讲了啊。
因为这些东西的话,其实在就是在我们第一节课里面我们也讲的很清楚了。😊。


好,所以这个地方呢,我们就把消息发送的启动流程给他们讲清楚了啊。

系列 6:P130:RocketMQ源码分析:并发消费流程 - 马士兵学堂 - BV1RY4y1Q7DL
他的话其实他在很多这种生产消费的这种场景当中会经常用到啊。所以这里面呢我就把三个角色列举出来,一个叫consumer,就是我们的消费者,一个叫broer,这是主机。
还有一个叫做name servername server就是负责服务的注册与发现,也能够拿到相关的路由信息。所以首先我们来看第一个。在并发消费的时候,我们来看第一个啊,就是当我们消费者启动之后。
我们要做的第一件事情是什么?第一件事情,除了去就是注册这个方法之后之外,我们是不是还需要从namemo server里面去拿到相关的路由信息啊?啊,你作为一个消费者。
你刚开始你来你来看一下消费者里面配的是什么,配的是name server。😡,消费者他也不知道主机在哪里,因为你的主机有可能是单个,有可能是集群。但是它统一都是由name server来提供的。啊。
由这一个服务的助付费中心。所以的话呢这里面它就会要涉及到一个东西去拿消费。这个消费怎么拿呢?回到我们的这一个主流程MQ clean instance它会启动定时任务,启动定时任务里面。我们往下面走。
看到没有?第一个拿到我们的路由地址,第二个拿到我们的路由信息,是不是这两个定时任务就做做到了?对不对?拿到我们的路由信息。比如说路由地址的话,一般来说是从。就是从我们的这个啊刚开始配的里面去拿。
因为我配置拿,它不涉及到网络通讯,对不对?因为我配我启动这个消费者的时候,我就会去配置name server。所以这个东西还是比较简单啊,路路由地址,对不对啊。
通过我们的name server然后拿到相关的东西啊,然后第二个的话呢就是拿到我们的路由相关的信息,就是这个update remoteing in fromname server。好,这里面的话呢。😊。
他会去调我们的update这个方法,再跳进去,跳进去之后再调到这里,调到这里之后再调到这里,调到这里之后啊,这里面我特意写了。啊,进入这个方法,这个方法就是一个叫做request code。
就是我们请求的时候包装的一个coded,这个coded叫做。Girl, get remote info by topic。就是根据我们对应的主题,我们要获取路由信息,当然它的编号是105。啊。
但是的话呢它在里面定义了一个变量,叫做getchremote inform by topic,对不对?就可以拿到相关的路由信息啊,这个地方返回的就是一张主题的路由信息表。啊,这地方就知大家就知道了啊。
就是你的主机的相关信息,你的队列的相关的一些信息,你就可以拿到。OK所以在我们进行并发消费的时候,第一个流程就是获取主题的配置相关信息,然后去调name去拿到的。当然它是通过一个定时任务。
这个定时任务的时间是多少?定时任务的时间在这里。一个s excuse service。OK然后这里面的时间间隔是。30秒30乘以1030行30秒。啊,这是一个主流程啊,我们梳理主流程。然后第二个的话。
你既然已经拿到了主题相关的配置信息。还要做个什么事情?那第二个事情是不是我们要去拿取到对应的消费者的列表?因为你这个消费者启动的时候,有可能你之前已经启动过,尤其是对于那种群组消费。不是那种广播消费。
对不对?如果对于群组消费的话,我的持久化的信息保存在哪里?保存在broker上面。所以我们需要通过远程过程调用,就是通过这种我们常说的这种NRC的这种功能号的接口去调一下broker。
你来告诉我我对应的这个topic它以前的消费进度是怎样的。或者它的一些消费的列表信息是怎样的。所以这地方有个功能叫做get consumer list group好,那这个地方怎么调的呢?
这个地方再回来。啊,再回来。回到我们的这个star方法。他在我们的负载均衡里面。啊,就是我这个地方放了一个d balance。这一块都属于负载均衡啊,它在这里面。叫做re service star。
re service star的话呢,我们要找它的run方法。找这里,这是它的run方法,因为它是一个runable,然后丢rebeance。然后de re balance掉进去。调进去之后。
因为我们默认使用的是default mQ pushush consumer im。所以我们用它用它调再调进去。再带进去之后啊,然后。嗯。嗯,再看啊。嗯。到这里啊。这里啊。就具体的话呢。
前面是拿到一些列表,拿到一些列表之后的话,再通过一个for循环。for循环最终是不是掉到这里?因为有可能啊就是你们在进行消费的时候,他可能不单纯是订阅了一个主题,他可能会有多个。所以你要考虑这种情况啊。
所以我们也是走了一个货循环。啊,因为你去订阅的时候,它可能会有多个主题。这个地方我们就做了rebance by topic。好,再进入这里,你就会发现。他就会有两个判断。
会根据你之前设定的message mode消费者的模式啊,或者是广播的。啊,广播的我们就可以先。嗯,不怎么管嘛,一个是广播的嘛。还有一个的话就是广播的话,大家应该知道广播的话就是把他把它存储在本地。
所以呢这里面基本上都是对本地的一些文件,本地的一些缓存进行处理啊。这个部分东西我们可以先不看,我们看的核心是我们的集群,对不对?通过集群的话,你会发现集群他去获取消费进度的时候,他会拿到1个CID2。
这个CIDO是通过1个MQ calendar的factor。点fin consumersumer ID list啊,这个方法最终。来看最终的话会去调到。这里。因为这个地方是个非空判断啊。
最终通过MQ calendar APII im叫做get consumer ID list by group。哎,再跳进去。再跳进去之后啊,还是我们非常熟悉一段。
通过NLC的组件组件送入一个叫做get consumer list by group。

所以这段代码就是对应我们刚才的这个交互流程。第二个步骤。第二个步骤的话,我们要去拿取对应的消费的一些列表信息。就是我们对应的这个分组里面你的消费列表啊。如果说你还不太清晰的话。
其实你就可以去找这个消费者。

嗯。就是我们通过控制台很明显,我们知道。控制台它连接的是主机,对不对?主机里面它就会保保存各种消费者。比如说我们刚才的g下划线 console啊,这里面就会有一些消费的详情信息了。

看点进去能不能打开啊,有时这个控制台。有啊有啊。啊,这个地方你是不是就明了了?他就呃点的太多了啊,这个反应比较卡顿。他就知道我们刚才的这一个呃这一个消费者。对不对?它定义的是book a主机地址是这个。
然后你看到这里面就有不同的一些,比如说pro access consumer access。啊,这是不同的队列,Q0Q1Q2Q3就是这4个队列。主机上面的偏移量是多少?你消费的偏移量是多少。
中间的差别是多少?啊,有时候我们可以去查看这个consumomer的相关信息,我们也知道现在还剩多少消息没有消费。所以刚才这个功能号。😊。


这个功能号拿到的。就是我们这个差不多这个东西。有没有问题,没有问题,刷个一。好。有问题可以提出来。那这样的话就比较清晰明妙啊。Yeah。Yes。我互动一下。嗯。咦,这个聊天窗口是不是刷的很慢?没有问题。
可以刷个一啊,这个过程应该就非常清晰明妙。我们去拿到的这一个对应的topic test,对不对?然后你对应的这一个consumer这个消费组,然后底下主机的偏应量是多少,你消费的偏应量是多少。
他拿到一些相关信息,不然的话,你就不知道下一次启动的时候,我到底是消费了一条,两条还是10条还是三条是5条呢?🤧嗯。这个恶龙咆哮同学,我们先讲原嘛,好吧,你这个是属于实战部分的东西,待会儿我跟你讲。
讲完这个主研嘛的课程以后,我跟你讲。我们不偏离课题啊,偏的太多的话,我没有时间没有精力给大家去解释。因为大家还有60位同学在听课。

所以你就相当于是这个地方拿不到是这部分东西。啊,如果说你的主机又在这里面写,那这一个主机比如说变成了20了,那你下一次启动的时候就知道我要从我要把这个20叠下息消费给你,对不对?
那就只剩下一条没有消费了。😡。

这就是我们的主机端,或者是我们的的这一个集群消费啊。好,那么我们回归到这个流程啊。那前面的东风哦,不是,就是万事已经具备了,对不对?我们就把主题呀,把对应的消费的一些列表信息都获取了。
那剩下的工作是干嘛分配Q了。啊,剩下的工作就很明显了,就是要去分配Q。😊,对不对?剩下的工作其实呢分配Q的话呢,一般来说我们把它称之为负载均衡啊。负载均衡的话。
默认情况下面是一个arrange了这样的一个方法啊,就是如果就是啊这里面我多说一下啊,如果我们的topic里面的队列比较多,比如说这里面有6个。那你的消费者只有3个的话。
一般情况下面我们的消费者他就会去消费2个Q。好,如果说你的消费者比较多,消费者达到了8个,那是不是就会有两个消费不了?这就要注意啊。就是说如果你的消费者数量多于我们的Q的数量之后。
多余的消费者他就消费不到。一般情况下面多了,你就一个consumer最多只能消费一个Q。然后呢,没有被分配到的那你就在里挂起阻塞的。因为没有消息给你。当然如果说你的Q比较多。
这个主题下面有6个Q分布分布在broke A和分布在broke B。那么默认情况下面是走我们的平均法则。平均的话呢,有种非常简单粗暴的,就是6个12划给你34呃3跟下面的这个Q1划给你。
还有1个Q2和Q3划给你。这个东西也比较简单,就是通过我们主机去拿的时候,我们把这一个6个合并成一个list。啊,然后的话我们算出来算出你的数量,3个三个刚好的话呢可以平均。所以的话你拉两个,我拉两个。
我拉两个啊。当然还有一种叫做bicycle。 bicyclecycle的话就是转圈圈。啊,就是跟经常我们的一轮。啊,这个轮大家应该知道啊,就是这一个轮给你这一个轮给他这个再轮给你,下面这一个又轮给你。
下面这一个又轮给你,对不对?lets。就是摆一个圈嘛。😡,就是我们啊大家来分赃的时候啊,你一你一块我一块你一块我一块对不对?然后发现哎东西还有多,那就在你一块我一块,再你一块我一块啊。
两个呢稍微有一点细小的,或者是有一点细微的差别。但是默认情况下面呢是走这种最简单的。当然你也可以设置策略啊。好,这就是我们刚才讲的这一个负载均衡啊,这个负载均衡呢就我们就不看远嘛了。
因为负载均衡里面的东西呢,说实在啊,它里面涉及到一些复杂的东西。或者是很难去看的东西啊,我们就先把这种东西快速过了。😊,那复载均衡做完之后,我们指定的这个consumer。他是不是就应该知道了?对不对?
他是不是就应该知道相关的信息了?就知道我要去分配到一个对应的Q了。啊,我知道分配到对应的Q之后,现在还要做的一个事情,就是我需要去获取到对应的这个Q消费的off。
就是作为前面这个功能仅仅只是拿到这些列表,就是它不会像我们这个控制台刚才看到的这个consumer detail这个详情这么详细。

他仅仅只是拿到相关的一些列表。比如说拿到这些对应的表。但是他没有拿到每一个对应的Q上面的对应的opsite。

所以他在调用的时候呢,后续还需要去调一个功能号,叫做quarrual consumerer of。去获取对应Q上面的消费的偏移量。OK所以这个步骤的话呢嗯。大家可以看到在哪里呢?
还是在这一个rebeance。嗯,还是在这一个rebinance by topic。这里。嗯,前面干完这些东西之后。拿到一些对应的消费的队列,对不对?这个里面呢也仅仅只是只是一些队列的名称啊。
你可以看到一个list子的里面存放一个str。好,拿到这些之后,在这里把它排序。啊,其实通过一个我们的集合类啊,把它做一个排序啊。排完序之后,嗯,紧接着这一个部分就是我们前面讲的那一个分配策略了啊。
它有一个专门的分配策略的类,这部分东西的话呢,一般你把这张图记住也也就差不多了。一种是默认的,一种是bicycle。好,那走完这个之后。紧接着我们就需要去获取Q消费的offet了。
所以这里面呢根据前面的主题,根据前面分配的一个对应的结果,根据你是不是顺序的去进行一个获取Q的啊,不是这里啊,是哪里是。看错了,不是这里。不是这里。Rebinance by topic。
The queue said。Q a set Q a set。哎,在哪里?来看圆嘛,看的很蛋疼啊。这里Qa of data in。sorry啊,等一等啊。然了cate分配完之后,分配完之后添加。啊。
这个地方搜一下啊,写了注释的。下次消费的可以呀。是这里啊。Oh。哦,是这里啊。是这里啊,跳进去。跳的很深啊,是这里。跳到这个地方。跳到这个地方之后的话呢,嗯,然后我以为前面这个外处就结束了啊。
这段东西呢,还是前面的一些。就是一些我们队列的处理啊,队列处理完之后的话,紧接着。啊,我们是不是就要去从每一个队列里面去便历啊,便历完便利的事情。其实说白了就是我们前面拿到一个队列的列表。

然后拿到这个对列率吧之后,现在变论的事情就是要拿到这个consumer of。

啊,所以我们刚才的这部分代码做的事情就是说便利每一个Q。因为这个地方是一个messQ嘛,它是一个Q的集合。啊,Q的结合之后,我们从每个Q里面计算computer poor from where。
就是中式英语啊,就是计算出我们应该从哪里开始去拿消息,对不对?很明显。这个地方我们用的是rebinance push implication。然后我们经常提交的时候,我们去消费的时候。
什么叫做consumer from last。啊,就是我们去定义消费的时候呢,往往默认情况下面嗯我们把前面的这一个哎。跳转就确实多了,我把前面的东西关掉。这个conl码它可以设置一个。东西。看书嘛。
应该sta。啊,对。就是一般情况下面,它可以s from where,就是我们的这个函数里面。就是你默认情况下面它叫做什么?😡,consumer from last of就是我默认消费的话呢。
都是从上一次开始消费。啊,就是配配置参数里面,大家应该也要熟悉一些消费者的配置参数啊。所以我们为什么默认情况下不去配呢?因为默认情况下面,我们就是从上一条已经结束的,我们接着消费。😊。
当然这个里面它还有很多,比如说还有从大家可以看到这个里面的这个computer计算。啊,它什么重新开始啊,从最小的啊,从最大的啊对不对?还有一些其他的处理,但是我们往往只关心这个好。
只关心这个之后的话啊,大家就会发现了前面我们的offset的这个存储。😊,他就有作用了。对不对?啊,这个地方进入到这里之后,我们就会去有一个offset stone reader ofet就是读。
但是读的时候,我们前面是不是说过,一个是本地,一个是远程。如果是广播则本地。如果是集群消费,则 remotembro of。所以这个地方就要跳到远程的remotebroer of,然后在这个方法里面。
我们再来跳转。再来跳转的话呢。叫做它带了一个参数啊,叫做read from stone啊,从存储来读。所以然到到这里就是根据你送的t类型。如果是read from stone的话。
那么调这一个fiitch consumer offset from book顾名思义,从我们的主机里面更新消费的offet。所以再跳转就到了这里。啊,前面是是个判断,具体去找我们的这些相关结果的话。
是这一段代码,然后。到了我们非常熟悉的一个叫做NRC的一个类了,就是构建1个NRC的通讯,创建一个quarrual consumer of的一个功能号,然后把相关的信息查出来之后,把这个结果进行返回。
啊,结果他只需要返回一个n类型,就是你指定的这一个队列,对不对?指定的这个队列里面,然后。它的这个消费的偏移量是多少?所以呢这个代码就是我们的获取Q的消费的偏移量。

好,也就是我们前面看到的。虽然这个控制台功能很多,但是他拆到这种消费者的时候,首先是拿到这个队列的相关信息。第二个功能再去远程一下,获取consumer的offset好,做完这个之后。

接下来就是去拿消息了。因为前面我们已经知道哪个队列了,甚至我们已经知道我们需要去拿取哪个队列从哪个地方的消费片移量呢,包括你的主题,包括它的一些主机,什么东西,我们都已经拿的非常非常清楚了。
所以最终消息的获取是叫做拉取我们的小Q的消息。所以这个地方呢就会进入一个啊我们的叫叫做p message。大家知道啊p message怎么实现。又要回到我们的这个。啊,把前面东西东西都关掉。
又从我们消费跟起。Yeah。然后消费跟进之后,我们又要到那个。客户端的实力。啊,就是到我们的这个MQ calendar instance的实例。ins的实例是启动一个定时任务的线程。啊。
启动一个定时任务的线程去开启拿消息,就是这个pro message。所以这个pro message它本身是一个runundable。啊,然后这个线程线程在不断的去拉我们的消息去运行我们的run方法。好。
运行run方法的时候,调put messageput message到我们的实现内叫deform mQ pushush pushush consumer的 implication的实现内。然后到这里。
我们再点击啊。这个地方就会相对来说会有点有一点点长。前面的这些判断,我们可以把它稍微的忽略啊,就是一些一服判断一服判断衣服判断衣服判断一服判断一服判断对不对?
一服判断一服判断一服判断一服判断一服判断OK前面一大堆的一幅判断。然后叫做p message,这个地方确实比较长啊,往底下走找走走走走走走走走走走走。嗯。找到哪里了?要找到比较后面的位置啊。到了最后。
这个地方。它才是真正去拿这一个消息的核心内,看到没有?p corner implication去拿消息的核心内。前面根据我们拿到的message的队列,还有对应的一些嗯offset偏移量。对不对?
还有一些我们常说的就是下一个的偏移量,还有一些我们订阅的相关信息,还有包括一些子子的这个版本呢,还有一些其他的一些东西啊,什么模式啊,对不对?所以通过这个方法,我们就可以去完成这个功能叫做拿取消息。啊。
拿取消息。经过我们的这个p corner的implication跳转。好。最终。到了这个方法叫做MQ clfactorge。我们MQ clean APII的一个时间内叫p message啊。
到了这个类其实就很明显了啊,地址request头对不对?time out,然后一些模式,然后它的call这个消息的头就是我们包装的。包装一个request handle,你订阅的组,你的主题。
你队列的ID,你需要去拿取的偏移量,每一次拿取的最大数量,还有一些提交的偏移量,对不对?还有一些我们的子的一些版本,还有一些失效的一些类型啊,还有一些其他东西。然后所有东西都会封装成一个request。
hand等,然后进入我们的这个p message。进入我们这个prom之之后的话呢。啊,他就会要根据不同的模式去拿了啊,同步异步,还有我们的这一个望位啊。但是一般情况下呢。
我们是通过这一个异步的这种通过这种同步或者异步的方式去拿。OK然后到了这个地方。我们就会进入。这个地方。啊,就这个地方就就差不多了。就是看你的这一个默认的格式吧,这个默认的格式看一下。
前面根据参数来设定。默认的格式。格式啊,这是要根据前面默认格式走的。默认的格式是一步。大家可以看到啊,他去拿消息的时候,默认的格式走的是alynchize e,对不对?😊,然后最终会跳入这。啊。
前面这个地方也是去封装一个功能号,叫做 pull message的功能号。所以呢就跟我们的这个叫做功能号的调用跟跟你的差不多就是对应起来了。啊就是启动一个线程,不断的去拉我们的消息,拉我们的消息。
拉我们的消息OK然后拉我们消息的时候,对不对?最终就调到这里,通过一个异步的响应。😊,啊,这些东西呢就是可看到就到了这里嘛。这里的话呢就会去执行一些拿消息的一些封装的啊。啊。
专门去封装了一个拿下去的处理啊,包括一些对象的头啊,包括一些其他的处理呀。好。这就到了我们刚才所说的拿下去这个环节。这从Mm去拿吗?从那里去拿客户端,我们前面讲过。前面讲存储的时候是不是讲过?嗯。
那你你你要看,其实很简单。你要看的话,看到这部啊,这个地方不是有个pro message吗?你可以去搜一下。😊,pro message如果在我们的客服务端,就是客户端,我们是不是封装的一个类?
叫por message找啊pro message。To message。看到。这是我们的bro controller,还记得bro controller吗?bro control它属于我们存。
这这是我们的主机启动的时候。如果说你去往这个功能号面发,那么它有一个叫做NRC的,就是native的remoing service端。它会注册一个poster,注册一个任务。如果有请求来了。
他就会把它交给这一个p message的。所以p messagepo最终。是不是前面我们讲过一个入口方法?啊,然后交给这个现程池pro message per。然后这个地方呢,大家应该也知道。
就是为什么前面我们说常用的消息会到我们的叫做prooc的 request。就这么来的。就会把我们前面的这个消息的存储的处理啊,就是这一节。给你串起来。应该当然应该是这里。啊,穿起来。
那他在最终到了任务的时候,会去调这个send message per,到了这个procesor request,到了消息的一个息啊,不是这个不是消息的写入流程,到到这个quary per。
它是一个消息的查询,生产的时候是写。然后的话如果是消费的时候,就是叫做query message操操去查。OK就跟我们的写入流程就是有点类似了。😊,好。消息写入使用的雷雷体嘛,当然是雷体啊。
就是在rockQ里面,你通过看源嘛,它除了一些非常简单的功能,用的是这种HTTPc其他的只要是涉及到就是请求频次非常高的,它都使用的是雷体。😊,就是你一旦看到这种组件。
就是要封装一个remote command。就是一旦看到它的参数是什么remote command就一定是layO。😊,这一点应该是比较容易啊。嗯,就是一旦你比如说你要去发消息的时候。
他通过lay一定是通过这个reming commandd去组建一个请求的command,就是组建一个请求的包,这就是走的la体同他自己就是相当于是在lay上面做了一个简单的包装包装的一个la体框架。
OK。好,这就是我们刚才讲到的这个拿消息的一部分啊。拿完之后的话呢,当然他要进行对应的消费了啊,消费完之后紧接着还要注意两个事情,一个事情就是你消费了,你还要去更新。😊,Ce upset。
那么在这里面我就提个问题啊,因为我们根据前面知道,虽然我们并发消费者的是一种推模式,但是本质上面他是去拿消息,并且去拿消息的时候,我还告诉你了,他每次去拿消息。他还去拿一段。对不对?你拿消息之后。
他设置的我找到这一个topic,找到对应的队列,从哪个偏移量开始,他还要设置我这一次可以拿多个。所以你如果要提交偏移量的话啊,好像在我们这里面去做是不行的。就是什么拿一条去提交一条是不行的。
因为它是通过一个GNT处理,所以怎么办呢?所以在rockq里面,它又会启动一个定时任务,去更新我们Q的消费者的一个偏移量。

就是大家看到的。在我们管理后端,他会去拿到我们每一个消费者消费的偏移量。这个数据哪里来的?这个数据就是我们通过这个功能号去更新的。这个功能号是通过一个定时任务来处理的。

OK然后大家可以看到更新我们Q的一个off的时候,因为并因为我们的消费者他虽然是推模式,但是基于拉模式实现的拉模式是一批批拉,所以你不可能做到一PP去提交。
所以这个地方要用一个定时任务去更新我们的偏移量,怎么更新的?再回到我们最核心的一个类就是。😊,MQ calendar instance对不对?这个类里面有一个star方法。
star方法里面呢再来看它就开启一个定时任务,开启一个定时任务。我最后面这个东西没讲,就是在前面的时候没讲这个地方说了是每隔5秒钟,它会去持久挂一个消费进度。当然。这里面的参数为什为什么是5秒钟?
因为这是1000乘以5,然后这个单位是毫秒,所以它就会去运行到我们的叫做MQ clean instance点叫做proit or consumer of到这个方法到这个方法到它的实限内。实现内的话。
因为我们是pushconer,所以是default mQ pushushconser的实现内。然后到这里之后。哎,到这里。这里的话就是前面。是根据我们去分配的一些队列,分配的MQ的一些队列,对不对?
然后下面。就是我们具体要处理的。如果说你的是广播消费走本地的这一个,如果你是集群消费,走远程的这一个。所以这地方当然是走远程的。好,走了远程的这一个之后啊,大家可以看到。前面又是个破循环呢。
因为你去更新的时候,你不单纯只是更新一个队列,它有多个队列,所以这是个队列的集合messageq的 messagesage Q的一个set。然后根据这个集合。
大家可以看到这个地方有个方法叫做update consumer of to book顾名思义就是修改我们消费者的偏移量给broke端,一个是MQ,一个是消费的偏移量,就是两个参数。然后这两个参数到这里。
然后到这里之后。也把它去进行一个封装,封装成一个request handle。对,这个request handle,就是因为你去更新的时候,它还有对应的主题呀,消费者分组啊,对列的ID呀。
消费者偏移量啊,对不对?所以把这个request handle封装,封装完之后。嗯。调这个方法就是看你设置的模式是不是到底是望位啊,这个玻ing值的话。看一下默认是t,那就是单向的。
就是oning is only way的话,单一下呢就就到这里。😊,到这里。在。啊,到这里以后就非常明显了。😊,又是一个la体的远程调用,功能号是update consumer opposite。
就是去修改我们的这一个消费者的偏移量。所以。到后面这个环节就是启动一个定时任务,然后每隔5秒钟去更新我们Q消费的偏移量,功能号叫做update下划线consumer下划线opposet。对不对?
就到了这里。这个功能号就是对应的。然后就是客户端去调一下。Yeah。好。这就是我们并发消费的一个流程啊。然后最后的话一个注册我就不用去讲了。注册的话呃就是注销的话其实就呃就相对来说比较简单了啊。
我们主流程就讲的差不多了。注销的话就是你去消费的时候,你还可以走一个consumer的说down。说down的话,它也要去远程调用一下,这是一种优雅的关闭。😊,也要去告诉我们的客户bro端。
我们去取消注册我们的can端呢,它也会有一个功能号啊。好,这里面我们就把整个的并发消费的流程讲清楚了。我们来回顾一下。第一个的话,并发消费的流程的话确实步骤比较多。
就是如果说你要去每一个环节都跟原码的话,肯定是看不下来的。所以我们把它通过一些核心的调用啊,把它看完,就是你们去看一个流程的话,其实你们知道几个角色。比如说cons对不对?
你如果说要涉及到一个数据流转的话,往往就说如果我们要完成消费,你中间怎么交互的。这相当于一个并发消费的数据的交互流程。第一个拿到主题。第二个拿到我们的消费者列表。第三个分配Q分配Q完之后。
我们还要根据每一个Q到我们的包上面去拿到偏移量。然后有了偏移量,我们就知道我们从这个Q里面可以拿多少条消息啊,拿到消息之后,我们完成对应的消费这个消费的话,就是我们的那个注册方法。完成这个注册方法之后。
我们就会要去更新。因为我们做完消费之后,我们还要定时的去更新我们消费者的一个偏移量。然后最后如果是一个优雅的关闭的话,那个 down。😊,去调用我们的这种叫做注销注册的一个方法。
也是把我们的主机上面的一些东西给释放掉。当然了,就是如果说你不去调这个的话呢。

系列 6:P131:个人情况该怎么写? - 马士兵学堂 - BV1RY4y1Q7DL
做好你自己该做的事情好不好?我来告诉你怎么去写这块东西啊。

第一个。😊,个人个人情况。个人情况这块听好,朋学们,我现在告诉你怎么写啊,一会儿我给你展示案例啊。😊,想跳楼了,不至于好吧,这才哪到哪就是就就想想跳楼了。


同们听好了,个人情况这块你要怎么去写,把你个人要描述的基本信息,我希望你能描述清楚。这里面啊包含了什么姓名?


性别。然后。还上来的。

邮箱。联系方式。还有就是你的大学学校,如果你的学校和专业啊。


这两块同学同学记住了,就这个东西好的写。

不好都不写。你知道我这大专我有不要写吗?不需要写好吧。😡。

对我之前说过有一个很重要点,我希望大家把籍贯加上。

好吧,把机关加上,因为有可能会遇到你的老乡好吧,咱遇不到也没关系,但有可能也会遇到好吧。

然后明办写不写无无所谓了啊无所谓了。

我觉得不要写,最好不要写了。

专业和学校好的话就写,不好的话就不写了,行不行?OK年龄要写你年龄写不写无所谓,写不写无所谓吧。


详写个加上详加上,就是这里面有一个很重要点是什么?这两个东西啊,千万别写错了。之前很多东西这两个东西写错了,不要不要不要写错。😊。


好吧,软件工程、技科、电子信息工程、信技,像这样的计算机相关的专业,你就写不是计算机相关专业,你就不要写OK。😊。

是这个这块其实没想,一般不都会出问题。然后这块只要注意一点,该对齐的格式就行了。这块。


主要注意格式。啊,主要注意格式,不要出现这种错乱了,对不齐了,不要这样不要不要写这个东西。

O。软工不顶查用,最起码你是计算机科班出身嘛,对不对?习惯还真有用。上次去面试不局老想问我去哪个县的。大家注意啊,如果在一线城市里面基本上都是外来的。所以这个籍贯这东西啊还是很重要的。我基本上遇到。
比如说我老家是河北邯郸的,我基本上遇到河北邯郸的,我基本上。😊。



内心的感觉是不一样的,内心的感受是不一样的,明白意思吧?好吧。

系列 6:P132:技能描述、自我评价该怎么写? - 马士兵学堂 - BV1RY4y1Q7DL
来第二个,当你的个人情况完了之后,这块有选择性的写两个东西,要不然这块先写什么,先写你的自我评价。要不然就写你的专业技的技能描述。这2块你分条件来写。对,这块,如果是工作经验比较多的。
较多呢你就先写自我评价,工作经验少的就先写技能描述,先写技能描述,听白了吗?好吧,那技能描述这块应该怎么去写呢?非常简单。我还这句话,同学们技术这块啊,每个人在面试之前基本上都会做技能的准备工作。
但是很多同学在做技能描述准备工作的时候,可能做的不是那么完善。所以呢在技能这块你也没办法预估说面试官他可能会为什么,会可能会问什么,所以你要尽可能去多展示你个人的技术优势。
同时要把你掌握的这种技术细节和技术亮点,你必须要把它给凸显出来。如果你的技术细节和你的技术亮点表现不出来的话,就很麻烦。有人会说老师我为我刚问了问题,我问大家为什么要写那一些什么idea这样的东西。
很多同学会觉得说老师,因为我没东西可以写。作为一个普通的java开发程序员,你不可能不知道你要学什么东西,你不可能不知道说现在企业里面需要什么技术。如果你真的不知道怎么办,也非常简单。
你随便打开一个招聘网站,你在里面随便搜一个java开发工程师,对吧?里面有一堆的这种职位上面的要求,一111到2。😊。

lawyer。

你找一个差不多这样的一个职位,看看它里面要求的技术是哪些,把这些要求的技术都单独拿出来做一个罗列和描述就OK了。罗列和描述就OK了。好吧,那这块应该怎么去写呢?非常简单,比如说第一个要写什么东西啊?


大家注意了,写技能的时候是有顺序要求的。什么叫顺序要求。很多同学在写技能的时候,他不注意情况,我想到什么地方,我就写什么地方。其实不是这样,你正常情况下写技能的时候,应该按照你学习的方式。
或者按照你学java的顺序来写?比如说刚开始你在接触java的时候,你先写什么?不是先写javaSE吗?对吧?那这样应该怎么写?对于已经有工作经验的同学呃,对于已经有工作经验的同学怎么写?😡。
你怎么写这东西?第一个写上。京东大家有朋友会问,老师,我到底写京东还是写熟悉。我说一下京东和熟悉,你自己随便看着办,它就是一个描述词。如果你敢写京东,你就写京东,不管你进题写写熟悉。
但是简历里面千万不要出现了解,听明白了吗?😡,你的简历里面千万不要出现了解什么技术,千万不要这样写。因为了解在我看来,几乎等同学不会投简历的时候,每个人是一定有没有人说老师我的简历也没有水分的没有吧。
基本上所有人在投简历的时候,简历里面百分之百是有水分的。所以如果你有水分的简历都写的是了解。那实际情况在我看来,你的了解等同学不会,所以不要写这个东西,啊,最起码你要写个熟悉熟练掌握,类似于这样的描述。
好,如果有把握,你就写精通但是我之前每次一说写精通的时候同学就会怼我老师我写精通被笨的很惨怎么办?你先有面试机会,再说混同学都会怼的很惨,你连面试记录都没有,你就想着会不会怼得很惨,有点过分了。😡。
好吧,所以先不要想这个东西,那这玩意怎么写啊?表彰S我要怎么写这东西。😊,你可以这样写吗?好吧,京东熟悉。ja案核心好吧,多年一线研发。经验具备。量好的。编程。能力。并熟练。应用。设计模式。
可以这么写吗?这是已经有工作经验的同学,你可以这么写。有说老师,我没有研发经验怎么办?😡,我没有研发店怎么办?😡,这样写吧?熟练掌握javaSE基础知识。对。集合。县城爱O都有深入理解,具备。
良好的面相。对象的编程思想并熟练。掌握设计模式。能这么写吗?😡,这不都是废话吗?可以这么写,应届生。😡,生宝贝儿们能这么写吗?😡,你怎么会没东西可以写了?你掌握的技能这么多,不就可以这么写吗?
把你会的东西尽可能多的去罗列清楚。😡,哎,咋没反应啊,应验生能不能那么写?😡,可以吧?这些服都不会啥不会。😊,ピ?你不会,你要学呢,你说老师我连设计模式都不会,那怎么办?你不学怎么办?😡,你得学呀。😡。
你老师,我现在号论都写不出来,我要投这的简历了,你不扯了吗?😡,你肯定是要有最基础的技技术储备的啊。你不能说老师我一点技术储备都没有,你让我去写,我写不了。😡,我写不了。好吧,设计模式是单列一行。
如果你设计模式想单列一行的话,你就要准备好面试官考你设计模式的能力了。比如说你项目里面用过哪些设计模式,有哪些应用需求,你要这样写。😡,听白了吗?第一句话就是个废话,好吧,其实没啥用,就这块意写东西啊。
想让他问问啥,问问rease的原码啦,哈y map的原码了,问问这点东西。😊,好,让他问这个东西的OK。😊,然后紧跟呢,你的账号SE学完之后还要学啥?😊,他是什么东西?框架不要这样,还有一个很重要的。
在ja在javaSE里面包含了很多东西。比如JVM和并发编程这样的东西你需要单独写的JVM和并发编程的技术,你是必须要好好去学的。比如说变化编程怎么写?好吧,还是这句话,精通。😊,或者熟悉。啥玩意儿?
java。并发编程对吧?对java的各种锁机制。现城池机制AQS。等都有深入理解。如果有工作经验的同学好吧,可以写什么并在项目中。熟练使用。如果没有工作经验同学,后面这句话就不要有了。好吧。
那这个同学有人说老师,我我对于这个所机制现成制机制AKS不了解怎么办?不了解,能不能写什么CAS你会吗?😊,所logo你会吗?这会吗?哇,GMS你会吗?😡,你挑选你会的东西吗?你挑选你会的东西。
你往上写嘛,这块东西是什么?是你自己的对于自己技术细节的一个把控。😡,没听过不行。就这块凸显是什么?是对于你自己的技术细节上面的把控,你要给面试官有这样的感受和感知。就是说我最起码说我具备这样的能力。
这东西是你必须要去凸显的。如果这块东西你凸显不出来,那么就很麻烦,懂我意思吗?😡,你看你们问的这个问题,AQS是啥?来,你讲到这个东西,我要给你讲讲,你这逼着我给你讲东西。😊,只知道拍照看。😊。
我告诉你啊,如果你对于并方编程没有基础认知的话,并方编程里面包含什么样的技术点,就这些技术细节啊,你是要有所知道的。😡,你得逼着我给你上大纲,完上看啊,我给你看V下面装上什么东西。
比如说操作系统并发支持内存模型阻塞队列线程池并发集合CAS和原子操作,sloc gUCGH disrupt像这些东西你要选择其中的一些点往里边进行添加。你要老师我这个东西我一点都不会。
或者说这些东西老师我都没听过,那就不要写了。😊,但是我坦白说一句话,同学们一定记住了,像这些东西,它就是在兵发编程里面,你必须要掌握的东西。比如说你说老师我不懂很很多别的东西,你可以写什么?
你懂不懂偏向素。可重入锁像这样东西能不能写一下?比如说你对锁升级是不是理解?明白吗?对,我了太养都能写。😡,懂意思吧?synchize mono这些东西能不能写?就是你要去凸显你所掌握的技术细节上的点。
你不用说老师,我技术细节不懂,我这个东西一点都不清楚,我咋写,那你肯定写不了吧。😡,就是把你现在会的已经掌握的技能能尽可能多的陈述给面试官看,懂我意思吗?李老师,我这都不会我,你不会,我还能说啥?😡。
这你不管他说啥,你既然想做张娃的工作,那就意味着你一定是有最基础的技术储备的。那么对于面试过程中要掌握的这些必备的简单的核心技能,你要有一个最基础的认知和了解。你说你这些东都不了解,我怎么办?😡。
对不对?大罗金线来了都救不了你好不好?😡,来,第3个,这是我们讲我们说的平方变程要想用的东西。除了平方变成之外,还有什么K边M吧,这MM怎么写啊?😊,怎么写?还有我要我要复制一下。京东熟悉什么?
JVM是吧,对JC。算法和各种垃圾回收器。有深入。了解,然后呢,熟悉。这边我调有。有实战。经验。对不对?我问一下这块写完之后有什么意义啊?干什么作用啊?作用在于什么?同学们记住了。
作用在于我要引导面试官去问我这C的算法和垃圾回收器。同时我已经埋上肥伏笔了。基本上在这块我写到JVM调优的时候,我就要求面试官必须要问我GVM调优点,我没实战经验,我能不能提前做准备。
你不能说老师我要面试了,我啥都不准备,能不能准备几个案例?😡,写吧,写了一个写了一写了一问一个死。这就是你们大部分人的认识认知,就是写了一问一个死。这就是区别,这就是为什么别人去面试的时候。
简历投出去之后有回应,而你投出去简历之后没回应。因为你觉得这东西我不敢写,我问了之后,一问你写了之后一问一个死,所以我不敢写,你不写,不代表别人不写啊,同学们。😡,就举个例子,你没写别人写了。
你告诉我你有什么优势。😡,别人凭什么让你去面试?包括之前有个同学给我单独发过一句话,我给你看看啊,就是他这这他的认知,就这东西啊我也不想去扭转大家认知。但是我希望能改变一下大家的想法。
这之前一个同学我讲简历课的时候,下课之后单独发给我的,发了一段很长这样的描述。他说听完我就讲简历课时,他给了这样的描述。他说可能我们投的不是同样的面同样的面试,不是一样找工作。我的经验给的建议就是没错。
简历确实可以随便写,但是绝对不是按照这里说的这么轻松的。你。😊,你80分可以写100分,然后你会遭受挫折,但是不是那么容易补的。说实话,尤其是大厂人家面试的人几个问题就能问到你几斤几两。
面知识面怎么样多多深。没错,比如今天你问了四后台友,你可以说临时报会的准备,下次再问,你以为回答上来了。实际情况是面试官会再问下一个问题。为什么要这样又又积极了。其实这种简历的写法,所谓写的水平高一点。
其实就是需要那么多能力才能经得住面试的考验,要摸到应届生申请太容易了。这大家大部分的认知,我觉得有很多同学也是支持这样的观点的,但是我想说的是什么?同学们,你在面试之前,你不能抱着一个心态。
说我面试一家,我就成一家。😊,这有问题的,你面试的时候,你报的心态应该是什么样子的?😡,什么样子?我不管这家面试,我能不能过,但最起码我要先把这个机会要先拿到手,明白吗?当你的机会都没有拿到手的时候。
你就在想面试的时候,如果面试官难为我怎么办?如果面试官羞辱我怎么办?如果面试我面试官鄙视我怎么办?如果你在面试间,你就这样现在去写,那很简单。那大家写的这些东西。
就是你们刚刚我给你们展示的简历描述里面的东西。那就是正常的技术官也好,HR也好,我看到这样的描述,我就不会让你来面试。😡,这就是行情,这不是我决定的,这就是市场决定就就这样的。就像你们刚刚写的一些东西。
两份东西拿到一块,你自己做做一个对比。你们来说哪个会会要哪个不要哪个。😡,很简单一东西,我们还是拿刚刚那个举例举来给大家举例子吧。😡,我找一下。

有一个。拿这个拿出来。

这东西多少钱?三年工作经验。还有没三年的,我看看。哎,不是这个。然,这也是三年的。这三0斤啊,这个是果果的。同学们你们自己来评判,如果两份简历,两份简历的技能描述都是这样的。然后你看到简历之后。
这两份简历,你告诉我你会要哪个。😡,你会要哪个,你你来告诉我,他们俩同时同一同家岗位。你看到这简历之后,你会让谁让谁来面试?😡,我觉得大家大部分人都会让上面人来面试吧。大部分都会这样的。那有人会说。
老师,我写的这个CAS写这个AQS之后,他不让他面试中妈妈崩垮怎么办?😊,问垮了,你是不是也有面试机会了,你写成这样,他没面试机会怎么办?你告诉我。😡,小孩才都选择两个都来面。
你问问HR是不是会让所有头简历人都来面试?😡,别的企业不会浪费这个时间的。😡,所以我希望大家先把这种错误认知啊能给能改掉,能改掉。你不要尊重老师我不敢写,我就就就就怎么样了,你活该没面试机会。😡。
对呀成光说的很好嘛,垮了就垮了呗,没啥损失。继续下一下。这次面试的时候,你做好总结,做好录音,做好复盘,对不对?下次再面到同样问题的时候,我保证自己不出错,这不就是一个成长的过程吗?😡,是不这意思?
好吧,所以要掌握这些东西。OK。好来,下面写完了。第4个。😊,核心东西写完了,还要写什么?该写框架了吧,是在框架快框架怎么写啊?😊,一样的精通熟悉。Spring。spring MVC买 bags对吧?
spring boatat。等。核心。框架多年。实战经验可以。根据需求快速。搭建。像目看过。框架的。核心编码。可以这么写吗?好,同学们可以这么写吗?可以吧,这里面重点是啥?😡,这玩意吧。阅读过原码吗?
没实战间把它删掉行不行?😡,没时在就能把它删掉。😡,能能行吗?阿生。你不敢写,你适量去斟酌嘛,你适量去做筛减嘛,是不是道理?😡,好吧。去的。只看我一个块钱部分页码可以写吗?那你就写看过spring。😡。
到。IOC实现原理的资行源码,或者看过。thringbo自动。装配的核心源码。行不行?能那么写吗?你给他提示。😡,让他去问你这些东西挖坑嘛。😡,别人问别的东西,来,你给我讲一下循环依赖的实间过程。
不好意思面试主播,这块我还没看到啊,我暂时就看了这两个东西。😡,可不可以?最起码说你简历里面凸显你具备这方面的能力嘛,最起码说我看过对不对?你别上来之后,我连看都没看过,对不对?是不是道理?😡。
这个描述方式你可以多换嘛,你想怎么换怎么换嘛,对不对?😡,来,听到线在能听懂的朋学给我扣一能听懂吗?😊,能听懂吗?这张能写的方式吧。😡,好吧,来第五个这些什么?😊,框架写完了之后。
同学们写微服务和分布式。刚刚有人说老师为什么不写算不写那数据库,数据库啊跟中间件这些东西啊放到一起好,他们统一其实应该算是中间件范畴的好,所以把它统一放到一起,那会儿写微服务怎么写?😊,京东熟悉什么。
Sring卡好的。sring cloud阿里巴巴。这你自己写好吧,然后呢。对,各种。组建有深入理解。对分布式的。什么服务划分。服务治理。服务分层。等有深入理解并。预备。线上。项目和线上。项目经验。
可以这么写吗?对你可以把大大bo加上。如果你实在想凑字数,就把组件这儿分别罗列出来。什么nco斯。对吧什么seno。对吧这些东西你把昨片写上来吧,挨个写嘛。😊,是不可以这么写?好吧,第六个还有啥?
这时候你可以写写写朋友们卢可会吧,那能写吗?😊,京东书记。有K方。一层院里。我实现机制是吧,了解。他是不是。人B。算法对。C要深入。理解对吧?包括里面要写的什么选举机制。对不对?你可以写嘛?
都可以详细写啊。玩这句话,你会哪些技术细节,你就写哪些技术细节,你不会哪些技术,你就不写哪些技术细节,好不好?OK来第七个还有啥。😊,书这边写完了,mycyclcle,你的熟悉。😊,Mycyclcle。
我这样这样写吧,京东书机ciqcle语言及。mycyclcle优化对mycyclcle的事务所。所以。存储引擎等都有深入。研究并参与过。线上的调优。工作。可以这么写吗?对吧这里面你可以加什么?
有人老师我对分工分表。😡,还有了解可以,你可以加吗?对不对?你想怎么写怎么写嘛,尽可能过去描述你的技能吗。对不对?再比如说re least是。京东。书记readies好吧,了解底层。你说。磁盘及磁盘。
姐,哎呦。模型数据19。挂鸡翅。对吧对于。reads的单机和集群模式都有。深入理解。听这不清吗?对不对?第9个。还有啥可以写的?什么ra这块,什么储存复制啊这类东西都可以写。好吧,你自己去编好现卡不卡。
😊,卡不卡。要什么看过。核心原码对底层。刷盘。机制集群。分片机制。有深入。了解。对吧病。对,是。消息。不丢失盒消息。消息丢失。和消息。重复。有对应的线上。解决方案。听东写吗?能懂我意思吧?
我现在已经写9个点了吗?😡,后面还可以写写写别的吗?同学们。有文老师,我人节变声,我算法数据结构怎么写?如果你想写算法和数据结构的话,马上写。😡,算2数9怎么写?嗯。熟悉监通熟悉。各种。
数据结构对线性表。树图等。都有。深入理解,并在离后的。挺。500提。到。储备。可以这写吗?能懂我意思吗?下面你还可以写什么东西,可写东西太多了。同学们,比如说刚才提到TES怎不写?
对吧你可以把刚才ATDB。HTDPS网络。能不能写一下?对吧对于你的。操作系统。哎呦。能不能写一下?N,这个是。LVS。你们写一下,包括这块可以写。撸啊。明白吗?对吧是在老写多ker。K8S。怎不写。
还能解答。还的理解吗?那我地边能写吗?对不对?你们既然说老师我没有什么技术可以写的这可写的技术太多了。可以就太多了,听白了吗?所以你要把你自己掌握的技术站尽可能多的去展示给面试官。就这样的东西。
写完之后,面试官看到之后,他的感受是什么样子的?能懂我意思吗?就是为什么我希望大家能听完这节课,你能得到一个反思是什么?就为什么你投完简历之后,面试官不让你去面试。😡。


懂那个意思吗?就为什么别人不让别人不让你去面试?😡,这我希望你了解的。😡,啊,当然啊这些技术在进行描述的时候,你要有对应的技术储备。你不要说老师,你说这东西啊,我都不会,我怎么办?你不会。
你只能学技术了。😡,明白吗?你不会,你只能学学学学技术了。你不能说老师,我现在啥机会都不会,你能不能告诉我一种写法,让我有面试机会。😡,如果你自己真的啥也不会,你就也这么写,面试的时候怎么被被虐。
面试等的都有备剧。行吧?调整好这个心态哦,就我就我刚刚说这句话,可能一定记住为什么别人有面试机会,你没有我希望大家能找准差距。不管你面试啊能不能过,最起码说你先具备了自己的,就最起码你先有面试机会。
听白了吗?你连面试机会都没有,这很尴尬。好嘛。来,讲如现在能理解的同学给老我扣个一,能理解吗?😊,我给你看一个之前我们一个同学写的东西吧。这是之前一个同学写的东西,你们可以自己看一下。他写的东西怎么样?
你们没事,你们截图好吧,你截图你也不敢写,我还不知道你们。😡,这是一个同学写的写的写的简历,他的面试机会是很多的,他下面也写这些废话,什么power designer。
什么gate main gate这东西他也写了,但是只是在下面有了,你上面还是这些关键的核心技能。😊,懂意思吧?好吧。项目中应用应该怎么说?还是那句话,你现在储备的技术量这些技术点。
不一定说每一个在项目中都有实际的应用环境。你就告诉他,这是我在额外的私下时间,自己储备的技术站和技术体系不就完了吗?不可能说你不可能说你你问的所有东西都是都是要自己都都都是要用在项目中运用的,这不可能。
嗯。行了。来进量这块听明白同学给我扣个一,听懂了吗?😊。

。
系列 6:P133:项目经验该怎么写? - 马士兵学堂 - BV1RY4y1Q7DL
好了,听到之后来,我们聊第3块。项目。下午怎么写啊?这个同学们项目在凸显的时候要凸显的是什么?两个东西。第一个。项目价值。第二个个人价值。这样东西我希望你能够凸显清楚什么叫项目价值?
项目在描项目在描述的时候,我们一般要求同学们好吧,你要具备三个模块,最起码三个模块,哪三个模块。第一个小模块。叫什么叫项目描述。项名称。第二个项目描述。第3个。技术架构。第4个。
职则描述有可能的话加一个项目难点。嗯。类似这样东写好吧,这张写子怎么写?第一个项目名称在写的时候,同学们一定要。😊,偏十。平安生产。环境什么叫偏生产环境?很多人写了一个。办公自动化系统。
并不是说你不能写OA,你可以写OA没问题,但你最起码加上一个什么什么OA系统吧。😡,把你写的CRM也行,你写一个什么什么CRM系统吧,是不是道理?你给他把这个名字补全了,它是一个真实的项目履历。
而不是像你们写的什么博客管理系统,对吧?后台管理系统不要写这东西好,有可能的话更多写一个什么,不要用系统和项目这样的描述,更多用什么?😡,比如说叉莎办公自动化平台。用平台这样的描述。明白吗?好吧。
这个没啥说的。第二个向描述写什么?向描述记录三四行。文字描述即可。切记。什么大段文字堆积。好吧,要凸显出重点。什么叫凸显出重点?凸显重点是什么样子的,指的是你的项目。有什么?核心价值是吧,以及项目。
解决了。什么。问题这个核心价值计划怎么说?比如说我像像C价值怎么写,比如说这里面在写的时候,你可以带上具体的。😡,数据量这数据量不单单是说你数据库里面数据量,比如说你的日活,你的PV,你的UV。
像这样都是可以带的。项目解决了什么问题,你可以写什么?😡,提供了。什么行业的哪些具体的解决方案有多少?人货有多少?企业或个人。在使用。项目类似这样的东西,你要这样去写。听白意思吧?三四行足矣了。
然后如果你实在没啥写的话,可以适当。😡,将什么业务。模块,但是不要。全部是业务模块。明白明白意思吧。好,这块大家定要注意。OK然后架构这块怎么样?单纯。罗列技术。名词。
即可好多同学啊很很很很很很很体谅面试官什么呃开发工具有哪些?然后呢,开发框架有哪些数据库用哪个?然后呢,服务器用哪个,哪个地方写的很详细,没必要,就单独单独只是单纯的努列技术站就可以了。好吧。
能列多少列多少,尽可多多多罗列完事,好吧,然后下一个是你的职责描述,职责描述一定。😊,要分条展示,同时要虚实结合。这块儿至少。要写5条以上。好,什么叫虚实结合?所谓的虚是什么东西?😡,需求分析。
对吧什么数据库建模。对吧什么带包re。这样东写什么叫十?实际。的业务开发点。没意思吧?一定要先把这东西都都补全了,至少5条以上要凸显出什么,重点是什么东西?凸显。😡,在项目中。的核心价值。
OK项目难点是什么?😡,难点。一般项目是没有难点的。这个认可吧?嗯。很多人在外包,在国企。做一些CRB项目,对吧?基本上没有什么外包,那基本上没有什么难点。牛在什么?编造难点难点从哪些点可以编造?
第一个。香油。第二个。重构。第3个。代构设计。从这三个维度去改变它。去准备它这块大家一定记住啊,老师,我我们项目中实际上没有遇到5点的点,我怎么跟项目中套呢?😡,记住一句话,同学们记住一句话。
你自己的项目。很多细节点。自己都不清楚。面试官不可能对你的项目细节。有足够的了解和认知。所以。大胆。吹牛逼就行了。听你就行了,听白意思吗?如果面试官。提出了质疑。怎么办?就是什么。先认可他说的是对的。
同时。反思自己没有考虑这么多下去之后跟公司领导。反馈一下。能懂我这意思了吗?我能看到你的问题啊,一会儿我先我先讲完,讲完再回答你们问题好不好?行吗行?朋学们。😊,能懂我意思了吗?
面试面试官问的一个解决方案,你说这样解决方案,他说不对啊,你们解决方案也不应该这样啊,这样解决不了问题啊,你就直接告诉他,大胆并且笃定的告诉他。面试官,我们当时项目确实是这么考虑的。像您刚刚说那一个点。
我们当时没有考虑到,他可能会存在这方面的问题。好吧,下来之后我给我们的领导再重新反思一下,反回回顾一下,我们把这个问题解决掉。😡,懂我意思吗?关键在于你自己的表述和表达的方式懂我意思了吗?朋学们。好吧。
所以这里面每一个模块我希望你能够重点把它给说清楚。这样的话面试官的感受和感知是完全不一样的。该分块的分块,该分条的分条,该详细写的去详细写。懂我这意思吧?来,我给你们看一个案例,好吧。
这个同学写的s斯名单。我接别截别人简辑的图啊,你看别人写的怎么样,你们自己看胡干这个这个这个这个描述,他很清楚。第一个告诉你,这是一个s平台。第二个实际上多租户的东西好吧?第二个,我们集成哪些功能模块。
第三个私人定制的移动化办公平台。好,简单的告诉你,我项目中用到哪些技术站。第三个告诉你责任描述里面,我用什么东西,需求分析什么之类的,制前平行任务什么之类的,这样写写完之后告诉你。
我用哪些具体的细节点解决什么问题。😊,很清楚很清晰,别人知道了你在项目里面承担什么样的职责。能懂我这意思吗?来项目怎么写,了解朋友给我扣个一,能理解吗?😊,能不能理解?嗯。你要多去展示展示展示,别老虚。
你们的问题就是动不动就是老师我不敢写,动不动就是老师我我怎么怎么样,你能怎么样,你会怎么样,你会你你能怎么着。😡,不会的不会的。然后刚刚那个那个PC还在吗?AP现在吗?不在了。在是吧。
刚刚是你你叫啥来着?是这个吗?对。你这边有飞哥,可这电商业务。这个啊应该是一个非常非常大型的一个项目。对于你个人而言,你不需要写很多项目了。其实你只需要把这一个项目能写的非常完善就够了。我告诉你。
其实你这写的没啥问题啊。如果你想优化的话,我给你看一个也之前的一个学生,他写的一个简历,就他写的东西,我坦白说,我也写不出来啊,我也不一定能写得出来,我给你找一下。😡,哪儿去了哪儿去了啊。😔。
你找一下啊。哎这个。这是一个学生,他写的这个他他他现在啊呃薪资应该提大大几十万。他简历里面他有很多员工工作经验了,简历里面就写了一个项目,就一个多余的一个都没有,就写一个项目。他的技术描述也是这么写的。
你可以看一下。😊,当每两把刷子同学别这么写,好吧,每两把刷子别这么写,你会把自己坑死的。好吧,这些同学写的项目,你可以看一下技术描述使用什么东西,解决了什么样的问题,基于什么东西完成了什么功能。
采用什么东西解决了什么样的问题,用什么东西解决什么问题,用什么东西解决什么问题,这是他整个项目里面他写的技术的描述。比如说整个项目里面用到了哪些具体的。😊,细节点业务点它写的很清楚。好吧,重点看什么?
我们看它的职责描述。一般职责描述写不出来的。参与核心模块需求评审、架构规划以设计以及技术选型系统重构,系统优化,攻克系统技技术难题,构建高可用、高性能高并发高扩展的系统架构。第二个。
参与核心模块产品需求评审合理性开发周期开发资源项目项目排期电稿最终产品需求定型。第三个,设计大版本下平台整体架构方案,跨部门流程协作沟通,参与架构团队技术研究,解决复杂需求下系统架构难题。
参与系统重构多维度分析系统问题,解决推行方案,架构改进策略,最终深受力方案。负责。😊,高密发多级缓存架构的设计研发,负责高并发秒杀系统的架构设计研发。参与系统网关集群中间件服务需据填度优化。
然后针对什么什么东西,请进行优化。然后参与什么资源网关的开发,同步中间件的一些研发等一些东西,灰图发布的东西。这个一年30万吧,30万,赶写这样。😡,30秒赶紧这样,你30秒就就就行这样。
那个那个那个那个同学在吗?百变欢城。能能这意思吧?就你可以只写你那一个飞鹤项目,把那个项目构建。😡,成这样的方案。像这样东西。就你写成这样的东西之后,你不需要写太多,真的不需要写太多,写太多,没必要。
就一个项目让他问到死。没关系,我这一项目足以cover,或者说足以展示我自己的任何方面技术点及技技术优势和我的技术深度,只要玩这方面东西就OK了。😡,但是大部分同学啊听好了。
大部分同学你呀就踏踏实实中规中矩的按照这个方式写。听白了吗?OK没头发吧,你管别人有没有头发呢?😡,想管你管这么多干嘛?😡,没他妈有不用又不用不需要你给他吃饭。😡,你管这么多干嘛?
🤧你要考虑的就一件事儿,什么我如何在面试的时候去展示我个人的优势,不就不就行了吗?是不是道理,你还管别人头发的事儿,你管的真宽。都这样我还要啥头发,哎,是这个道理。😊,你知道年薪百万了。
你还关心头发事儿。😡,大了执发吗?是不是这意思啊。😊,所以啊。很多时候不是大家说你会不会写,而是你敢不敢写的事儿。嗯。

这下我写这么多啊。

系列 6:P134:自我评价该怎么写? - 马士兵学堂 - BV1RY4y1Q7DL
来第4个。自我评价。作评价怎么写?作品量同们记住了。个人。不建议分条。展示。写成一个段落即可。展示的是什么?是。行业的经验和技术的背景。🤧可以从什么。业务背景。技术深度。解决方案。等多个维度开始聊。啊。
比如什么做过哪些行业?的项目。提出过什么解决方案,解决了。什么问题接触过。多大数据量的项目。明白意思吗?也可以这样方式来写,我一样给大家看看几个案例吧。那个P7。你可以写这个东西。
这P气啊一年生一会儿我跟你说,一会儿我跟你说怎么写,好吧。😊,百变换城,你可以这么写,多少年开发经验,三年什么样的设计经验,好吧,三年什么样团队管理经验具备什么样的研发经验?
目前正负责项目是多少多少多少多少的什么样的一个服务平台架构研发。然后呢,拥有什么样的技术功底,对什么东西有深入研究。😊,别这么想。明白意思吧?还是这句话凸显你的深度和优势。
OK当然有些人啊可位老师我没这么强的实力,我就是一个普通能开发,我怎么办?一样的。写这样的方式。多少年开发经验,其中有多少的管理经验和架构设计能力,好吧,然后负责过什么样的业务。
后面可以加上你的这些废话。好,后面可以加你的这些废话,什么虚什么责任心强啦,加班啦、功能力强了,乐观啦什么这些东西,可以加这东西。刘老师,我没有讲设计能力,没关系。写吧。负责过什么核心页面的开发。
做过什么样的重构,做过什么样的编写,这样的方式写。好吧,那有人就会说,老师我现在啊经验非常匮乏,我现在就是个应届毕业生,我现在很low,我怎么办?😊,你怎么写?写什么东西?对于。是。经验不多的同学注意。
此处要说明自己的学习能力。和技术储备能力。怎么办?还是那句话,你现在刚工作一年或者你大学刚毕业,你其实没有太多的一种项目上面的沉淀,或者团队管理方面的沉淀。没有这方面东西,你要凸显什么东西。
凸显你个人的技术实力。什么叫技术实力?比如说。你不要说什么性格太朗,好吧。😡,对。技术有热情。好吧,深入研究过。叉叉叉跳叉。等技术。对。什么技术有深入的理解。好吧,然后告诉别人。呢字扣子。
有多少的储备量?这东西必须要加好吧,对于大学生而言,椰字扣也是必须要加的。😊,明白吗?好吧,包括还要写什么东西,工作经验短,但是凸显你项目中。获得了。哪些成长?自己私下会怎么。学习技术。
看过哪些核心的技术类的书籍?明白吗?自己。看过。哪些?给他哈吧的项目。做过哪些博客?的积累。懂我意思吗?这个可以写吗?看朋友们。可不可以写?没反应啊?你要这些东西,老师我都写不了,你要一个都写不了。😡。
那就完了,那那你就踏踏实实就像原来一样写一下什么热爱及团队啦,责任心强啦,对吧?有耐心啦呃,沟通能力没问题了,你就写这些东西。😊,就大家你记住一件事儿,朋学们,如果现在让你我举个最简单例子啊。
就现在让你真的夸自己,你都夸不出来。😡,你不觉得有点惨了吗?😡,好不你找一个姑娘相亲。明道吗?别人让你去夸自己,你都夸不出来,我就是一群,我就是一群屌丝。Do。不要写虚的东西。
同学们为什么不要写虚的东西,这些东西都是可以被问到的,你懂吗?就是为什么大家不要写虚总西?因为虚总西无法考证,无法考证,意味着这东西可能是假的。而我刚刚罗列的这些东西,它是可以去问的,明白吗?
比如说你看过词种原版的书,看过mes性能mecyclco,这些书我是可以去问的。面试官如果有这样的储备的话,我是可以检测你的学习水平的。😡,你没有经验怎么办?你不就展示你的学习能力吗?就展示两个东西。
学习能力、技础储备能力。还有一个点叫成长性。就虽然我现在很菜,但是我的成长空间无限,懂这意思吗?😡,你别我又我又菜,我又不上进。😡,你这就麻烦了吗?你要给别人展示这些东西,就是。😡。
问问不知不知知不知道咋不知道咋说了,好吧,反正这意思你们你们能能理解吧?就你一定要去学会夸自己,你知白吗?你你说你连自己都夸不出来不是很尴尬。😡,你一定要能一定要能。好吧,一定要能。
如果你自己夸不出来自己,说明你有问题。😊,Yeah了。今天我我我我结婚了啊,但我如果出去相亲,我肯定不会告诉别人,我200斤。😊,我肯定告诉别人好吧?我我我讲的有多好,我技术多牛逼,我心思有多高。
我肯定告诉别人这东西,我不会说我是100斤胖子。😊,Yeah。能懂我意思吧?就是就是你你你学会避重就轻,好吧,学会你的这个。😊,侧重点。啊,就是有有有。自己优势的地方重点突出重点自己优势的地方。
不要不要不要不要说嘛,避重轻嘛。我记得我之前讲过一节课,关于就专业专门管这讲这个简历的。我当时总结了总结了很多这个。相关的点啊。简历课你要学什么?第一个不要害怕写简历,不要草率点也,不要粗心,不要敷衍。
要学会埋陷阱,扬长处,避短处夸优势,对吧?每个地方你应该怎么去写写什么样的东西,要怎么样的方式去注意。其实我讲过很多这方面内容,这东底是你要好好去弄的。😊,啊。这我的相亲一样吗,我说这东你们不理解。
举些通俗生活中的例子,你就你就能理解了。啊,一定记住啊,朋友们保住好一个心态,什么心态?简历是你的敲门砖。嗯。任何人都要。包装的。好吧,因为每个就像星期跟本你跟你女朋友出去约会一样,你约会的时候。
你是不是要洗洗头理理发,收拾下自己穿一身干净衣服。是不这意思?好吧。

当然啊就刚刚伯约说这句话,我觉得特别好。嗯。😊。

这句话我就说到每个人的重点上去了。他说简历写的好,只是获得面试权,主要是面试有货。这就是很重要一点,就是什么?就是你在写简历的时候啊,你在写简历的时候,不要考虑说太多说我能不能做这件事情没意义。
因为你既然已经准备准备找工作,说明你就你准备已经跳槽了,说明你的技术储备没问题了。如果你的技术储备有问题的情况下,再再再再说一句话吧。在现在。如果技术储备有问题的情况下。不要想着碰碰运气去找工作。
原来可能。有机会现在。百分百没戏。听不了吗?朋友们。你看面试能过,害怕拧到螺丝,你先把面试过了再说能不能拧螺丝。明白吗?就你别技术储备,还有问题的时候,你说老师我去试试吧,万一我过了呢?😡。
天上有个馅饼,正好砸你头上,凭什么呀?😡,嗯。用那个张雪峰老师的话,怎么着,你家祖坟着了,冒心烟了,不可能。不可能。

好吧,所以就是踏踏实实的储备你的技术是吧。
系列 6:P135:找工作的心态该是什么样的? - 马士兵学堂 - BV1RY4y1Q7DL
还有一件事,同学们很多同学啊有了面试机会之后,他会有一个东西叫虚。有多少人是比较虚的,给老师扣个一。就面试时候比较虚的。我给大家扭转一个心态,记好我这句话,这也是我之前上课的时候经常跟我们同学说的。
我找一下,我之前讲。将个手给大家总结了一个东西。嗯,找一下啊。当时面试总总结了几句话,可能我希望你能听好。这是我当时在讲面试突击班的时候,给大家总觉得我希望所有人能引以为戒吧,我把这东西。

站出来,大家写一下。

就找工作时候的心态。

Yeah。Yeah。一说一句话。第一个,面试之前一定要调整好心态,不管你会多少东西,干就完了。面试的时候出去就一个心态,老子天下第一。

因为当你出去准备去面试的时候,那个时候你说老师我再看点技术吧,我再学点别的东西吧。那个时候已经于事无补了。所以你再说这些东西它是没有意义的,它是没有意义的。听到了吗?所以心态就是一句话,老子天下第一啊。
不管面试官多牛逼,我就是天下第一啊,不服咱们打一架,懂意思吗?还有一件心态是什么?得失心不要太重,很多同学去很多同学去呃找工作的时候,就会想老师我这家面试过不了怎么办?我觉得过不了是正常的。如果过了。
反而不正常。你要抱着这种心态,所以就是什么意思?得失心不要太重,全中国企业很多,好公司也很多,没必要在一棵树上吊死,你可以有心心的公司聊到最后,等你准备充分再去。😊。





好吧,再一个找工作永远不可能准备好,很多同学怂心态不好,才不敢出去面试。我要准备先按照你的技术储备尝试一些公司。好吧,心态就是我是来试水的,面试回来之后做好总结,做好复盘,不断这样才能才能去成长。


好吧,第四个希望大家保持好相我们的消息互通,乐于分享,可以跟我们的VIP说了。😊。

好吧。这个FLMY12同学说技术数平有问题,感觉跟您讲的夸大夸。

系列 6:P136:最根本的核心点—打铁还需自身硬 - 马士兵学堂 - BV1RY4y1Q7DL
那一些简历有有些矛盾,这就是我说的,你找工作的时候,你的心态是什么样子的?就如果你找工作的时候,你就本着一个目标说,我面试了,我就一定要过。那你就不要这样写。听白了,同学们,就如果你要记住一件事儿。
如果说你现在报的现在就是我面试一下工作,我一定要去过,那你就不要像我这样写简历。因为你像我这样写简历的话,你基本上过不了的。😡,为什么很少有同学能进行这样技术的cover?
但是你现在又发现一件神奇的事情,如果我不这么写,我几乎连面试机会都没有。😡,他现在就是一个很矛盾的点,你怎么办呢?😡,你咋办?你说怎么办?有啥好办?有的有啥有啥好办法吗?没办法,所以归根到底,同学们。
你的简历写的再牛逼,你的简历再优化,你的简历再包装。最根本的核心点是什么?啥玩意儿?继续。技术。就刚才说的一句话,我觉得很好。打铁。还需自生音。当然我现在给大家讲这些东西啊,讲这个简历课的意义是什么?
是希望同学们你们能获取到一定的面试机会。就算你现在不准备去面试,最起码说当你投递简历的时候,不管你的技术多烂,最起码说你能感受到,就是你能去体验一把面试的感觉。而不至于说我现在连面试的感觉都体会不到。
我连面试的机会我都获取不到。明白吗?因为你没有可备不就这样吗?😡,我连面试机会都没有,我不敢写,我就按我实际的情况去写。按照你实际的情况去写,你就什么面试机会。😡,我举一个例子啊,朋学们就是。
我不夸张的说啊,我毫不夸张的说,就举一个最简单的例子,现在很多人都在找工作。对吧我不拿你们跟外面的这些学生去比啊,我就拿你们跟马诗斌教育的VIP去比。每一个马诗斌教育的VIP同学老师都要去帮他改简历。
表完简历之后,基本上都要变成这个样子,或者说类似于这样的形态,但不可能一模一样啊,大概都要去以这样的方式去搞。就是你们的简历跟我们的VIP去比的话,你觉得你的优势在什么地方?就单纯我们我们不说技术啊。
就单纯指数面试机会上来说。😡,你觉得你有优势吗?😡,其实都没有。所以我想说的是什么?同学们,不管你跟着我们学不跟着我们学没关系,好吧,但是我希望做的事情是什么?是你一定一定要怎么样?
先去外面感受一下面试,先去外面有一个面试机会,让你知道我自己到底有多差,或者说要知道我自己到底差在哪儿呢。😡,而不至于说你现在处于一个什么阶段。😡,我知道我很差,但我不知道差在什么地方。
我也不知道面试官问什么,反正我想去面试,别人也没不给我机会,我没招了。😡,你们现在是不是很能处于这个状态?我想面试,我想看看自己的差距,但是我又没面试机会。😡,有多少人这样状态给话扣个一。😡。
就是我现在想学,我都不知道我要学什么东西,因为我不知道前面是什么。😡,我也不知道我的技术短板技术短板在什么地方,我没得补。😡,是不是道理?所以我还是那句话,我呢讲这节课不是说你一定要报名VIP课。
更多是什么?我希望你们说你能有机会更好的去。怎么说就是获取到一些机会,最起码说知道我差在什么地方,要不其说洗脑成功。行吧,你说我洗澡就洗澡吧,我去上麦克了,好吧,你怎么着?😊,洗脑成功。
你可以认为人洗脑,我这个不给你犟,你觉得我是洗脑就洗脑吧。没关系,好吧,每个人有每个人的认知和见解,对吧?但我说的这句话啊,你们可以真正的真真思考一下,我说的是不是事实。😊。
但老师应届生有个笔试关卡过不去怎么办?这个其实也非常简单,把你的算法把你的基础实力重严扎实了就可以了。就可以了。好吧,在家把这下单,你爱买不买,你爱买不买,啊在家买这就下单,你爱买不买,好吧。😊。
只能跟我求着你买客一样,还爱买不买,别买啊,千万别买。😊,啊我求着你学习。我疯了。我只是给你讲清楚现在的情况是什么样子,好吧,你要不要学,取决于你自己。懂吗?啊好,我求我求着你了。没那样好吧。
离职原因怎么说比较好,这个很好说啊,就就是。来,有多少同学不清楚一个人怎么说的,给老师扣个一来,我教教你们。😡,其实啊你们现在很多人离职原因啊,为什么想离职?其实非常简单,要不然钱不满意,对吧?
原要不然就是呃很简单。第一个觉得你的领导太。😊,太二了,对吧?要不然觉得工资低,对吧?要不然跟同事相处不来,要不然加班严重,就这几个点吗?对吧?你描述的可以换一种方式,怎么说,你比如说。😡,直接告诉他。
你说在现在的公司里面,在之前的公司里面,好吧,已经获得了足够的成长和技能和经验。好吧,但是能够希望自己能够干什么事,能够扩展自己的知识面,能够希望自己能够进行进行一些更加深入的学习和成长。
而不是在原地踏步。😊,明白意思吗?好,或者你告诉他,你就是说这样,你说其实我在研公司里面待了很长时间了,我已经具备了这个行业和这个岗位相关的一些呃经验积累了,包括能力相关的东西。
希望呢有一个机会可以迈向更高的一些台阶,能学习更多的知识,能获取更高的一些发展,对吧?然后或者再说我比较侧重于公司的平台发展。我发现我自己自现在的平台,已经怎么说,我每天在做一些重复性的工作。
基本上已经到达了我发挥价值的一些瓶颈了。所以希望能到一些更大的平台里面啊,凸显一些更好的个人价值。😊,对不对?或者说我之前做的工作都是一些低效重复的工作。
我希望能有一些更加高效、更加可以提升的点就行了吗?😊,一句话不说上家公司坏话,但是基本上说都是什么?我要自己获得更好的成长,或者我希望能有自己更好的一些进步,保证你的什么上进心和成长性。还是那句话。
保证你的上进心和你的成长性。明白了?被裁了被裁了,你还能怎么说,找个理由吗?就刚拿拿刚刚那些理由去说嘛?😡,是不是道理?好吧,老师,我是个大四应届生,学生有疑问。😊,看下这个啊就是现在技术站不够完善。
加上现在外包公司实习,学不到重要的东西。我是继续积累实习经验,还是停下来回去,要继续深造好纠结。如果你在外包里面实习的时候,没有实际开发项目的,这这这这这这个就没有实际开发项目机的机机会。
就别在里面待着了,它没意义。😊,就实际这件事啊说过很多次了,如果你能获得成长和进步,你就待着。如果你获得不了成长进步,就踏踏实实学学技术,别在外包公司里面耗着,耗着是没意义的。好吧。
我就是目前公司待了4年多了,面试逼问的机会是你在这家公司时间挺长了,是什么原因让你再看别的机会,就告诉他,我在这家公司从事到现在4年时间了,我这边这家公司获得了很多的成长。
但是正常时间我也给公司做出很多突出贡献。但我不希望我自己能够一直这么下去。因为我希望能获得更高的一些成长和发展。但公司现有的平台啊,每天都在做一些重复的工作,还不太利于我个人的发展和职业规划啊。
所以没办法,我只能选择离职。😊,离职原因都说不出来,我的天哪。😡,上无言,上进心和成长性。上进心和成长性这俩东西。好吧。没梦的日子,我现在离职一年了,中途在家有事情没干啥过工作,现在出去找工作的话。
面试官问这前公司,比如说工资流水是保质就易被掉怎么办?告诉他,这些领导拉你去创业了,但是创业失败了,所以回来了。😊,好吧。我这这话秋招帮找不到好工作,有机会去C安实岗,要不要转,不建议红转不建议。😊。
🤧Yeah。你还有什么想问的?对于你还有想什么想问的这个问题,好吧,非常简单,问的是什么?跟面试官聊的时候不要问钱,跟HR问钱问福利,跟面试官聊什么,聊公司的技术体系什么样子的,公司技术站什么样子的。
公司的解决方案是什么样子的。你可以这么说,之前来咱们公司面试之前,了解到咱们公司是做金融行业解决方案的,你能帮我说一下咱们公司主要做的方向是哪些吗?主要做金融哪些产品吗?
对吧比如问咱们公司有哪些内部晋升的计划吗?比如咱们公司呃有什么内部分享会吗?有什么技术培问那个那个技术分享会吗?😊,围绕技术去聊,围绕你的成长性来聊。😡,好吧。记住啊,切记一件事儿,同学们切记一件事。
千万不要傻话乎乎的问你问面试官,面试官我过了吗?不要问这样的问题,好不好?😡,你们这样等于。打自己好吧。简历只写三四个项目的话,最开始项目是简要写还是直接不写不写。😊,工作十年了,很老的项目不写了。
干脆不写好吧,干脆不写。😊,你写的简历里面的每一句话,每一个字是为了展示自己的优势啊和能力,而不是为了凑字数,也不是为了梳理你的工作经验,听懂了吗?同学们。😡,你做了20个项目,每个项目都写,你疯了。
😡,你写多少页?😡,我说了,简历没有实际个数的限制,好吧,而在于什么?你能不能凸显你的价值和能力,你能一个项目能凸显,你写一个项目都行。从来没有人告诉我说,我简历里面一定要写三个5个项目,没有这样的。
只能有些同学简历比较简单,或者项目里项目比较简单,那没办法,所以只能写三四个。😡,懂了吧?可以让面试官评价本次面试吗?不可以。😡,不可以。34月和90月份有什么区别?什么时候涨?😡,我问一下朋友们。
就是你们觉得找工作一定要在34月份和90月份找工作吗?😡,觉得必须要在34月和90月找工作的扣1。没必要的扣2。😡,当然很多人啊有一个错误认知啊,什么错误认知呢?都觉得。就是。
都觉得说什么都觉得说老师三金三银四,金九银十,面试机会多。你有没有想过一件事儿,面试机会多了。意味着竞争压力也大。你想过这件事吗?就是你的技术储备好了,什么时候跳都可以。你的技术储备不好,我告诉你。
金九银十,金三银四好吧,金啥银啥都没戏。😡,懂吗?不要凑那个热闹。😡,不要同原闹。你们觉得1月份11月份整工作容易吗?同学们。😡,1月份找工作找工作容易吗?😡,啊。何涛老师,那个12月份马上过年了。
1月份是不是找不到工作了,真不是真不是。😡,你真的技术储备好了,真的可以找到工作。同学们,我真不骗你。😡,我哎。给你看好吧,我。哎。就我其实特别不喜欢大家金三银四金五银四的时候,你去扎堆儿。
你扎堆少你你有技术实力,你扎多就扎多了,你技术实力不扎堆的话,你真的很很难。好吧,就是你你啥时候技术准备好了,你啥时候去找工作,谁告诉你找工作必须要34月份90月份啊。😡,没必要,好吧。那你些得。
给你看一下,2022021年1月15号,1月份找工作,没问题没问题。好吧,应届生可能要在你大四下半学找工作,但在职的同学,你什么时候找都行。😡,啊,校招不一样,校招有时间限制。
这个这个这个这个是必须要有时间,这个没办法,对社招而言,啥时候都行。😡,听白吧?所以关键点是什么?你的技术是否储备扎实了?如果你的技术被扎实了,就OK了。😡,好吧,阎阳瓜说咋学呢?😡,我问一下。
洗的更进一步了。还是得看学历和各队刚入行的学历肯定是个很重要的关口啊,但你没学历怎么办?不然还得凭技术吗?我还是那句话,你有技术不可能找不到工作。你没技术,我告诉你,你找不到工作的。哎,赵子龙说的很好。
林老师四边M板天下无敌,不要停,继续说。😊,就是还是那句话啊。😊,就感觉每个地方都不是很扎实,应该怎么补?这里面涉到学习方法的问题啊,同学们来这个刚刚这个蔡先生问了一个问题啊。😊。
有同样困惑的同学跟老师扣个一。有的有这有这共的个扣个一。就这个问题啊的很就是这个问题是大部分同学一直在纠结和难受的一个点。就老师我到底要怎么去学,我感觉我啥都不会,我应该从哪个方向和从哪个维度去补。
这大部分存在一个问题啊,看了马智培教育课程感觉好多啊就是。😊,怎么说呢?我先先给大家看一个东西啊,先给大家看一个东西,每个技术都懂,但都不精通。😊,刚刚我展示一部分这样内容啊,这个东西是啥啊?
是我们规定的一个java的一个路线图。然后呢,这是我们的VIP报名之后,他要学习的技术点。有刚才看过这个内容啊。看过这个内容可给我扣个一,没看过的扣2。😡,就这东西啊我不再详细讲了。
因为我每次公开课我都讲很多遍,我不再详细讲了,就这是你作为一个渣号开发工程师,你可能在现阶段要面试的时候,你必须要储备的技能点,大体上包含这么多块,什么底层基础,比操作系统了,网络IO了对吧?
机组这这些东西,然后变化编程的东西,然后RPC的东西,然后缓存中间件,不设计中间件缓存的,然后分布式的微服务的优化的存储的,然后检索的数据处理的,然后运维的带op的。
包括下面有一些源码的理论设计的算法的对吧?还有架构设计的东西,里面包含内容很多很多很多学之前听我讲无数次。我之前讲的很详细啊,我这次不再详细讲,就这是你作为一个号开发工程师,你必须要学的。
其实你们不可能不知道现在学什么内容,你告诉我你现在面试考考什么。😊,你们告诉我,你现在在面试考什么?😡,我不不现现在我不现大学不出来。
说说不出来微服务分布式中间件数据库缓存GVM并发编程算法源码架构设计云原生是不是这几块?你们所有人都知道我要学这个东西,那这块就是你要处备的内容。这个东西啊,如果没详细看过同学。
可以找咱们咨金老师要一下这个图,要图不花钱,要图不花钱。好吧,如果你加过咨金老师直接找他要,没加过咨询老师的扫码加一个好吧,找能要下这个图,就是我不想给大家讲这里面学习路线时说你到底要学什么内容。
但这个路线里面东西很多,他足以覆盖现在面试上市面招聘的所有内容,对吧?那刚刚同学们说这要学多久,你们觉得这个东西学员要多长时间啊。😡,这东学,你告诉我你这要学学学多久,十年夸张了,好吧。正常情况下。
你要学两年。就只是老的内容,你要学两年,你要学两年。你有必要说,老师我闭关两年,我来把这个东西学完之后再找工作吗?😡,不需要,好吧,咱们这个行业它不它跟古代练武功不一样,不是说你在古墓里面住住了10年。
住完十年之后,你出来之后就成大侠了,不是这样的。😡,是更多是什么?😡,更多是什么东西?更多是说你要把你现在的短板优先给补充起来,然后我先涨薪,涨薪完了之后,我再提升,提升完了再涨薪,一步一步稳着走。
这是最主要的。虽然很多人有一个疑问说,蔡叶说老师感觉每个地方都不是很扎实,应该怎么补?每个地方都不扎实,有没有最不扎实的。😡,有没有?你能不能找到你自己最不扎实的东西?😡,能吗?就是你要记住一个点。
同学们,你现在要补充的不是这些全量的东西,而是你在面试的时候,能不能有几个点是自己能拿得出手的。😡,举个例子,假设电视考这几个点。😡,恢复。公制。中渐见。数据库。缓存。这边路。变外编程。
假设就考这7个点,这7个点里面你能不能选一个选两个,选三个是你能拿出手的东西,能不能?😡,那么。可不可以?比如微服务分布式充间线这三个,我把这三个东西搞了搞搞熟线,搞精通,其他的四个东西我就了解。😡。
一般问题,常规问题能答上来,深重你答不上来。没关系,这三个东西你只要问到我了,我百分之百能给面试官说的很清楚,能做这件事吗?😡,能不能就能能扣一,不能的扣2。😡,就是你在学东西的时候,一定要有侧重点。
同学们知道吗?你知道你们现在为什么拿不到高薪工作吗?😡,你知道为什么拿不到吗?😡,拿不到最根本原因在什么地方,在于你啥都想学,但是啥都没学会。举个例子,有多少人经常听我们的公开课?😡,给老师扣个6。
就经常现在听马上就叫公外课扣6。😡,很多吧,很多人经常来听,你听完课,你会发现公开课,咱们公开课是由普通老师讲的。今天我讲数据库,明天老周讲re list。后天老爷讲GM大后天好吧。
老李讲周凯MQ大后天马老师讲变化编堂,每个老师讲的都不一样,每节课你都听了其中一个小点。😊,比如我讲听过,我讲索引好,听会了,对吧?我讲了讲了讲了那个MVCC听会了。😊。
但这只是数据库或其中一个技术体系的一个点啊,它不是一个体系性的东西啊。什么叫体系?同学们。😡,就举个例子啊,我再举个例子,比如说。😡,一个技术框架。😡,它里面有10个点,有10个小框框。也是个小公告。
咱都在罗列呢。甚不是每次面试完问你问题的时候,你只能答一个。😡,你能有一个前后的关联关系吗?😡,你能把它关联起来吗?就比如说现在面试的时候问一个问题,说来谈一下你对叉叉叉叉技术的理解,你怎么回答?😡。
何同学想到哪儿说到哪儿。你的技术体系储备是散着的,明白吗?你要把它合到一起。当我面试官问到一个问题的时候,我能通过这个点往上或往下去延伸出来我相关的知识点。
我给面试官展示的并不是说我对于这一个技术点的掌握程度,而是我对于这个技术点整个体系的掌握程度什么样子的。😡,因说感觉我靠,这个人好牛逼啊。啊,最起码在这一点上面,你是无敌的。你懂我意思吗?
我敢放心的把某一块业务,某一块的技术架构,我把它放心的交给你。你要展示的是你这方面的能力。😡,而不是说我都是担绷子。😡,会一个readies会一个mycle。
会一个read里面一个点会my circlecle里面一个点,你这样去搞是没有意义的。听白意思吗?所以蔡线人问这个蔡线生问的问题说哪个地方都不是很扎实,应该怎么补?还是那句话,你就挑蔡线听好了。
能不能挑一个字。你刚说了分布式,我就挑微服务和分布式。😡,这头两个玩意儿。我把这玩这两玩意儿搞到巨无敌,前东我都不会,或者我稍微了解一点,这两个就搞到巨无敌,行不行?😡,面试的时候。
我所有的面试回答都往这两上面移,只要问到这方面东西了,我就展示我的技术深度和我的技术体系性。其他问题能回答我就回答,回答不了达倒。😡,能不这样。你以这样的方式学习。
你会发现慢慢的你会把每一个点的技术体系都去补充完整,而不是像你们现在一样,你再去散着学。就是你们跟报名VIP同学最大的区别是什么样子的。你们原来的学习是什么?是一个一个点1个点去学。而VIP报名之后。
老师会帮他规划路线,路线里你会告诉你,你必须要先学什么后学什么,再学什么。每一个点你的体系要怎么样做做准备,做什么储备,老师要怎么去帮你做这种监督服务,包括你后续的发展,你的学习过程都需要这样的东西。
这是他们的区别点。😡,就刚刚有哥们问的说,学习老师我怕遗忘,像蔡先说,以前现在通目室现在玩差不多了,有多少同学学习怕忘了,要2扣1。😡,觉得你胖胖的扣1有吗?你告诉我咱们现在听课同学有谁过目不忘吗?😡。
供不旺的给老扣2。谁都做不到,过目不忘,别想这事儿了。所以你要做是什么事儿,体系学习。在学的时候,我要保证我对于这个技术点的理解是深刻且到位的。就算我忘了,我可以根据我自己的总结来把它给迅速的回忆起来。
😡,来,我要举这个例子啊。来看一个图。我每一个我基本上展示这个东西啊,这是我们的1个VIP同学,他做的一个总结。他学习GVM的时候,他做的笔记。😊,我给你最小话,同学们。你看一下别人在学KVM的时候。
别人总结什么样的东西。看我放大一下好吧,所以你们说老师你是不是便随便拿一个东西来糊弄我,真不是JC日志设置调优的原则是什么样子的,检测工具是什么样子的?内存高应该怎么怎么设置参数应该怎么去做设计。
压缩点怎么做时间调怎么做,空间优化怎么做,看到了吗?😊,你如果真在学习的时候,你能做出这样的东西出来,你告诉我你会怕遗忘吗?就算你忘了之后,你根据你写的这套东西,他能不能快速回忆起来,能不能?😡,能吧。
你们现在是怎么学的?😡,你告诉我你们怎么学的?😡,我去B站,我看书好吧,我发现了一个巨牛逼的视频,我最牛逼一本书,对不对?然后呢,我看视频的时候,我看到视频里面某一个点了,讲的很牛逼。好了。
我啪你点击暂停。大家好了之后,赶紧去抄考试笔记,截图也好,写写文字也好,记完了。记完之后接大下听。😊,听完之后又遇到一个关键点。好了,我再暂停一下,赶紧截图做为文字笔记。你这玩意儿做完了之后。
我告诉你毛用都没有,为什么你这种方式不叫记笔记,叫什么?😡,叫什么叫抄笔记。因为在这个过程里面,你没有自己的总结和思考。明白了吗?什么叫自己的体系?为什么很多人听我讲课的时候,讲技术课听的很爽。
爽完了之后就爽完了,过一睡睡睡一觉,啥都忘了。😡,为什么这呀?就是因为你没有获得这方面的一些什么总结。对吧比如之前我问一下有多少人同学听过我讲原马课。听我讲羊满分送有多少扣个一。😡,很多吧。
我觉得很多人听过我讲完幼二课之后,你自己做个总结吗?😊,有多同学自己做个总结。扣个,我看看。我给你看一个东西。1个VIP同学,他听我的原码课做的一个总结。这是一个word文档。
这个word文档你可以看它这个名字啊,叫死维源码2,它这个文档一共有3个。光这个二这个文档它大概有92页。你看一下别人里面的东西。别他写多少?是别人做的总结,同学们,你真的把总结做成这个样子。
你觉得你会怕忘吗?下面有自己的理解,自己的解释啊,自己的东西他会做这样的标注和做这样的思考。我给你看这哥们儿他是怎么去问问题的,好吧。叫啥来着?这个呢。网的叫啥?就这。🎼我一看看他问问题的过程,好吧。
你看他问题的过程,你就知道他有他有多牛逼了,就他的学习方式是什么样子,你们是不是可以跟着或者模仿这样的学习方式去做一个这样的储备,你们可以尝试一下。😡,就别人在学完这小东西之后。
他到底是什么样的一个感受,这个是真的不一样的。找一下啊。人叫啥来着?哎呀。等家看。这是哥们加我微信之后问我问题好吧,你知道别人怎么没问题吗?同学们。😡,他说这边有些问题老师给讲解一下,对吧?然后呢。
这是循环易赖这块,他问的问题,然后别人问问题的时候是怎么问的,我给你看一眼啊。😊,文档还有5个问题,其他问题我已题实操搞定了。61页有什么问题,看到吗?每个问题到底是什么样子的。
他应该怎么去方式别人会这样来问问题,明白吗?😊,你没有这样的过程吗?😡,这种东西才是说我真正的学会了这东西之后是啥意思?而不是说我我就听一遍,你听一遍是没有意义的,听明白吗?朋学们。
这才是你需要应该储备的东西,这大家需要注意的。😡,哎,我为皮萨狂叔老师,怎么判断自己学的什么学到哪些,感觉内容太多了,也不知道如何下手。还是李壮同学们记住了,这里面涉及一个很重要的学习方法。
什么学习方法?你们现在有多少同学是已经工作的呃,应届毕业生不不怎么怎么说,还没毕业的学生扣一,已经毕业的扣2。😊,你们可以看一下你们的人群比例啊,咱们现在不管你是已经毕业了还是已经没毕业的同学。
基本上你们的学历,你们的技术储备,你们的薪水,你们的城市,你们的目标,每个人都是不一样的,明白吗?所以很难我去找到一个统一的适配路线。说OK你过来之后,你一定要先学这M,一定要先学平方编程。
一定要先学飞服务,一定要先学中间键,他没有一个统一的适配路线。😡,好吧,所以这里面需要一件什么事情,大家需要去去外界寻求一些帮助,什么帮助,你要想办法让自己找到一种更加高效并且更加及时的一种学习路线。
让自己做提升。我举个例子,还是呢我这这个事啊,你不一定一定要找我们做好吧,但我们做的更好,你也可以找你认识的一些师哥师姐或者或者比你牛逼的一些人,让他们帮你去做做什么东西,每个人过来之后。
你需要自己的技术评估了。什么技术评估。我给你看一个东西,同学们。😡,就在这块,它有一个很重要点叫什么?叫学习路线。什么叫学习路线呢?我也可以给大家看一下,好吧,有人想看吗?😡,徐路线的东西。
就省呢学习路线,我还是这句话,每个人跟每个人都不一样。所以一定要找到什么独属于你自己的最有效、最高效的学习方式。那这里面必然涉及到学习路线的东西,就这个路线我到底要怎么去做制定好吧,我们怎么做的。
我给你看一下,好吧,这种方式啊,你可以找比你厉害的人去做啊,这个关键点取决于你自己OK怎么做。比如说这块我们就拿这个火销来说吧啊,对,拿拿拿这个吧,英文名字我也不知道叫啥,就火销吧,能复制吗?😡。

手表算了,就回销吧。是要胡销吗。啊,就活。火火。学习路线。可以吧。啊,博约你就博约吧。学习谢谢。

我们会给学生做这种东西。下一步。做什么东西?每一个学生我刚刚说过了,每个人每个人情况不一样好吧,老师怎么帮你做这种东西?第一个。😡,每个路线不一样,意味着什么?第一个我需要看你的简历。
就是简历我是必须要看的,我怕简历没法帮你做规划。除了简历之外,第二个我需要一套什么叫入学测试题。😡,我需要去评估你自己的技术水平是什么样子。第三个我需要知道你的个人情况。比如你的城市啊。
你之前的薪水这些东西好吧,第四个我需要知道你的目标。比如说我现在10K,我想涨到20K,还是我现在20K,我想涨到30K,我必须要知道这些详细的明确信息。因为我只有知道这些明确的信息之后。
我才能知道说你应该储备什么样的技术实力。真的会准备好。同时我们会有一个什么。😡,针对一。服务区。老师给你们做服务,做完这个东西之后干嘛?我把这东西收集到了,收集到之后,我会给你做技术评估。
做完技术评估之后,O我随便推搓几个。比如说你需要学springM码,比如说你需要学myscle高性能的架构设计,对吧?比如说你需要学。😡,网易车对吧?比如说你需要学计算机组成原理。
我会帮你去做这样的制定路线,对吧?我可以给你画个路线配上色对吧?能不能好看一点,这是独属你个人路线。包括我会在这上面给你加一些个人的备注,你要怎么去学习这个基础模块,你要怎么样去做这样的一个技术储备。
😊,学习方式好吧,注意点,我给你规定好,规定好之后,这个路线是独属于你自己的一套学习路线,跟任何人没其他关系。当我有了路线之后会干什么事,我会选择把这个路线去推送给你。比如说刚刚学叫伯约。
我们找一下伯约。不会学路线吗?我可以选择使用路线,我推一下。什东线。但我只能退我自己啊。特别让别人。李总。嗯。🤧好了。当我推完之后大家发现了这边出现一条消息。
2022年9月19号10点23分022秒可以吗?同学马世民教授团队为你推送一条学术路线,点开学术线之后,是我刚刚制定的吗?同学们。😊,是不刚做好了吧?我做好这个路线之后,你可以按照这个路线来学习。
我保证的是什么?你现在规划这些点里面不需要你自己来选择的说老师我要学什么东西,不需要老师帮你来把这件事情做好。那做好之后,你干什么事?有一路线鼠标放上去。😡,直接跳转哎,直接跳转对应的课程进行学习。
跳转到视频这。你看完一个东西之后,接着往下看,看完一东西之后,接着往下看,看明意思了?同学们,这是你适合你的学习路线。哪一个路线里面,老师会告诉你,你要学什么?你不要学什么好吧?不需要说老师。
我说每次都要问了,你不需要我帮你做好这种平台化路线。OK你来学习就可以了。😊。




能理解吗?来觉这种路线定制方式,牛逼的同学给老师扣1。😡,这是直接内嵌在我们平台里面的,直接会给大家进行推送的。而且我们真正做到一种什么呢?叫私人定制,就是每个人跟每个人都不一样。
真的是独属于你自己的一条路线。但是我刚做路线没意义,好吧,我只是做了一个演示的一个效果。😡,啊,所以你会发现这种方式最高效的,我们会根据每一个人的情况给你量身定制这种路线。这个路线难道不是你最高效的吗?
也不是说我辛辛糊的给你推一个路线,不是这样的。😡,老师们在录做路线的时候是很负责的啊吧,而且一定是把你的需求,我要了解清楚之后,我才会去帮你去做这样的路线。你以为做路线马上就结束了吗?其实并没有。
除了做这个路线之外,我们更多提供的是什么东西?我们称之为啊叫陪跑服务。什么叫陪跑服务呢?为给大家想一下。😊,其实这很简单,刚刚这里面出现一个东西叫什么?叫一对N对规划群。什么意思?有我告诉大家。
你是初级也好,中级高级好,都有啊,任何阶段我们都有对应的路线。我们这有个N对一规划群是什么意思?这个N对规划群里面是你独属于你自己的一条什么?独属于自己的一个群,在这个群里面,老师会为你提供对应的服务。
什么服务。第一个是你的学习答疑,你说学习过程肯能遇到疑问嘛?之前一到文字的时候疑问的时候,可能要百度,我要去搜,现在不需要了,把你的问题扔给老师,老师帮你去提供解决方案,帮你去解决这些问题。
是你学习过程的问题,说学习问题之外,还有什么?😊,工作中的问题。对吧谁咱有不说了,比举个例子啊。😡,像刚刚这个这个这个这哥们问问题,他在学习过程遇到的问题,基本上都在给他回答好,你看一遍看不懂的。
没关系,哪地方要用用用什么东西,我告诉你怎么去做老师来给你解答这个服务好,这是老师来赠,就是这个课里面带给的,老师会为你服务的东西。第二个是什么?是工作中的问题。有很多同学的工作可能工作不太顺利。
遇到一些难点解决不了,怎么办?老师帮你提供对应的解决方案。我举个例子,有多少同学不会画架构图给老师扣1。😊,不会换套都不一。😡,我觉得很多同学啊在公司里面都会遇到这样的难点。这老师我价构图不会换怎么办?
😊,🤧不话没事儿。我告诉你怎么画,我教你怎么画。😡,好,我一步波带着你怎么快,这东西按道理说这是你工作中的问题啊,我是没没有义务帮你解决的。但是你工作中的问题,我依然会帮你解决。看那儿。😡。
这哥们四年开发经验了,目前处于脱离CD的初期,刚在这家公司入职,处于试用期阶段,被分配到了互联网项目组。处于初期阶段。经过前期的环境熟悉,项目经理希望我给出IOT项目架构图,这块刚起步。
所以寻求您的帮助。这东就说如果给不出来,基本上过不了试用期。好,这计些机遇也是一些挑战,希望通过这次东西从CLD转型的架构图。好了,都会换。😊,我告诉他怎么做,我说你大伙儿的前心设计吧。
看开是怎么做好吧,中间沟通沟通沟通,这儿我们在语音打电话告诉他怎么去解决,一步步带他,告诉他你要做什么样调整,做什么样的规划,应该怎么去做这种优化。😊,到这时候老师,我的价构图第一版通过了。
感谢老师欣欣指导。能看到差距,朋学们。这玩意儿就跟什么一样。😡,你现在在公司里面工作也好,学习也好,你是孤军奋战。你一个人再牛逼没用,为什么有4个队友拖累你,对吧?但是你现在有这个东西时候有什么好处?
你出门自带蓝buff,红buff,出门自带6件神装,你去跟别人打架。😡,你告诉我谁能打应,谁能打输,这个东西就是最基本的区别点啊。整个过程里面,老师去带着你做这样一个东西。除了之外,还有什么东西?
每一个同学我刚刚说了,我刚刚简讲的是简历指导课,简历指导课讲的时候,其实非常非常粗糙,只是把关键点给大家讲。每一个报名同学我们都会做这种什么呢?叫简历修改工作。😡,好,我给你随便看几个。
就在今天下午的时候,我还给N多的同学做一种简历指导。给你看一下好吧。就今天。这哥们。好吧,5点多的时候改简历,告诉他什么东西怎么改,应该具备什么样的能力,做什么样的东西。好吧。
下面介绍一下你没必要涉及到什么东西,应该怎么去改一部分告诉他你要做什么样的调整。😊,是吧保证一件事儿,你投递出去的简历必须要有回音,不能说投递出去之后跟没跟没头一样,不要这样好,不要浪费太多的机会。
好吧,那除此之外,还有什么东西,最重要的一点,朋们?有时候你们面试没过,你们自己会分析原因吗?😡,或者说你这样问个问题吧,有没有同学有这样的感受,就是我面试的时候感觉自己答的挺好的。
但面试官就不给我发offer,有遇到这样的情况吗?😡,有没有遇到过?就感觉面试打挺好的,跟面试官交流也很通畅,也很舒服。但是呢他就是不给我发offer,后面就没有消息了。😊,你知道我们怎么做的吗?😡。
我们给我们的每1个VIP的同学做一件事儿,做一件什么事儿?叫录音的复盘。我给你看几个我录音复盘的东西,好吧。随便抽几个啊。你看一下这哥们。你们自检有时候可能发现不了问题,但是老师可以去帮你发现这个问题。
你看一下。有人想听的录音吗?想听录音频的玩扣个一,有没有想听的?😊,没有没有就算了,好吧,想听啊。来。😊,文件夹显示。就这个啊没做任何修改,好吧,就这个。😊,来播放一下吧。前面跳过有自我介绍跳过了。
所以说这一块我还是做了一些自己特殊处理,能听到吗?啊,自己解析就是重新写的解析方法解方法。行啊,导入最大的实应的时候是是多少平方?最大的时候应该是1万多多,因为这是导入。
你他那个应该getge应该是先提交一下,然后再拉拉完之后再push。然后SVN是看到吧?他录音的录音,他面试录音帮他做复合,我说念的很紧张吗?自我介绍有什么问题,好吧,写怎么写稿子,要说明什么内容。
要怎么去解答问题,对吧?后面的环节调优要怎么去回答,要注意哪些细节点,怎么具备这种体系性,怎么去做这个引导,看到吗?我会骗房他,每一个都会分析吗?你看这哥们儿。😡,发录音,我再给他听录音,给他分析。
分析完成之后往下走。😊,这中间沟通的过程啊。老师,这个有点长啊,你再帮忙分析下,就9月份你再帮忙分析一下我的不足点。好了,这个问题我不知道有几个方,你不应该不知道。好吧,直接给移到原码怎么做。
用回答录音听听完回答。😊,看到吗?这是个过程。懂你意思吗?😡,你身上区区别点,你自己总结这些区别点好不好?就你你你自己去找别跟别人别的差距。😡,你人说老师这是不是独立个例啊?还有一个同学。
我带你看一下印象比较深的一个同学。是这个吗?不是。还有一个比较深印象比较深的点这个。你看好吧。你看这哥们儿我跟他咋分析的,好吧。😊,诶。😮,他那个。老师面试录音,帮忙分析一下吧。
说自己工作经验怎么打磕巴呢?怎么说表达什么东西,描述一下怎么描述,做什么样的东西,好好怎么梳理,现人值是干干什么。然后现人成计三方这也没记住,非以说他这个必要说呀,看到了吗?😊,英动DB什么之类东西。
说了吗?会分析吗?同学们。就这种东西才是最最最最值钱能帮你做一种提升的。听白意思吧?所以你要知道你跟别人之间差距在什么地方,所以我们更多要求是什么?每一个学生我们要求做到一件事,什么事儿叫陪跑服务。😡。
老师带着你去做这种提升,老师是带着你去做这种进阶成长,这才是你个人最最最最需要的,也是你成长最明显的东西。好,希望你能意识到这个东西。啊,同时给大家看一个东西,好吧。我讲这么多了,好吧。
这是我们课程能提供给学生的,能帮助你做这种提升的啊吧,你自己去思考说,你现在给别人差异在什么的地方。我还那句话,为什么别人上饭比较快,你上饭比较慢,这是根本点。别人是有加持的。
而你们没有你可以把我们当成老师,但我更多希希望学生把我称之为什么?称之为大哥,什么叫大哥,我来罩着你,你往上冲就完事了,懂这意思吧?好吧,有没人想知道一个学生,有人会回后有疑问啊,老师。
你们这种答疑是不是只是报名之后答疑一下,后面就不管了,有人有这种疑惑吗?😊,我再给你看一个例子,好吧,就是我目前啊帮助过一个学生,我自认为啊我对于他的帮助和提升是非常怎么说,非常明显的,明显在什么地方。
有没有人好奇一个学生跟着我们一年能获得什么成长的,就跟着马成培教育学一年能获得什么成长,你比较满意。同学们,你们听课的同学。😡,有吗?就跟着我们学一年,你觉得你获得什么样的成长之后,你会比较满意。
拿钱来说吧,就跟着我们学一年涨多少钱,你觉得会你就满意了。😡,有没有?啊。2倍。50K。做不到好吧。😊,50K做不到。😊,你要50K我做不到好吧。😊,我不我这个人啊,我河北邯郸人,我北方人。
我不喜欢这个说谎,也不喜欢吹你吹牛逼,好吧,你要550K,我达不到,我直说我达不到,好吧。😊,我一看一个学生啊,就是目前为止跟着我踏踏实实学的一个学生,他获得了什么样的一个成长,怎么赔保是吧?
我给你看看一个学生,我我我给他整个方面的帮助,好吧,这是我们整个人聊天聊聊天记录,我给你看好吧,这都是微信的,这个没法造假,我给你看就真式聊天。😊,你往上翻。一直晚上返回。
就这哥们儿我我我我帮帮他打达到什么地步,你自己去去看好不好?等着啊,往上翻再往上翻。他应该是2020年报名的,到现在还在跟着我们学,你可以看一下他具备了什么样的一个成长。不需要自制力。
我们有班主老师会督学,天天催着你学习。好吧,他加我的时候是2020年12月25号下午的时候是加我的时间。连老师刚开始叫连老师,有个问题要问你好吧,OK我们来回答问题,好吧,给大解答对应的疑问,对吧?
中间一直有疑问,一直在给他回答,疑问回答疑问回答疑问回答,刚开始的时候,我们关系还很陌生,叫连老师,对吧?后面开始改改连哥了。😊,好,那还是连哥。来到看了。他是12月份加了我,大家记住这个时间点。

看这个。连哥靠你的基础课程,我之前讲过一门基础课,从harlowork开始讲一门基础课,说靠你的基础课程,拿了1个16K的offer。

我说你的学生已经工作了,他说已经工作了,我涨薪了吗?涨了5000,而且从上海回苏州涨了5000,我说厉害了,接天学习都OK然后中间成功之后给我们推学生,建议你早点报班。好吧,他们真的很牛逼。😊,看到吧?
这些东西然后呢,往下他找到工作之后,并不是结束了,找到工作之后,我还在给他回问题,一直在给他回复,给他解答他现在所有的问题中出现的疑惑,再给他答疑。😊,你看聊天记录有多少,好吧。我给你看这个东西。
你们自己去评估好吧。😊,看到吗?我们又不理他吧。😡,来在今年的时候。2022年3月25号。看到了吗?严哥,你电信出来了吗?我说是的,之前在北京,他说我拿到电信的offer,你帮我分一享值不值得去。
2022年3月25号,1一年0两个月的样子。😊,你们自己去对比好吧,然后呢说了连哥下课了吗?11点多了,我还在回。兄问详细说明情况,拿到了中国电信股份有限公司网络安全产品运营中心。好吧。
和中国移动苏州营业老offer不知道是哪家,薪水区别,电信35,移动32。😊,同们告诉我剩下限是多少。上线是多少?多少?16万。现在多少?看区别了吗?看原理差距了吗?没同学们。这是差距,懂意思吗?
就为什么别人成长比较快,你成长比较慢,慢在什么地方。为什么会有这样的问题,你自己琢磨和思考。😡,🎼懂我意思吧?真男孩,我现在上课,我刚刚讲了两个小时课,你看多少人找我77的消息没回一堆等我回问题。
懂我意思吧?所以你要理解跟别人之间的差距在什么地方。我希望你们能了解这个差距,并且把这个差距给补回来。😡,好不好?O。😊,好了,多余东西不多说了不多说了。如果你觉得东西还还不够满意。
我再给你看一个哥们儿。他呢是我们的一个VIP同学,应届毕业生。我问一下,还有多少同学是大学没毕业呢,准备参加校招的这老师扣个一。😡,准备参加笑老多少扣1。你看一个学生好吧。他是也是跟着我们学的一个学生。
他学完我们课程之后,拿到实习offer,然后给我们做了一个总结。Thank you。可以看。也是今年的,不不给你看之前的,好吧,2022年5月10号找工作。各位老师好。
刚刚已经收到了腾讯的暑期实习offer,很多人老师大厂裁员了,找不到工作了。总结一下,去年10月份加入学习的,按照连老师安排的路线进行学习。如果没有规划路线,当时可能还在迷茫,不知道学什么东西。😊。
看明意思了吧?你们现在是不是也在迷茫,不知道学啥他也是一样的。回头看来,马世兵团队老师给我的感受都很好。周老师很地道,按照逻辑一点点顺下来,面试时候能感觉到跟别人单纯背面筋回答答案相比。
你的回答是有逻辑在里的程老师跟课实不够加今年面试突击班的好过遍真形成回堆真之我跟突击班看梁老师基本没问题,对不对?
算法怎么学的周老师这块怎么学的怎么学的最后这句话重要最觉得加MC最值觉得简历修改这四个简单,但没好形容词这个就整体缺什样式体细节啥就搞定近简历吐槽老带着你老面试后复盘答疑你不P复盘去里看课插漏补缺值。
😊,お?看到吗?这里哥们儿的一个情况。所以你可以看一下他们的差距在什么地方。the inplay说没有敢说百分之百能找到的。我告诉你,如果你真的跟着我们的课程来学习了,你百分之百找到工作,除非什么情况。
你跟着你买的课,你不学班主任催你说问你学习了没?让你提交笔记,你不交,对吧?让你汇报学习进度,你汇报老但是假的,因为咱们毕竟是远程的,这个没法控制。你只要保证说老师,我肯定跟着你们学掌心也好。
找工作也好,绝对没问题。😡,明白意思吗?我们现在有太多太多这样成功案例了,这不是说我在给大家吹牛逼,明白意思吗?我给你看一个东西,同学们。😡,我们这有这些行报。这是这个东西进度条。
你可以看一下有多少同学找到工作了。这里面每一个东西有些东地方打马赛克了,你说学术老师打马赛克我不太信任好吧,还是那句话,你报名之后,你对任何一张截图有任何疑问的时候,有任何疑问的,我告诉你。
我可以支持背调,我把原始的痕镜拿出来给你看,没问题,明白了吗?😡,肯定可以的好big老师老师会专改能找到出题开发工作吗?不能现在不会被服务什么的。所以刚刚我已经展示清楚我们的课程优势。
所以剩下东西就在于你自己了。你自己到底想以什么样方式学习,到底想怎么样的方式来学习,你自己来做决定。好吧,等今天晚上一样的讲一节课了,肯定有课程的优惠,给大家说一下,今天晚上课程优惠是什么样子?
梁老师课堂聚会进晚聚会仅限前十名。第一个直播课优惠券12000元。第二,专属福利二选一67分。😊。


系列 6:P137:说一下开发中需要遵守的设计原则 - 马士兵学堂 - BV1RY4y1Q7DL

同学们大家好,接下来呢我们来看一道来自于阿里的面试题。😊,说一下开发中需要遵守的设计原则,对应的薪资呢是25到30K。对应的岗位是高级开发工程师。那么我们先来看一下。
其实这个开发当中所需要遵守的设计原则呢,通常的话呢我们要回答的是设计模式当中提到的六大设计原则。那么。

我们可以来去一个一个的看一下啊。首先第一个就是。单一职责原则。那所谓的单一职责原则呢,它指的是一个类啊,只负责完成一个职责或者功能。也就是说,在类的设计当中呢,我们不要设计大而全的类,而是要设计什么呀?
力度比较小,功能单一的类。这是单一职责原则。

然后就是这个开放封闭原则。啊,也就是我们常说的对扩展开放,对修改关闭啊,对扩展开放和对修改关闭呢表示,当一个类或者一个方法有新需求或者需求发生改变的时候,应该采用扩展的方式,而不应该采用什么呀?
修改原有。😊,逻辑的方式来实现。啊,那么遵守开辟原则的话呢,它的好处是首先新老逻辑呢它是解偶的,需求发生改变的时候不会影响老业务的逻辑。第二个呢就是改动成本是最小的,只需要增加新逻辑,不需要修改老逻辑。
第三点就是。

提供代码的稳定性和可扩展性。

第三个就是理氏替换原则。那么这个理式替换原则啊,相对来说呢不是很好解释。那么如果我们想想要去理解它的话呢,我们先要知道什么是替换啊,所谓的替换呢啊替换的前提是面向对象语言当中所支持的多态特性。
注意多态特性。😊,那么同一它多态的话,其实就同一个行为具有多个不同表现形式或者形态啊。那么以我们的ZDK集合框架为例呢,list接口的定义它是为有序集合。那么list接口呢有多个派生类。
比如说relink list。那当我们某个方法的参数或者变量是list的接口的时候呢,我们就可以传入它的什么子类,比如re released,对吧?比如link list,那这个就是我们说的替换啊。
替换。然后。😊,还有一个呢就是。

第二个问题啊,就是什么是与期望行为一致的替换啊,什么是与期望行为一致的替换。那么在不了解派生类的情况下呢,仅通过接口或者积类的方法,既可以知道方法的行为啊,而不管什么呀,哪种派生类的实现,都与什么呀。
都与接口和积肋方法的希望行为一致。😊,啊,这话的意思就是我们不需要关心是哪个类对接口进行了实现,也不管什么这个底层是如何实现的。因为呢我们最终的话呢。
它返回的结果一定是符合这个接口当中所关于这个方法的描述的。OK吧,这是我们说的理是替换原则。😊。


啊,然后呢就是接口隔离原则。接口的隔离原则呢,它指的是要为各个类建立他们需要的专用接口,而不是试图建立一个很庞大的接口,供所有依赖它的类去调用。啊,那么也就是说我们要去什么呀?
按照每个类它的职责不同来去建立对应的接口。那么接口隔离原则和单一职责原则好像看起来比较像,对吧?但是他们之间其实有区别的啊,那么单一职责原则注重的是职责,而接口隔离原则呢注重的是对接口依赖的隔离。😊。
啊,单一职责呢主要是用来约束类的啊,针对程序当中的实现和细节。而接口隔离原则呢,它主要用于约束接口,主要是针对于抽象和程序的整体架构设计啊。

然后第五个呢就是依赖倒置原则了。那么依赖倒置原则呢指的是在设计代码架构的时候呢,高层模块不应该依赖于底层模块,两者呢都应该依赖于抽象。啊,抽象呢不应该依赖于细节,细节应该依赖于抽象。啊。
这里边其实重点的就是这个抽象,对吧?啊,那么。😊,呃,这个依赖道字原则呢,它其实是实现开辟原则的一个重要途径啊,那么降低它降低了客户与实现模块之间的一个耦合啊,依赖道字原则的好处啊。
首先呢它减少了类类之间的耦合性,提高了系统的稳定性。😊,第二呢就是降低并行开发引起的风险。啊,还有呢就是提高代码的可读性和可维护性。

这是我们说的依赖道德原则,然后就是迪米特法则。😊。

简单来说呢,迪米特法则想要表达的思想就是不该有直接依赖关系的类之间就不要有依赖。有依赖关系的类之间呢啊尽量只依赖必要的接口。啊,它指的是通常情况下指的是,如果两个软体两个软件实体无需直接通信。
那么就不应该发生什么呀?直接的相互调用,而是通过第三方转发啊,其目的其实就是为了结耦啊,提高模块之间的这个独立性。

那么以上呢,其实就是关于这个我们的这个六大设计原则的一个介绍。那么关于这个面试题呢,就是开发当中需要遵守的设计原则呢,我们可以啊通过回答这个六大设计原则来去进行一个啊。



通过这个六大设计原则来去进行一个讲解。当然了呃也还有其他的一些设计原则。如果同学们在开发当中还用到过其他的设计原则的话,也可以进行一个补充。😊,好,以上呢就是关于这个面试题的讲解啊。
希望呢能够帮助到同学们。😊。

系列 6:P138:什么是设计模式 使用过设计模式吗 - 马士兵学堂 - BV1RY4y1Q7DL

同学们大家好。接下来呢我们来看一道来自于阿里的面试题。什么是设计模式?使用过设计模式吗?对应的薪资呢是25K,对应的岗位呢是高级开发工程师。😊,那么。首先我们说什么是设计模式呢?
其实设计模式呢它是一套被反复使用,多数人知晓经过分类编目的代码设计经验的总结。在这个设计模式艺术当中呢啊这里边他有提到啊,本书涉及的设计模式并不描述新的或未经证实的设计。
我们只收录那些在不同的系统当中多次使用过的成功的设计。那其实简单来说就是设计模式就是什么呀?😊,这些有经验的同学的代码设计的一个经验的总结。😊。

那么大部分的设计模式呢,它主要解决的都是代码的可重用性和可后展性的一个问题。

设计模式它有一些好处啊,首先呢它可以呃。😊。

我们学习设计模式呢,可以让我们这个嗯不再编写那些什么啊比较烂的代码。第二点呢就是提高这个复杂代码的设计和开发能力。第三呢就是有助于我们去读源码啊,学习一些框架的时候呢啊这个更加的事半功倍啊。
另外呢就是我们还可以介绍一下这个关于这个设计模式,它的一个种类啊,那么。😊。


其实呢设计模式当中呢,它是按照这个。类型的不同来去进行了一个划分啊,根据他们的用途的不同啊,进划分成了不同的类型,包括了创建型模式5种啊有5种。
它的重点就是创建型模式的这些设计和模式都是用来去做创建对象的啊,那么提供了创建对象的机制啊,提升已有代码的灵活性和可用性。😊,啊,比如说常见的单力模式、工厂模式等等啊,还有呢就是结构性模式啊。
结构性模式呢有7种,它呢就是介绍如何将对象和类组装成较大的结构啊,并呢同时保持结构的灵活和高效。😊。

啊,那么通常情况下呢啊比较常用的话呢,是我们呃比如说代理模式、调节模式,这是我们可能在实际开发当中都会用到的对吧?啊,装饰者模式、适频器模式啊这几种。然后呢就是行为模式,它有11种啊。
他负责对象间的高效沟通和职责的传递委派啊,比如说观察者模式模板模式啊,策略模式,还有什么我们的职责链模式等等的一些模式啊好,那回答到这里呢,其实我们就把设计模式给说清楚了啊。
那么还有一个问题就是使用过设计模式嘛。那么同学们可以根据自己在工作当中的经验来去进行回答。如果说没有在这个实际的工程当中没有使用过设计模式的话,那我们可以随便单拎出来一个,比如说单列模式比较好说的啊。
然后我们就介绍一下这个单列模式的一些德性。然后呢啊一些实现方式也是可以的啊。😊。

好,那么以上呢就是关于这道面试题的一个讲解啊,希望呢能够帮助到同学们。

系列 6:P139:说一下单例模式,及其应用场景 - 马士兵学堂 - BV1RY4y1Q7DL

同学们大家好。接下来呢我们来看一道来自于美团的面试题,说一下单利模式及其应用场景。😊,对应的薪资呢是25K,对应的岗位是高级开发工程师。首先呢我们先说一下单力模式它的定义啊。
单力模式呢它要保证某某个类在运行期间只有一个实例。对外提供服务。而这个类呢就被称作是一个单粒类。那么。单立模式呢。他也是比较好理解的。比如说一个人呢一辈子他只有一个真实的。这个身份证号,那么。
一个国家呢只有一个政府啊,类似于这种场景呢,都属于单例模式。

那么使用单例模式呢要做的两件事。第一件事呢就是保证一个类只有一个实例。第二呢就是为该实例提供一个全局的访问点啊,怎么去完成这两件事呢?就是我们在设计单例类的时候呢。
我们首先呢要去这个提供一个这样的单例它的一个实例。然后呢要私有化它的。这个构造方法啊,不让外界呢去通过构造方法创建这个单例类的实例。再一个就是既然不能够创建单例类,不能够从外部创建单例类的实力的话呢。
我们就提供一个公共的方法来去获取这个实力啊。单例的这个实力OK啊,然后单例的实际实现的话呢,就包括了。😊。

这个啊扼汗式、懒汗式、双重检测、静态内部类,还有枚举的方式啊,有啊这个这么几种方式。当然其实可能还有其他的方式啊,那么一般的面试的时候呢,可能还会去让大家去对这个这几种方式呢来做一个比较。
那么这几种方式,它的一个区别。那同学们也要去了解那那相对来说比较简单啊,那么再一个就是可能会要求大家去。手写一个单列模式的实现。一般情况下,我们就直接手写一个汉式就可以了啊。
如果遇到这种手写的这种情况的话啊。那么另外就是单力模式的应用场景啊,首先呢资源在这个资源共享的情况下啊,避免由于资源操作时导致的性能和损耗这种场景。比如说日志文件还有应用配置啊,第二个就是。

控制资源的情况下啊,那么方便资源之间的互相通信。那么比如说先证尺啊,都可以用到我们的代理模式。

OK啊,那以上呢就是关于这个啊单力模式和它的应用场景的一个面试题的一个讲解。希望呢能够帮助到同学们。😊。


系列 6:P14:自旋锁 - 马士兵学堂 - BV1RY4y1Q7DL
好了呃,我刚才也讲了一堆一堆的概念,那么下面呢我们来聊java最底层的这种并发的时,候,对一个数对一个数据的并发的访问,大家都知道啊,作为一个数据的并发的一个访问,能控制这个数据的前后的一致性。
最简单的一个方法呢叫做加synchronized对吧,上锁,关于上锁,这个是面试的重灾区,synchronized,我们首先引入第一个概念,这个synchronized在jdk的1。2之前效率极低。
超级低,效率特别低,为什么特别低,是因为jdk一点二之前,它的内部实现重量级锁,我只要把这名字写出来,你现在是不是能理解什么意思了,就有同学说老师jk一点二之前呢,一定是重量级锁,那什么时候。
难道他最后进行了一个升级吗,没错他后来1。31。4,1。5都对synchront做了一系列的升级,在1。5的时候应该说到1。6的时候,对这个升级应该就比较完善了,后面就没怎么再动过,它的视线。
在后面的一个实现过程里头,它有一个锁升级过程,叫做轻量级锁,升级为重量级锁,它中间有一个升级过程,就是他开始利用了轻量级锁,重量级锁,轻量级锁,现在大家是不是能理解什么概念了,仔细听重量级锁什么意思啊。
重量级锁就是要经过操作系统的管理吗,我再说一遍,操作系统管理就是你要申请这把锁,操作系统的就帮你在自己的内核里面申请好,把你的java的对应的线程给拿过来,放到放到队列里进行管理,需要老大的管理。
而轻量理所的概念就是,我不需要老大哥们儿老大,我不需要你作为我jvm来说,我在我自己的内存空间就完全足以完成,这个叫轻量级锁,好这两个概念能get到的,老师扣个一,现在的面试题就开始问你。
k synchronize,内部的这种轻量级锁到底是怎么实现的,那下面我们就来聊这个过程,好先说最基本的概念,我们说synchronized的呃。

最基本的这种轻量级锁是怎么实现的呢,它有两种轻量级的锁,作为synchronized的内部,它实现了两种轻量级的锁,第一种叫偏向锁,第二种叫轻量级锁,叫自旋锁或者叫自旋锁,好那有同学会说老师啊。
这个偏向锁它真正的是把锁嘛,其实偏向所,严格来讲他不是不是把所它只是个标记,我们一会来讲就行了,好要想理解这些概念的啊。

我们首先来理解最基本的一个概念,这个概念呢叫c a s来听说过这个词的,给老师扣个一,目前j u c的这个包里,jdk一点五之后增加了java的这种concurrent bar,是吧。
嗯j o c这个包里多数的锁的一个实现,比方说lock这个锁,比方说reenterlock,比方说red red lock,比方说psychic barrier,比方说condoledge,好。
这些个时间基本全是用了cs,当然他底层用的是a q s a q s就是一个队列,再加c a s啊,就这个意思,我们先来了解这个cs的最基本的概念,cs的意思是它的全称叫compare and swap。
compare and exchange,有同学说,老师这这这这这这到底是个什么概念呢,它是一把锁吗,首先我们说它是用来替代重量级锁,重量级锁,我们先要了解重量级锁什么概念,重量。
你所说我锁定持有持有这把锁,才能进行一个操作,这个就是我们平时synchronized的一个语义对吧,我持有这把锁,synchronized这把锁,然后才能进行一系列操作,ok,这我来打开代码说吧。
不说代码的话。

好多小同学的基础稍弱啊,到现在大家还能跟上吗,同学们,咳咳,能跟上,你老扣一了,好来看我桌面是吧,看看你桌面,来哈哈,看这里啊,比方说我们做一个最简单的操作,最基本的操作来给大家伙十几秒钟。
你看一下这个小程序,小程序做了一件什么事呢,在这呢我们定义了一个静态的变量,这个变量叫m,然后我起了100个线程,这100个线程每个线程把这个m加1万次,从零开始,m加加循环多少次,循环1万次。
最后整个程序结束之后,我这个m的值正常的情况,100万,这个没问题对吧,那大家想一想,如果这个程序执行完,会不会是100万,看这里跑一下,99万多,原因是什么呀,哎原因是什么,原因非常简单吧。
就是为什么他会比100万少呢,是因为我们多线程做并发的时候,往往会发生这样一种情况,所以这个m这个值我第一个线程来了,把这个m的值,比方说他现在是100,我读过来把它改成101,我还没有往回写的时候。
另外一个线程同时把这个100夺走了,他也改成101m加加嘛,然后你也往回写,我也往回写,你写了一个101,我也把这个101写回去,相当于我们加了两次,本来应该是102了,可是现在只有101少了。
这是因为多线程访问的时候没有做同步,那最简单的一种方式怎么能做同步呢,怎么做同步啊,最简单的就是上锁嘛,对不对,volatile是不行的啊,不用不用看volatile,最简单就是上锁吗。
synchronized吗,就是我我每一个代码执行的过程中,保证只有一个线程中运行上锁synchronized,这个肯定没问题,因为,我保证我加完了之后,另外一个线程才能继续运行。
哈哈我这个线程给他加完了,加完了之后,另外一个线程才能继续运行,这样的话呢,保证最后的结果一定是准确的,必须你要想加下一个,值得等我加完,我加完之后,你另外一个电脑都能运行了,ok上锁。
可是如果这个锁是重量级的锁,其实它的效率并不高,我再强调一遍,为什么,原因是它要经过操作系统老大的一个调度,那么除了这种方式之外,我估计有很多同学应该是能知道这个方式的,这个方式没有锁,仔细看一下。

我没有写任何的synchronized,在这个县城里面,我没有写任何的锁。

我干了一件什么事呢,我用了一个atomic integer,atomic原子的原子原子类,这个类型的应该比较常见了,这块大家是不是应该还能跟上了,能跟上的给老师扣个一了,其实这个内容挺多的啊。
也是对那个零基础的稍微有点不友好嗯,但是你也听听是吧,打开你的新空间,你又能理解呢哦原来外面还有这么多空间,你可以提升好看。
这里atomic integer m等于new一个atomic energy 0,在这呢我们并没有对m加加这种操作,并没有给他上锁,它只是调用内部的一个叫m点。
increment and get好inquirement that get,有同学说老师您在讲cs啊,没事讲这个程序干嘛,我们下面就来看看这个m点,increment get它外面没有加锁。
它是不是里边加锁了,点进去你会发现这个increment and get,调用了on safe这个类的,get and at it跟进去,你会发现get at at int这个方法。
它调用了compare and swap it,ok点进去,然后你可以发现他是native代码,就是c加加的一个实现了,好那从这你能看出来,至少是它内部用什么实现,他们内部并没有上锁。
并没有写synchronized的r用的是c a s好,这就是cs全称,cs全称叫compare and swap,比较并交换compare and sweat。
当然它还有一些别的叫法叫compare and set。

比较并设置一样的,当然还有一种叫法呢,这个稍微的不常见一些叫compare and exchange,因为swap本身也是exchange的意思,好多好多底层的源码。
他用的就是compare and exchange,无所谓,他叫啥没关系,反正还是一本菜,它叫c a s好,下面我们来聊一聊cs到底是个什么操作,cs是怎么能实现那种不需要上锁,不需要那种重量级的锁。
就能够做同步的,你仔细听,这里面隐藏着很多很多的面试的问题,好我们先说cs的概念是个什么概念,举个例子,还是那个值那个m值,原来这个值是零,我现在不想上锁,也能保证这个数据前后一致。
不会出现那种多线程并发访问下的,数据不一致的问题,怎么办呢,我第一个线程拿过它来之后,把它改成一,改成一之后,我往回把这个一往回写的过程,我首先进行比较,compare,比较什么呢。
比较的是a我写的时候,这个时候的这个值是不是依然为零,这个很重要,哥们儿,你是不是依然为零,依然为零代表什么概念,就代表着没在,我把这个改成一,在王辉写的这个过程之中,没有任何其他线程改过这个值。
那没有改过,我当然可以放心的把它给更新成一了,就我就把它改成一了,ok那有同学会说,老师这个过程你确实没有上锁,可是你在compare exchange的时候,万一中间有人把它给改过了吗。
已经改成二了呢,那没有关系,你发现你往回写的过程之中,它不是不为零,说明啥,说明有人已经把它改过了,有人把它改过了的话,那我就把这个二重新再读出来,把它改成三,然后把这个三往回写。
往回写的过程看看它是不是依然为二,ok,如果依然为二,说明没有人改过他,我就可以直接都威胁,那有同学说不成,有人改成八了,没关系,我把这八改过来,改成九九,往回写的时候看看他是不是依然为八。
一直到成功为止,就跟他转圈,它是一个while循环,well,你只要跟原值进行比较,我就给你设置好,如果我跟原值不一样,我就继续循环,ok这个就叫乐观锁,或者叫自选所,或者叫轻量级所。
它轻量的原因是他们不需要经过操作系,老大的重量,你所的支持,我在用户空间进行while循环就可以搞定了,会不会死,循环不会的,因为总是能成功,总有一次能成功,别的线程执行完了,我不就成了吗。
比较完了之后改了呢,对你说的非常对应,a b a问题,对你们说的非常对应,这个概念,讲完之后,我们主要讲两个,这里面面试中两个问题,第一个是a b a问题。
第二个是compared swap本身的原子性,刚才这个概念能get到的,给老师扣一,什么叫cs其实很简单,我几句话就能解释清楚,就是每次往回写这个值的时候,看看这个值是不是被别人给变过。
当然这里面隐藏着两弹面试中的重要问题啊,好好听,第一代问题是如果发生了这样一种情况,这是那个值,不管它是什么,我把它改完,改完之后,我往回写,我们写的过程之中,其实中间已经经历了别的过程。
什么叫有一个线程把它从零改成了一,又有一个线程把它从一改回改回成零,所以这个零看上去依然是原来那个零,可是很不幸的是,它也不是原来那个零了,他是中间被人改过去又改回来的,从a改成了b又改回成a的。
这就是著名的aba问题,a aba问题的意思非常简单,一个小比喻,就是你你你你你这是你女朋友离开你的状态,然后呢,你女朋友经历了别的男人又分手了,回来之后你怎么知道他经历了别的男人呢。
怎么才能知道这个当然是选择那个呃,当然当然是选择原谅了是吧,哎这个时候加版本号就可以加version,这是最简单的解决方案,你别他,你在他脑门上写一半码号,你离开的时候是一点。
中间经历了别的男人回来之后呢,晚上写了99点,very good,那说明呢经历了一些人,ok,好这个呢就是aba问题,b问题非常简单,就是加一个版本号就可以,这问题能理解的同学给老师扣一。
他回来依然是一点啊,你很好是吧,正在等着你,但你是99点了,已经太过分了啊,好看这里我们说第二个问题,第二个问题才是一个深层次的问题,第一个问题很简单啊,那个java里面有自身。
有好多好多现成的类都能支持呃,stamp,这叫全称叫什么来着,stamp,那个那个那个那个那个那个那个那个那个,突然之间就忘了,好,先不管它啊,就是加一个版本号,加一个时间戳就可以对。
atomic stm reference,没错啊,假发抄你,你记得你记得很好,送你一个键盘啊。

系列 6:P140:介绍一下代理模式的种类和它们之间区别 - 马士兵学堂 - BV1RY4y1Q7DL
朋友们,大家好,接下来呢我们来看一道来自于美团的面试题。😊。

介绍一下代理模式的种类和他们之间的区别。对应的薪资呢是30K,对应的岗位是高级开发工程师。那么我们先来看一下这个静态代理啊,那么这种代理方式呢是需要代理对象和目标对象实现一样的接口啊。
代理对象和目标对象实现一的接口优点呢就是可以在不修改目标对象的前提下扩展目标对象的功能。缺点的话就是冗于冗余啊,那由于代理对象呢要实现与目标对象一致的接口。那有可能会产生过多的代理类。
第二个就是说不易维护啊,一旦接口增加方法那么目标对象和代理对象呢就都要进行修改了。😊。

然后就是我们说的动态代理了。其实动态代理呢我们用的是最多的对吧?那包括了ZDK的动态代理。😊。

那么这D类动态代理呢,它利用了JDK的API动态的在内存当中构建代理对象啊,从而实现对目标对象的代理功能啊。

那么这个静态代理和动态代理呢,它的区别就是静态代理呢在编译的时候就已经实现了,对吧?编译完成后,这个代理类呢它是一个实际的class文件。😊,而动态代理它是在运行的时候去动态的生成的。
也就是编译完成后呢,是没有实际的classclass文件的。那么在运行到对应的内行代码的时候啊,再去动态的生成该类的字节码。OK吧。好,再一个就是我们说的CGCD labb这个动态代理。


啊,C lab这个动态站里呢,它是一个啊。😊,第三方的啊代码生成内库。那么这里边呢呃它的特点就是在运行的时候啊,在内存当中动态的生成一个此类对象,哎,从而实现对目标对象的扩展。

啊,那么这个C lab呢,它是为没有实现接口的这个类提供代理的,相当于是对于CDK动态代理的一个补充。

啊,那么我们再来看一下三种代理模式的实验方式的对比啊,那么JDK代理和C labb的代理的一个对比呢。首先。

咱们的C lab啊使用C lab来去实现动态代理的话,它底层是通过ASM字节码生成的生成框架啊,采用的是这个啊一个字节码生成框架,那么来去生成这个代理类的。那么在1。6之前。😊,他要只有在1。
6之前啊呃那么要比扎哇的反射效率要高一些。OK吧,然后呢,在1。61。71。8逐步呢对ZDK动态来做优化之后。😊,啊,那么ZDK代理的效率呢要高于。😊,C lab的这个代理的效率了。OK吧啊。
所以呢啊就是说只从1。8开始吧啊,从1。8开始,这个ZDK的代理效率就高于C labb了啊,所以呢如果有接口使用,如果有接口的话,就使用ZDK动态代理。如果没有接口,我们再去选择C labb代理啊。
还有就是动态代理和静态代理了。这里边呢其实啊动态代理与静态代理相比较呢,它最大的好处就是这个接口中声明的所有方法呢都被转移到什么呀?调用处理器一个集中的方法当中去处理了。这样的话呢。
在接口方法数量比较多的时候。😊。

啊,我们就可以灵活的进行处理了啊,那么不需要呢,就是像静态代理那样,对吧?然后去做一个都去做一个实现啊,那么。

这是我们说的这个关于这个代理模式,它的种类和它们之间的一个区别啊。那么总结一下就是首先种类就包括了静态代理和动态代理两种。然后呢啊动态代理呢又包括了ZDK的动态代理和CGlab的动态代理。

好,以上呢就是针对于这道面试的讲解,希望呢能够帮助到同学们。

系列 6:P141:工厂模式有哪几种,之间有什么区别 - 马士兵学堂 - BV1RY4y1Q7DL
同学们,大家好。接下来呢我们来看一道来自于阿里的面试题。😊。

工厂模式有哪几种之间有什么区别?对应的薪资呢是30K,对应的岗位是高级开发工程师。那么在工厂模式当中呢,我们在创建对象的时候,是不会对客户端暴露创建的一个逻辑的啊,我们只是直接通过啊工厂这个模式。
然后呢提供的方法,我们直接去获取这个实力。那么。在设计模式艺术当中呢,它是将工厂模式呢分为了三种,包括了简单工厂、工厂方法和抽象工厂。

那我们先来看简单工厂。其实呢简单工厂它并不在23种缩计模式当中。

这个简单工厂模式呢,我们可以把它看作是一种编程的习惯啊。简单工厂模式呢又可以叫做静态工厂方法模式。它的一个特点就是它将这个。😊,方法的这个返回值呢设置为这个我们的这个是一个接口类型啊。
那么我们在这个样的一个工厂当中,比如说我有一个产品工厂,那么我的方法的返回值其实是一个产品的接口类型。然后呢,我会根据你的传入的这个对应的参数的不同,然后给你返回这个接口的对应的实例。比如说返回产品A。
如果是一的话,我就返回产品A。如果是二的话,我就返回产品B啊,这种方式来去什么啊,这个生产这个对象的。然后我们再来看。

这个它适用场景就是需要创建的对象较少。啊,然后呢客户端不关心对象创建的过程。啊,优点呢就是封装了创建对象的过程,可以通过参数直接获取对象啊,把这个对象的创建和业务逻辑呢给大家划分开了。😊。

缺点的话就是在增加新产品的时候,还是需要修改工厂类的代码,违背了开辟原则。因为我们是通过参数来去判断啊要去生产的产品的类型的。所以呢这里边如果新增产品就需要修改代码。


然后我们再来看工厂方法模式。

工厂方法模式呢,它的定义是这样的啊。😊,用用于什么定义一个用于创建对象的接口啊,让子类决定实力化哪个产品类对象。那么工厂方法呢使一个产品类的实力化呢延迟到了其工厂的子类。
这里边呢这句话的含义其实就是在我们上面简单工厂的这种模式当中呢啊它是。😊,只有一个这个工厂对吧?而在工厂方法当中呢,它其实是将工厂也进行了抽象,然后呢就抽象出了这个一个工厂抽象工厂和一个产品的接口。
那么对应的话呢,我们就用工厂A的一个实现类来去生产产品A,然后用工厂B实间来来生实验类来去生产产品B啊,那么这种工厂方法模式,它的特点,就是啊用户呢只需要知道具体工厂的名称,就可以得到所要的产品,对吧?
无需知道产品的创建过程。因为呢我们知道工厂A的话,我们就知道它生产的是产品A。知道工厂B的话,我们就知道它生产的产品是产品B啊,那么在系统增加新的产品的时候。
只需要添加具体产品类和对应的具体工厂无需对于什么原有的工厂进行修改。😊。

因为都是面向我们的接口的,所以呢它是满足开辟原则的。如果有新增的产品。首先要去实现这个收用工厂,再实现一个产品接口就可以了。好,然后呢对应的缺点就是每增加一个产品,就要增加一个具体的产品类和一个具体的。

工厂类啊,那这样的话呢会增加咱们系统的复杂度。

好,第三个就是我们说的抽象工厂模式。那么抽象工厂模式呢,它呢。

实际上呢相当于是对工厂方法模式的进一步扩展。啊,进一步的扩展。那么可以把它看作是一个超级工厂啊,它呢。😊,啊,在我们的抽象工厂模式当中,接口是负责创建一个相关对象的工厂的啊,而且。
每一个工厂呢都能按照工厂模式来去提供对象啊,那么这里边我们在工厂模式当中呢,它的一个最大特点就是每一个具体的工厂都提供了多个工厂方法,用于生产什么呀?不同类型的产品。大家可以这样理解。

那么我们还是一样,会有抽象工厂,会有产品接口,也就是我们的这个啊。产品的接口和这个工厂的一个接口。那么首先呢我们会有这个工厂的实现啊,工厂的一个实对于抽象工厂的一个实现。然后呢。
我们这个在抽象工厂模式当中,我们的这个工厂的具体的具体类。那么它在生产产品的时候,它就不再指生产单一产品,而是生产某一个品类的产品。OK吧,比方说我就生产一个这个海尔品牌的这个它的,比如我生产一个电视。
我就可以生产海尔的一个电视,也可以生产海信的这样的电视啊,是这个意思。那么。

抽象工厂模式它的优点呢就是在对于不同产品,不同产品系列有比较多共性特征的时候,比如说我是某一个品类下的某一个品牌下的一个呃产品啊,那么我们可以使用抽象工厂模式。这样的话呢可以有助于提升咱们组建的复用性。
那当需要提升代码的扩展性,并且降低维护成本的时候,我们可以把对象的创建和使用过程分开啊,当然这个也是其他工厂模式它的一个特点啊优点。还有呢就是解决跨平台带来的兼容性的问题。那么抽象工厂模式的一个缺点。
它的最大缺点就是我们在增加新的产品等级结构的时候是比较麻烦的啊,整个的话需要对我们的抽象工厂来进行一个呃重新的体系重新一个呃设计。那么。😊。


使用抽象工厂模式的时候,就要求我们对于当前业务的理解一定要是比较透彻才行。所以啊那么在我们说的这以上这三种工厂模式的这个当中呢,其实我们最常用的就是简单工厂和工厂方法模式。


OK啊,以上呢就是针对于。😊,工厂模式有哪几种之间有什么区别?最早面试的一个讲解,希望呢能够帮助到同学们。😊。

系列 6:P142:介绍一下观察者设计模式 - 马士兵学堂 - BV1RY4y1Q7DL
同学们大家好,接下来呢我们来看一道来自于阿里的面试题。😊。

介绍一下观察者设计模式。对应的薪资呢是30K,对应的岗位是高级开发工程师。

观察者模式的原始定义是它用于定义对象之间的一对多依赖关系。这样呢当一个对象改变状态时。他的所有的依赖项呢都会自动的得到通知和更新。那么其实观察者模式呢,它就是用于建立一种对象与对象之间的依赖关系的。
当一个对象发生改变时,将自动通知其他对象。那么其他对象呢将相应的做出反应。在这个观察者模式当中呢,发生改变的对象呢,我们把它称之为观察目标。而被通知的对象呢,我们把它称之为观察者。
一个观察目标它是可以对应多个观察者的。而且呢这些观察者之间呢可以没有任何的联系。我们可以根据需要增加和删除观察者,使得我们的系统呢更易于扩展。😊,那么我们可以看到啊,在观察者模式当中呢。
它其实包含了观察目标和观察者两个基成层次结构。那在这里呢。

首先呢我们是可以看到这里。这个s这呢它其实就是一个抽象的被观察者。然后在被观察者当中呢有三个方法,第一个方法呢是用来去添加观察者的。第二个呢是用来移除观察者的。第三个呢是它是一个啊通知方法啊。
它是一个通知方法。那么啊这个方法呢,它是用来去这个啊便利咱们的观察者集合,然后调用每一个观察者的它的响用方法的啊,那么在这里边呢,我们在这个。😊,观察者的这个抽象的这个被观察者,他的这个子类。
也就是具体的被观察者里边呢,它是有一个集合的。大家看到这个集合当中所装的就是这个观察者的对象啊,那么还是一样,这边呢也是一个抽象的,有这样一个抽象的观察者,它这里边有一个。😊。
update这样的一个方法,对吧?有这样的一个up方法。那么呃这个方法呢,它是为不同的观察者的这种更新的行为呢去定义一个统一的接口。然后呢,不同的观察者。
也就是我们下边的具体的这个观察者可以对这个方法呢啊做什么做这个不同的不同的实现啊,不同的实现。好,那么。😊。

接下来我们再来看一下观察者的他的优缺点啊。首先呢观察者的模式的优点啊,它降低了目标和观察者之间的偶合关系。两者之间是抽象的耦合关系。😊,还有就是被观察者啊发送通知,所有注册的观察者呢都会收到信息。
这样呢就可以实现一个广播机制。啊,它的缺点就是如果说我们的观察者非常多的话,那么所有的观察者收到被观察者发送通知的时候会耗时比较多。😊,第二点呢就是如果被观察者如果有是有这个循环依赖的话呢。
那么被观察者发送通知会什么呀?使这个观察者。产生循环调用,导致咱们的系统出现问题啊。那么观察者模式常见的场景。包括了以下几个啊,当一个对象状态的改变,需要改变其他对象的时候。可以采用观察的模式。
比如说商品库存数量发生改变的时候,需要通知商品详情页啊,购物车等系统改变数量。再一个就是一个对象发生改变时,只想要发送通知,而不需要通知道什么接收者是谁这种情况啊,比如说这种订阅微信公众号的文章啊。
发送者发送者呢通过公众号发送订阅者呢并不知道哪些用户订阅了公众号啊。第二个呢就是第三个呢就是需要创建一种链式触发机制的时候,比如说啊在系统当中触发一个创建一个触发链。
那么A对象的行为呢将影响B对象B对象的行为呢影响C对象。这个时候呢,我们可以采用观察者模式。😊,第四个的话呢就是微博或者微信朋友圈发送的场景,这个也是观察模式比较典型的一个场景了啊。
那么一个人发微博的话呢,呃或者是朋友圈,只要关关联的朋友都会得到通知。一旦取消呢,那么这个人以后呢就不会接到相应的通知了。😊,这是我们说观察者模式的使用场景。OK以上呢其实就是对于这道面试题啊。
介绍一下观察者模式的这个讲解啊,希望呢能够帮助到同学们。😊。

系列 6:P143:装饰器模式与代理模式的区别 - 马士兵学堂 - BV1RY4y1Q7DL

同学们,大家好。接下来呢我们来看一道来自于百度的面试题。😊,装饰器模式与代理模式的区别,对应的薪资呢是25K,对应的岗位是高级开发工程师。那么首先我们先来看代理模式。代理模式呢。
是这个它的原始定义是让你能够提供对象的替代品和其暂位符啊或其在位符。那么代理控制着对于原对象的访问,并允许将请求提交给对象前后进行一些处理。其实我们这个代理对象呢,它的一个作用呢就是用来去啊代理一个啊。
我们不希望什么呀?这个不适合或者是不能够直接引用的一个目标对象。然后呢把代理对象呢作为访问对象和目标对象之间的一个中介。

那么代理模式它适用的场景呢有这么几个。首先呢第一个是功能增强。啊,当需要对一个对象的访问提供一些额外操作的时候,我们可以啊使用代理模式。还有一种是远程的代理。😊,那么实际上呢,这种IPC框架呢。
也可以看出是一种代理模式。啊,golf的设计模式一术当中呢,把它称作叫做远程代理。那么通过远程代理呢,将网络通信、数据编码、这个数据编解码等细节呢给它隐藏起来。客户端在使用这个IPC服务的时候呢。
就像使用这个本地函数一样,无需了解跟服务器交互的一个细节啊。😊,还有就是防火墙代理。啊,当你将这个浏览器配置成使用代理功能的时候呢,防火墙就将你的浏览器的请求呢给它转给互联网,对吧?
当这个互联网返回响应的时候呢,代理服务器呢再把它转给你的浏览器。还有呢就是一个保护代理啊,它可以用于控制一个对象的访问。如果需要呢,可以给不同的用户呢提供这种不同不同级别的级别的这种的使用权限啊。
然后我们再来看一下装置。😊。

装饰模式啊或者装饰器模式啊,装饰器模式。那么它的原始定义是动态的给一个对象添加一些额外的职责啊,就扩展功能而言呢,装饰装饰器模式呢提供了一种比使用子类更加灵活的替代方案。
其实装饰器模式呢主要还是用来去替代这种啊子类的啊,就替代这种继承的啊,那么。😊。

呃,装装饰器模式的适用场景呢包括了啊快速的动态扩展和撤销一个类的功能场景。比如说有的场景下对API接口的安全性要求比较高,那么就可以使用装饰器模式,对传输的字符串数据进行压缩或者加密啊。
还有呢就是在一种在这种的不支持继承扩展类的这种场景,对吧?比如说我们这个使用了final关键字的这种类,它就是无法继承的对吧?好,那么那么最后我们来看一下装饰器模式和代理模式的一个区别。
对于装饰器模式来说呢,这个。😊。

装饰者和被装饰者呢都实现同一个接口。都实现同一个接口。而对于代理模式来说呢啊代理类和真实的处理类它都实现什么呀?同一个接口啊,那么从这上面来看呢,他们之间呢好像这个呃。😊。
他们的定义的边界呢是比较模糊的。但是呢啊。😊。

我们可以看一下他们的一个。具体的区别啊。首先呢这个装饰性模式呢,它强调的其实是增强自身自身啊,在被装饰之后呢,你能够在被增强的类上使用增强后的功能。那增强后的你呢,其实还是你,只不过呢你的能力更强了。
而代理模式不一样,代理模式强调的是让别人帮你去做一些你本一些什么本身与你业务没有关系的一些资责。比如说记录日志啊,设置缓存呢这些。😊,啊,那么代理模式呢是为了实现对象的控制啊实现对象的控制。
因为呢被代理对象呢往往是难以直接获得,或者是其内部呢不想被他暴露出来,OK吧,这是他们之间第一个区别。😊,然后第二点就是啊这个装置性模式呢是以对客户端透明的方式去什么呀?扩展对象的功能。
是继承方案的一个替代方案。而代理模式呢则是给一个对象提供一个代理对象,并由代理对象控制对原有对象的一个引用。OK吧,还是我们代理模式呢,它更强调的是控制,对吧?那么装第三点啊。
装饰器模式呢啊是为装饰的对象呢增强功能,而代理模式呢是对什么呀?对这个啊。代理的对象去施加控制啊,一个是增强功能,一个是私加控制。对吧啊,好,那么这是我们说装饰器模式和代理模式的一个区别啊。
以上呢就是针对于这道面试题的讲解啊,希望呢能够帮助到同学们。😊。


系列 6:P144:JDK 类库常用的设计模式有哪些 - 马士兵学堂 - BV1RY4y1Q7DL
同学们大家好,接下来呢我们来看一道来自于百度的面试题。CDK内库常用的设计模式有哪些?对应的薪资呢是25到30K,对应的岗位是高级开发工程师。😊。

那么我们先来看第一个抽象工厂模式。在这个ZDKZDK类库当中呢,有一个document build factory这样的一个抽象类。它有一个方法就叫做new instance方法。
注意这个方法它返回的其实是一个什么呢?一个工厂的实力啊,也就是它的一个啊具体的一个实现类啊,这是我们说抽象工厂模式,然后呢还有建造者模式啊,那么stream builder。😊。
这个类呢它就用到了监测者模式。那么它是一个final类,它其中有一个判断方法啊,那这个方法呢它是接收一个什么接收一个啊字符串。然后呢,这个方法就是啊根据现有的字符序列和追加的这个字符。然后呢。
通过这个系统的拷贝方法去生成一个新的字符序列。😊。

啊。然后。还有工厂模式。工厂模式的话呢,这里边它有一个number。

formar这样的一个抽象类,它有一个方法,get instance方法,返回的是一个number of类型的子类啊,那么我们可以通过这个get instance方法啊,然后呢来去什么呀?
获取这个number format抽象类,它的一些子类实现啊。好,然后还有就是原形模式。原形模式的话呢是我们可以通过这个object类它的克隆方法啊,来去根据现有的实例呢来去。😊。


克隆一个啊前拷贝,返回一个前拷贝的对象,这是原形模式。

还有一个单立模式。单列模式的话,这里它有一个runtime类啊,runtime类。😊,它有一个get轮胎方法啊,那么它的作用呢是。返回一个当前和当前java应用关联的这个runtime对象。
那么每一个运行的。java应用呢它都会有一个唯一的runtime类的一个实例。

这是大力模式,然后再来看就是这个适配器模式。啊,识配机模式。这里边呢有一个俄瑞斯这样的一类啊,那么这个类呢它其实是一个数组工具类啊,包含了大量的对于。数主操作的方法,它有一个as list的这个方法。
那么这个方法呢,它其实是它的作用呢是将一个。传入一个什么传入一个啊数组,把它转为一个list。啊,转为一个list。那么这个里边呢就是我们可以使用这个通过这个方法啊。
我们可以使用list类的操作呢来去操作速度对象。但是呢是不能使用这个ADDre的一些操作的。因为返回的list的它的底层是基于数组的那数组结构是不能够更改的啊。
所以呢这个list类呢啊大家可以看看作是一个适配器。😊,那么通过这个适配器呢,对数主的直接操作呢,我们把它变为一个间接操作。

OK那这个就是这个适配器模式啊,那么以上呢就是CDK内库当中的常用的设计模式。我们这里边呢介绍了这个6种啊。好,那么。😊。



上面呢就是关于这道面试题的讲解啊,希望呢能够帮助到同学们。

系列 6:P145:Mybatis框架中使用的设计模式有哪些 - 马士兵学堂 - BV1RY4y1Q7DL

同学们大家好,接下来我们来看一道来自于百度的面试题。😊,买 base框架中使用的设计模式有哪些?对应的薪资呢是30K,对应的岗位是高级开发工程师。那么首先我们先来看第一个就是build模式。

build模式。那么在myb的环境的初始化过程当中呢,这个circle session factory builder会调用这个叉m configurefi build读取所有的myb map map configurefi点叉m和所有的这个m文件。
那么去构建my base运行的核心对象,就是configuration这个对象。然后呢将这个configuration对象呢作为参数构建一个什么啊circle sessionfactor对象。
这是我们说的buil模式。然后呢。😊。

是工厂模式。工厂模式呢,在买贝斯当中呢,它比如说这里边有一个circle session factory,它使用的就是工厂模式啊,那么它其实就是一个简单的工厂模式啊。
那么circle session可以认为是买贝斯工作的核心接口。那么通过这个接口呢可以执行这个circle语句获取mper啊管理事务等等的。那么我们就是通过这个。😊。
circle session factory来去获取这个什么来去获取这个circle session啊,还有就是单列模式。在买 base词当中呢,有两个地方用到了单列模式,一个是i contest。
一个是log factory啊,factor啊,那么i contest呢,它是用在每个县程范围内的单列啊。
用于记录这个该线程执行的环境的执行环境错误信息而log factory呢它是提供给整个买 base去使用的日志工厂啊,那么这是单列模式。😊。


然后呢,还有就是这个代理模式。那么代理模式呢,我们可以把它认为是买b的核心使用的模式。正是因为有这个模式呢,我们只需要编写麦搏接口,不需要编写这个实现。
而是由什么咱们买b后台帮助我们去啊完成这种啊具体的scle的执行。其实它使用的就是这种代理模式啊,然后呢还有就是识配型模式了啊,那么在买b的这个loging包中有一个loggo接口啊,那么这个。😊。


接口当中呢定义了买b直接使用日志的一些方法啊,那么而log接口它的具体是由来由谁来实现呢?那么买b呢提供了多种日志框架的实现。😊,啊,那么这些实践呢都匹配这个loggo接口所定义的方法。啊。
那么最终的话呢就是实现了所有的外部日志框架呢到买b日志包的一个适配啊,这是适配器模式。


OK以上呢就是对于这个买杯子框架当中的设计模式有哪些的一个讲解啊,希望呢能够帮助到同学们。😊。

系列 6:P146:Spring框架中使用的设计模式有哪些 - 马士兵学堂 - BV1RY4y1Q7DL

同学们大家好,接下来呢我们来看一道来自于百度的面试题。😊,词人框架中使用的设计模式有哪些?定的薪资呢是30K。对应的岗位是高级开发工程师。那么首先呢我们先来看第一个就是简单工厂模式。
那么简单工厂模式对应的就是我们的这个B factory。ssp当中的be factor呢就是简单工厂模式的体现。😊,根据传入一个唯一的标识来获得并对象啊,但是。啊,是否。
在这个传入参数后创建还是传入参数前创建。这个呢需要根据具体的情况来去决定。第二个就是工厂方法模式。那对应的就是我们的factor bin这个接口。实现了这个factory bin接口的 bin呢。
它被叫做是factory病。它的特点是我们spring会在使用get病调用获得get病时,那么会自动调用get病的get object方法。😊,所以返回的并不是factory这个 bin。
而是这个bin的什么get。

哦们这个的方法呢返回置。然后呢,就是单立模式。那spring依赖注入病,它的实力默认呢是单立的。spring的依赖注入都是发生在这个abstract binfactororyge bin里面。
get病的多get病方法,调用get single。sing,然后呢进行什么bin的一个创建。

还有呢就是适配器模式。

springMAC当中呢,它的适配器handle adapter。😊,那么。handler adapt呢使用handler的扩展,使得这个handler扩展呢变得更容易。
那么只需要增加一个新的handler和一个对应的handler adapt就可以了。😊,因此呢,spring定义了一个适配接口,使得每一种conttrol呢有一种对应的适配器时间类。
让这个适配器呢去代替conttrol去执行相应的方法。这样呢再去扩展conttrol的时候呢,只需要增加一个适配类适配器类就可以完成什么sprintMC的扩展了。😊。

还有就是这个装饰器模式。装饰系模式。那spprint当中用到这个装饰系模式或者是包装系模式呢,它类名上有两种体体现啊,一个是一个是类名当中包含这个rappper的。
还有呢就是类名当中包含这个deator的,我们都可以啊这个。😊,认为他是使用了这个装饰器模式。那么使用这个装饰模式呢,可以动态的给一个对象呢添加一些额外的。这个职者。那么。对于这个增加功能来说呢。
我们使用这个装器模式呢要比生成子类呢更加灵活。

还有呢就是代理模式。那么AOP的底层就是动态代理模式来去实现的。然后呢,观察者模式。spring基于观察者模式呢,实现了这个自身的事件机制,也就是这个叫做事件驱动模型。
实验驱动模型呢也通常可以被理解为是观察者模式或者是发布订阅模型啊。

然后就是策略模式。

s框架的资源访问这个ressource接口呢,这个接口呢提供了更强的资源访问能力。😊,但是这个接口呢它本身没有提供任何这个访问任何底层资源的实现逻辑。😊,针对不同的底层资源呢。
spri呢它就会提供不同的是吧,提供不同的resource的实现类。然后呢,不同的这个时间类呢,他就。负责不同的什么资源的访问逻辑。

这是我们说的策略模式。OK以上呢就是针对于这个sm框架当中的使用的到德这个设计模式的一个这个面试题的一个讲解。😊。

那么针对于这样的一个面试题呢,其实如果同学们想要回答的更好的,就应该深入的对其中的某一个设计模式呢来去进行一个详细的解答啊。如果说我们只是把每一种这个设计模式呢给它介绍出来,介绍出来的话呢,那么。😊。
可能呢并不会让面试官去满意。所以呢我们可能要花费一些时间,对其中的某几个或者某一个这个设计模式呢进行一个深入的一个了解,看看这个sp当中是如何去使用的。然后在回答的时候呢啊。
基于源码呢更详细的去给他进行解答。😊。



OK以上呢就是对于这道面试的讲解啊,希望呢能够帮助到同学们。😊。

系列 6:P147:Elasticsearch是什么 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们来看下面一个问题,ellect search是什么啊,相同的问法呢,还包括你对ellect search的理解是什么,或者介绍一下ellecticse。那么这道问题呢来自国美。
那对应的岗位薪资呢大概在15K左右。那下面我们来看一下这个问题如何来回答。呃,首先呢这是一个比较简单入门的问题啊。如果面试被问到了此类问题呢,呃我们切记啊呃切记去。啊,是这个忌啊是忌讳的忌。
我们切记呢去死记硬背它的这个概念啊,不管是你从互联网上或者说官方网站啊搜到的这个概念啊,咱们千万不要去死记硬背。呃,这样给面试官的感觉呢,就是你在考呃你在面试的时候呢,是一时突击的啊。
没有真正的理解拉se是什么?好,那么我们在呃回答此类问题的时候说呃要注意以下几个点呃,我们可以从不同的层面来回答这个问题。首先呢比如说我们可以呃从概念层面呢,我们抓住几个点就可以了。呃。
首先呢比如说呃拉 search呢,它是一个由java语言开发的。那么基于losing的这是两个点啊,一款。分布式的这个存储引擎或者搜索引擎。呃,那么在这里边呢抓住这两个点,首先是java语言开发。
第二个是基于lu。那么它同时呢又是一个搜索引擎。呃,网上有很多说呢拉se呢,它是一个搜索引擎其实是不太全面不太严谨的比如说呢这是拉 search那么搜索引擎呢。
它应该跟拉 search呢是一个这么这么一个关系啊,因为搜索引擎呢不单单是包含了这个搜索还有它其实还包含了聚合分析和存储这三个大的功能啊,也就是说呢搜索只是其中的一小块功能。那么搜索引擎呢啊。
就是下边这个方块呢,它其实除了搜索啊除了这个搜索服务之外呢,还包含了一些细分的学科,比如说thon爬虫啊,比如说RP啊自然语言处理,比如说大数据处理BI等等等等。么正确的这个如果严格的来说呢。
应该是这么一个关系啊。那这些呢其实你在面试的时候呢都。可以和这个面试官呢去聊啊,这些都是没有关系的。呃,理解了他的概念,然后你可以在你的理解之下呢,用你自己的语言去描述。
描述的不那么那个全面是没有关系的。呃,如果面试的时候呢,被问到了此类问题,一般来说呢都是作为呃非搜索岗位呢呃问到一些关于la search。那dela search呢,它会作为一个加分项啊。好。
那么理解了这个el拉 search之后呢,呃咱们除了这个。呃,除了这个概念层面啊,你还可以把它理解为一个分布式的数据库。好,我们来看啊,我们来看我这儿呢启动了一个lar search的服务。

好,那么如果我们把它类比呃关系性数据库呢,好,我们来看啊,我这画了一个红色的方块。好,我们可以把这个方块里边呢,这个叫test index的啊,这个索引呢理解为my circle中一张表。
那么和my circle不同的是我们的ellect search呢,它是天然支持分布式的。好,我们看到左侧的这里边呢有6个节点。也就是说我们的这个表呢是分布在不同的呃节点上呢?好。
里边你看到这些绿色呢是分片啊,我们后边会说好,这就是它的天然分布式的特性。那除此之外呢,它还具备了一些你像高性能啊高可用啊易扩展易维护等等这些特点。何为高性能呢?好。
我们的ES呢是可以在PB级的数据前提之下呢达到一个秒级查询啊,秒级的查询。这个呢是可以这个和面试官去聊的啊,PB级的数据啊,就是TB就是1024TB。

啊,10啊1024TV就是1PD好,那这是它的一个高性能。那么高可用呢就是说我们在不同的我们在呃很多个集群呃很多个节点组成一个集群的前提下呢,我们可以方便的去进行。呃,一系列的这个高可能策略啊。
让它保证它的服务的可用性。那么易扩展呢是它的另一个特性。就是说当我们的这个服务呢呃达不到我们的性能要求的时候,我们可以非常方便的进行横向扩展。
那么易维护呢就是呃先天的ES为我们提供了非常方便的这个运维的一些支持啊,基于这些特性呢啊我们可以把这个ES理解为一个天生的支持高可用分布式的啊,呃支持高可用高性能易扩展的这么一个分布式的数据库。好了。
它还有一些你像这种跨语言和跨平台的特性呢,使它支持了目前呃几乎所有的这个主流的编程语言。你像java、 faceshoppythonGP还有go等等等等啊,并且呢ES呢它是天生支持这个跨平台的啊。
你可以非常方便的在linux windows和mic OS啊,这这个多个系统上进行部署。呃,同时呢它又是支持多呃多种数据结构的。你像这个结构化的或者非结构化的数据啊,还有地理位置搜索等等。呃。
这里边呢有一个非需要大家去记住的一个叫啊它是一个非关系型的。嗯,非关系型的这是需要注意的啊,它和myro最大的区别就是它是非关系数据库。还有一个非常重要的概念啊,叫文档型数据库。啊。
看啊注意是文档和数据库图为文档和数据库呢。好,咱们呃还是拿my circler来举个例子。那么这是咱们看到的my circlercle呃非常简单的一张表啊,就是一个商品表。那么它有名称啊,有描述有价格。
那么呃在my circler中呢,我们存储数据的方式呢,是以行为行这个行的方式来存储。那么当行啊就是你的数据的这个字段数量确定了之后呢,其实你的行的宽度就确定了。
因为我们在my circle中呢去创建数据之前,我们首先要对每一个表呢去呃创建它的这个表结构。

喂。啊,在这里啊,那么每一个字段啊,当字段的数量确定了之后呢,每一个字段的宽度啊也就确定了。也就是说你行的宽度也就确定了啊,这样的话就是说呃。
也就是说这个我们my circlercle和这个ES最大的区别就在于它存储方式的不同。好,我们可以看到当前啊我打开一个界面。那么当前这个界面呢叫做d tools啊。
咱们可以把它类比为我们my circlercle的客户端,也就是比如说啊以我当前打开的这个 circle或者说把它理解为咱们经常用的这个叫啊都是可以的那这个 tools呢是可以我们可以在里边去写我们的查询语句的。
比如说我们当前啊写了一个非常简单的语句呢,我们可以看到当前的这个返回的上下文,这里边呢是给我们返回了一些查询的结果。好,我们可以非常方便的看到这里边返回了10条数据啊,当然这是默认它返回了1条数据好。
我们打开一条数据呢可以看到这里边的数据呢,它实际上是一个jason的格式啊,是一个jason的格式好,那这个是和我们作为关系数据库一个最大的区别啊。啊,它的存储方式是不一样的。






好。好,那这是关于它的一个呃使用的一些特点啊。那么下面呢ES呢,其实它有一系列的这个使用场景啊。呃,这个是关于此类问题啊,我们也可以和面试官去聊的一些话题。那首先呢呃。那个比拉迪 search呢。
它是支持呃搜索呃聚合以及存储三大功能的。那么其实它最典型的功能就是全文检索啊,也就是搜索呃,它在搜索这一方面呢,其实它的性能是无可撼动的啊,可以说是呃无人可以那个无人可以出其右啊。
就是这么一个绝对的霸主的地位。那么它的性能呢是达到了一个PP级的秒级PP级数据的秒级查询。那么几乎可以这样说呢,就是在目前的互联网公司呢,几乎没有一家公司,它是用不到这个搜索功能的。
那么而如果只要你有这个搜索功能呢,你几乎就可以用ES来做啊,甚至可以说ES是你做搜索功能的不二之选啊,毫不夸张啊。那么你像你打开你的手机APP打开你的手机呢,你可以看到你手机的APP呢。
几乎没有一个软件呢是没有搜索功能的啊,甚至你可以比如说你在你的负一屏或者你上滑,很多地方都可以看。到啊搜索的影子啊,那你比如说咱们经常用的这个全文搜索引擎,百度知乎啊,vivo CSDN的像一些呃。
垂直领域,比如说导航外卖啊,这种团购软件。那么他们都有一个地理位置搜索。比如说基于一个定位呢,搜索方圆10公里范围之内啊,对吧?这种搜索场景是非常常见的。比如说当前一个呃你的手机APP打开呢。
呃我们都会首先确定你的位置,那么基于这个位置呢,我们可以查找方圆,比如说10公里范围之内啊,我们去可以画一个圆是吧?好,我们可以判断一系列的这种地理位置搜索的这种呃这种业务啊业务场景。
那么还有呢比如说以京东啊,淘宝为代表的这种电商类,或者说其他的品类的这种垂直搜索,还有咱们经常用到的这种呃音视频软件啊,像B站抖音啊,或者说腾讯课堂这种软件呢都是啊一样的。
还有咱们最常用的pi hubub。

好,那么除此之外呢,你像咱们经常用到的这种ERK日志系统啊,呃这个也是非常常见的一个典型的用场景。呃,当然了还有咱们的这个聚合分析。你像一些比较大的公司呢,都有数据分析部门啊。
就是商业智能business intelligencetel啊,这个有兴的有兴趣的同学呢也可以了解一下。

ok。
系列 6:P148:Mapping 是什么?你知道 ES 中有哪些数据类型 - 马士兵学堂 - BV1RY4y1Q7DL
OK我们来看下面一个问题。ES中的m品是什么?呃,在这个问题之上呢,其实还可以衍生出第二个问题。那你了解ES中支持的数据类型有哪些呢?这是一个来自阿里一面的面试题啊。
那对应的岗位薪资呢在15到20K左右。呃,下面我们来看一下这个问题,我们该如何来回答。好,那么很多同学呢不太理解makinging的呃概念啊到底是个什么意思?那么字面翻译呢m是映射。呃。
如果我们硬是把它翻译成中文呢,可能不太好理解。呃,我们可以把它类比为关系型数据库中的表结构啊这么一个概念。

好,那么我们还是以my circleq为例啊,我们看一下my circle的表结构中呢,包含了你像咱们经常见的一些呃像字段名称呢,数据类型啊,还有这个字段长度啊。
还有这个是否主建呢等等等等一些这个呃字段的属性啊。那么在ES中呢,其实它也是包含了以上概念的。你比如说数据类型啊,咱们来看一下ES中的my了。


好,那么我们当前看到的啊就是我们通过这个脚本查到的啊,这个结果里边包含了你像ming里边包含了propro呢里边其实就定义了一字段的一些常见属性比如说啊我们先把所有字段呢折叠起来。
比如说当前的这个索引中啊,包含了pretimeICLV name等等这些字段。那么每一个字段呢啊又包含了一些其他的属性。你比如说type这个字段类型是什么?好。
我们打开DIC呢里边呢又包又会包含一些除了t啊,我们看到还有一个field,那么field呢这个就是除了字段类型啊,在关系型数据库中没有的一些属性啊,就是子字段啊,甚至呢我们还可以往下看啊。
我们除了这个呢其实还有一些在关系型数据库中不会见到的这个属性呢,比如说啊分割器,比如说是否打开索引等等等等啊,这一系列的这个属性啊,那。最大的区别呢其实还是我们在定义的时候啊。
存储的数据结构呢是以这种jason的格式存储的啊,那这是和关系型数据库中最大的一个区别啊,那比如说还有分制器这个概念啊,ES中呢,就是在那个卖关系型数据库中呢啊也是没有的啊。

呃,咱们在面试的时候啊,如果被问到了腐类问题啊,咱们就抓住这几个点。首先呢呃它的文档格式是jason的。另外一个你可以提几个在关型数据库中没有的概念啊,比如说分配器啊,比如说这个子字道的概念。呃。
这些都是my circlel,它和my circle的一个区别啊。如果说呃让你去描述它是一个什么东西啊,你就可以这样跟面试官说,那么它有点类似于呃关系型数据库中的表结构,但是又有区别。
然后你把区别说一下就可以了。那么我们来看一下ES中ming它常见的一些参数啊。首先呢这个数据类型呢,咱们常见的数据类型呢。


当然了,有数字类型啊,数字类型呢和咱们呃java中常见的一些类型很像啊,你像long类型,int short类型,还有这个get类型,double类型等等啊,浮点型。那么最常见的类型。
第一个呢叫keyword啊,keyword呢其实又分为三种啊。那么咱们最常见的叫keyword啊,keyword呢它适用于精确查找而不适用于全文检索啊,就是它是不分词的啊面试的时候呢。
你能答上这一点就可以了。好,那么咱们还有这个content的 keyword和willcard,这个是那个用于通配符查找的。这个这个其实很那个是很不常见的一个东西啊,啊。
咱们记住有一个keyword类型呢,还有一个时间类型,时间类型呢就是data类型啊,还有这个别名,别名能答上来就行,答答不上来也没关系啊。那么最最最重要的类型呢就是tex类型,也就是文本类型注意啊。
这里边呢不是str啊,而是text。那么每一个tex类型呢默认都是要被分词的啊。





也就是说它的作用呢就是为了创建倒排索引,而倒排索引的作用呢是为了方便我们进行全文检索。那么这也是ES4啊,就是el拉 searcharch。它最最最最重要的一个功能,没有之一。OK好。
这是它最重要的一个类型啊,也是最常见的。那么下面呢除此之外呢,还有三种比较特殊的啊这个对象呃这种嵌套类型或者说是复杂类型啊。第一个呢叫object啊,第二个呢是max啊用于嵌套类型。
而joy呢是用于父子及关系的查找。那么三种啊三种这个类型呢,它们的性能是依次下降的。呃。

这个呢咱们不需要知道太多啊,那么这个因为其实用的不是相对来说,相对于t来说不是那么多的啊。那么达到这里其实就可以了。嗯,你要知道这三种特殊的这个对象的对象关系的这种类型,还有还有一些比较不是那么常见的。
你像如果我们用于地理位置检索呢,你像GUpointGU shift呢,这两种类型呢是用于嗯地理位置坐标啊,坐标这种查找的,还有cart啊,不是还有这种point存储点,还有shift存储几何图形。



好了,那么在ES中还有一个和嗯关系型数据库中一个比较大的区别啊。就是说咱们在创建关系型数据库的时候呢,我们在创建表之前呢?首先我们要定义表中包含哪些字段,其实表的字段固定了跟我们的行宽也就固定了。
那么和my circle最大的一个区别啊,不能说最大一个区别,一个很显著的区别呢?就是我们ES在创建数据啊,数据表之前,也就是索引之前呢,我们是可以不定义每个字段有什么类型?
就是说我们甚至可以不定义字段的数量。



好,我们什么都不用定义,直接就可以向数据库通啊,向索运中写入数据。比如说我们当前我们来查看一下get。

Cat。到NDIC我们当前这个命令呢是查看当前呃,集群中呢包含了哪些索引。我们可以在右侧啊很清楚的看到,那包含的索引呢一共有这么多。呃啊一共有这么多。那么我们比如说我们可以当前呢。
我们可以随便创建一个索引put,比如说叫test。啊,index啊随便给它起一个2,没这个肯定是没有的啊。DOC杠啊,那么大家如果不熟悉这个命令是在干嘛的啊,这个也没有关系。
只需要知道我当前呢是在创建数据就可以了。好,随便给一个value啊。那么我们创建了。好,我们可以看到当前的数据呢就已经created啊,已经创建成功了。那么我们可甚至可以查看它的表结构啊。
也就是ming。啊,它的表结构呢就自动创建了。那么这个自动创建的这个字段类型呢啊会根据你输入的这个内容呢动态的去判断啊,包括呢你看它有一个子字段呢叫keyword。

那么我们这种叫dynamic fieldmaking呢就是自动映射,也就是根据你输入的字段的值呢,自动的去创建ming啊,这里边呢如果我们输入的是数字类型呢,会给你创建一个浪类型啊。
如果你输入的是小数点类型呢,会那个创建一个f类型啊,这个映射的规则呢,就是我们当前屏幕上看到的这些啊,那这个呢叫dynamicmicmaking,这个是两种呃映射类型的,其中一种叫自动映射啊。
叫dynamicmic making。还有一种呢叫手工映射。如果面试的时候呢,问到了这两种映射类型的啊,那么我们要知道呢在生产环境中呢,我们一般用于手工映射啊,我们一般用手工映射。
因为啊如果你采取自动映射呢,它给你呃自动映射的类型呢,可能会有一定的资源浪费啊,不能完美的匹配我们的业务场景啊,也就是说可能会导致你的这个性能下降好,所以我们一般使用手工映射,就是在。


创建字段之前呢,我们手工去创建ming就是这么简单。好,这是关于ming的两种啊映射类型。还有呢就是映射参数。

那么这个映射参数呢不要求大家呢那个把每个字段都记住啊。那这里边呢像咱们可以动态的关闭嗯这个一些属性。比如说我们当字段上不需要进行检索的时候呢,我们可以把它关闭盗牌索引啊。
这样呢会节省一部分存储索引的空间。你像我们可以在每个字段上呢指定分词器,或者说指定评分的权重啊。当然了,这里边呢需要记住的有几个呢。好,我看看啊,其实这些呢呃咱们都没有必要呢去死记硬背啊。
甚至说你记不住的没有关系啊。呃,在使用的时候参看文档就行了啊,这个参数呃你只要知道就可以了。那么咱们关于ming的几个重点呢,首先呢是这个两种映射方式啊。第二个是咱们常见的数据类型。
第三个是你要理解ming它的一个含义是什么?它的作用是什么,以及呃这个参数啊,你们看我们看这个映射参数呃,什么时候会用到呢?在索引的调优啊,就也就是说呢咱咱们在后边这个题呢,我会详细的来说。





系列 6:P149:什么是全文检索 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们来看下面这个问题。什么是全文检索?那这是一道来自百度的面试题。那对应的岗位薪资呢在25到30K左右。好,那么下面我们来看一下这个问题,我们该如何来回答。啊,那什么是全文检索呢?在面试中。
如果被问到了这个问题,我们应该怎么回答呢?好,那么首先如果你被问到这个问题呢,你可以先抛出一个观点。好,全文检索就是会背分词的检索。好,那么我们经常啊使用的这个百度呢,还有google呢。
其实呢都是全文检索类的搜索引擎哈。那么比如说我们在呃百度中呢,我们以搜索一个关键词。比如说我们搜索一个alex search。


好,那在百度搜索返回的这个结果啊,这个结果列表里呢,上面呢有一行很小的文字。好,看这里。🤧。百度为您找到啊相关结果约1亿个。好,那这里边有两个关键点啊。首先呢这个1亿这个数字呢。
有没有人去质疑过这个结果的准确性呢?好,那我相信大家嗯几乎所有人呢都没有去质疑过啊。那么其实质一也没有用啊,也没有什么意义。因为这个数字其实对我们来说呢是不太关心的。
而另外一个关键点呢就是这个相关二字啊何谓相关的啊,我们看百度为我们召回的这个结果列表啊,有很多条这个网页的这个t头。那么最下方呢又有很多个分页啊。
我相信大家呢啊几乎所有人呢可能啊最多呢也就翻到第一页第二页第三页,甚至很少有人啊去访问到10页以后的数据啊,那么对于老师而言呢,其实我只看第一页第二页数据啊,甚至第三页我都没有看过。


好,那么除了广告啊除了广告之外呢,其实那么搜索引擎呢默认为我们返回的结果就是召回的这个列表。那么它是按照相关度进行排名的。那么何谓相关度呢?那么简单的来说呢,相关度呢就是搜索引擎。
按照这个结果和你搜索关键词的预期结果的匹配度。好啊可能抽着听着比较抽象啊,我们来看一下这个相关度的概念。


好,那么提到相关度呢,我们不得不提到两个呃这种概两个关键词,一个叫搜索,一个叫检索。它们两个的区别。那么它们两个的区别在于哪儿呢?其实呢呃他们的主要区别呢就在于这个查询条件边界的界定上。

呃,面试的时候啊,你可以先把这个词啊,先把这个概念给它抛出来。何为查询条件的边界界定呢?好,我们来看一个例子啊,呃,比如说我们有这样一张那个mysl中的有这样一张表。呃,如果说我们执行是查询。
就是搜索啊搜索,那么搜索呢是有明确的查询条件边界的。比如说我们搜索呃价格在1000元以下的这个手机。那么其实呢这个priice的区间,就是有明确的上下边界的,就是0到呃1000嘛。
因为这个价格是没有负数的。就比如说我们要搜索千元机,那么可能千元机的这个界定范围呢就是1000到2000元,或者说价格5000元以上的手机。
或者我们搜索类型为手机或者类型为耳机或者时间在2022年2021年或者2000年。好,那么每一个条件呢它都是有一定的查询条件边界的。即便你使用like查询。那么其实呢它也是有边界条件的好。啊。
因为那个你即便使用这个某个查询呢,它匹配的结果也一定是一个固定的值。而我们啊如果使用检索,检索是什么呢?检索是讲究相关度的。也就是说呢你查询条件可能是完全相关,也可能是部分相关。
那这个相关度呢设计的这个领域方面呢就有很多。比如说我们换一个搜索词啊,我们搜索一个叫霸道。

创造啊。

,那么霸道的本意呢其实是一个比较凶残,比较不讲理的这么一个意思啊。那么但我们在搜索结果里边呢,排名最靠前的居然是这个普拉多这个车。那么大家很多人可能那个对车比较感兴趣的同学呢,都知道这个普拉多呢。
就是啊这个霸道就是普拉多的一个别名啊,就是喜欢车的人呢,喜欢这么去叫。呃,那像此类呢词呢就是你像呃这种霸道呢是它的一个昵称或者别名。那么相关度这个概念呢,除此之外呢。
还有你比如说英文名字啊呃拼音呢或者是混淆词啊或者是错别字啊啊,这些呢可能都是他们有一定的相关度的。你像霸道和普拉多这个相关性呢,就在于它是它的呃或者叫别称。好,那么这个其实呢就是一个相关度的概念。
那么比如说我们打错一个字。那么它也能搜索这个结果,或者说我们搜索苹果手机。那么给出的结果列表里呢,不仅仅有苹果手机,还有。


苹果这个吃的这个产品啊,就是这个水果嘛。那么其实呢如果按照此类说法呢,其实苹果手机,那么它的分类是手机,而这个苹果的这个吃的这个水果呢,可能它的这个分分类呢就是一个水果,按照这个搜索来说呢。
那么你搜索的要么就是手机,要么就是水果。因为这个分类的这个条件是确定的。而如果我走全文检索的嘛。那么不管是手机啊或者水果呀,或者说一些其他的啊,或者在颜色上有相关性呢,或者说在别的昵称上有相关性的。
它都会被展示出来。那么但是每一个呃品类的这个搜索结果,它的相关度啊,它的权重是不一样的。啊,这个就是所谓的相关度。



好了,提到这个概念,就是说如果说面试中啊,提到全文检索,你可以先把这个概念给抛出来。那么下面呢我用图解的方式呢给大家讲解一下什么叫相关度啊,什么叫全文检锁啊。那么比如说啊我们当前有这么一个例子。好。
我们看到呃屏幕中呢右边呢有一个二维的表格。那在这个表格中呢啊在这个表格中呢有一个字段叫ID啊,还有一个字段叫product。那么咱可以把这个表格呢理解为它是一个电商平台的产品的信息表。
那么这个产品每个产品呢有一个商品标题啊,就是product,还有一个描述字段。

好,那么在这个字段中呢,假如在这个表格中呢,假如说我们要呃有这么样一个需求。呃,假如说用户在你的电商平台呢顶部搜索框呢搜索了叫小米NFC手机这个关键词,那么我们势必要拿着这个关键词呢。
在当前这个字段叫pro这个字段呢去做全表扫描。好,如果我们使用这种呃my circleq的like查询是吧?那左边右边加版分号,那其实它是存在一系列的问题呢?全文检索是怎么做的呢?
首先全文检索会在当前这个字段上啊,在你创建数据的时候去创建分词。那这个分词的创建过程呢,咱们来简单的去描述一下啊,当然这里这个过程呢我是简化了的啊。那么后面在讲到牌索引的时候呢,我们会详细来讲。
那么全文检索呢,首先创建倒牌索有这个过程啊。那么假如说呢这个title字段就是咱们刚才那个电商表格中的这个。产品的那个标题字段啊,那么咱们这儿呢以英文为例来举个例子。那么面试的时候呢,你也可以这样去说。
好,首先呢咱们把倒排索引的创建过程简单的描述一遍。首先呢第一步呢倒排索引呢会在你当前检索的这个字段呢进行切词啊,就是word segmentation啊,你可以把这个概念抛出来。
word segmentation呢会把你当前字段的value一个一个的切成词项啊,就是按照这样啊英文默认的分词器呢,就是按照这样分词。那么每一个单词呢就是一个 termTERM就是词项。好。
那么把我当前字段所有的这个呃这个值呢全部拆分之后呢,好,那么我们就形成这么一个一堆词项啊,那这个不是一句话啊,它是一个一个的词项。那么第二步呢。🤧好,我们的ES呢啊其实底层是loing啊。
那么它会把当前这所有的词项呢进行normalization,就是规范化。何为规范化呢?nmalization呢会把当前的这个分词啊大小写统一,包括这种时态进行统一。那大小写全部统一成小写。
那么什么现代分词过去分词呢全部统一成现代式,就是没有什么ING啊ED啊,全部去掉。比如说像这种made啊会给它变成make,你像有china,有chese通通变成小写的china。
那这样的话我们就会降低我们的搜索成本。好,这是它的第二步。好,那么第三步呢就是去重。那比如说我们这儿有一个china,那这儿有一个china。那其实在我们汇总成词项列表的时候呢,只有一个词项。
然后最终按照字典序进行排序啊,放在一个叫pro diction叫词项字典的这么一个列表里。既然是字典肯定显然是不允许重复的啊,那么这个无视就行了啊。那么词项后边呢有一个叫posting list。
这里边啊这个东西呢叫倒排表。那么所谓倒排索引啊,咱们可以简单的理解为词项到。项字典啊,到这个倒牌表的一个映射关系。好,我再用大白话说一遍呢,这个postsing list里边存放的这些数字呢。
就是包含了当前这个词项的原数据的ID集合。好嗯。😊,倒排索引呢,咱们可以简单的理解为词项倒包含当前词项的这个文档ID的一个映射关系,它就是道开索引。好了,咱们知道了倒牌索引之后啊。
咱们再回过头来看这个全文检索呢。如果说还是咱们刚才这个需求呢。好,那么首先呢这里边是中文啊,咱们姑且认为分词器呢会按照这样一个逻辑进行分词。好,用户搜索词呢叫小米NFCP手机会被分成三个词项。
那么我们当前这个倒牌表啊,这个原数据呢这个字段呢也会按照一定的规则进行分词。好,那假如说左左下方的这个表格呢,就是原数据分词的一个结果。好,那么假如说我们包含了若干个词项。好。
那么当用户搜索请求打到我们的索引上来的时候呢,首先呢ES会把你当前拆分的123这三个词项分别在倒牌索引中进行检索。比如说我们当前第一个那个词项呢叫小米。那么命中了这个倒排,命中了这个词项之后呢,好。
我们当前只用了一次查询,就查询到了。比如说我们原数据有10亿条数据,对吧?那么这10亿条数据包含当前词项呢,可能123578910可能有上百万条数据或者说更多啊。那么我们只需要一条数据。
我们就查询到了这10亿条数据,哪些数据和这个词项有关系。对不对?好,那么第二次啊第二个查询呢就是拿着第二个词项,小米NFCC这个词项进再次进行啊在这个倒排这个词项字典里边进行查询。好。
那么比如说这个NFCC呢啊在这儿呢匹配到了,我们也是标记个对勾。当刚才也是标记的对勾,以此类推啊,手机第三个词项,我们依次啊在此项字典里边进行检索。那么假如说啊这个手机在这个位置我们也进行匹配啊。
并且命中了索引。好,那么也就是说呢我们只用了三次查询啊,三次三次查询,这是最呃最理想的一种情况。三次查询呢就命中了三条索引,并且得到了10亿条原数据的表中,哪些数据和我们当前这个查询有关系。对吧?好。
那这样的话,我们把这些ID呢做一个统计。好,在右侧这个啊注意看啊,右侧这个字段呢叫匹配数。我们来标记一下当前匹配了多少。好,那么我当前说的这个匹配数呢,咱们可以把它简单的理解为相关的这个概念。
当然相关度它是比较复杂的啊。呃,咱们只是把这个过程简化了。好,我们来看。ID为一的这条数据呢,在此次请求中呢被匹配到了几次啊,一次吧,两次吧。好,那么我们标记为2。
那么ID为2的这个数据呢哎一次两次3次。好,也就是三以此类推,我们被匹配到的原数据呢一共也只有1234这么4条数据。那么他们被匹配到的数量呢分别是2321,我们按照匹配数进行早序排名,匹配的最多呢。
我们把它排在第一位。也就是说它被排在第一位。然后它被排在第二位,它被排在第三位,它被排在第四位。好,那么我们就可以把当前这个排名呢理解为相关度的排名。好。
我们可以按照人类的思维逻辑来看一下这个结果是不是最符合我们的预期结果呢?首先用户搜索的三个关键词,小米NFCC手机,也就是我有三个用户有三个需求。牌子要小米公能要有NFCD,并且我搜索的产品手机。
那么我们可以看啊。🤧那么当前呢右边这个产品呢,只有第二条数据同时满足了三个条件。品牌NSC和手机。而一和三这两条数据呢分别只满足了。第一个只满足了小米这个牌子。好,并且它是手机,但是没有NFC功能。
而IDID为三的这条数据呢,它有NS这个功能,并且也是手机,但是没有小米这个牌子。那么第四的最后的一个呢,它只有小米这个牌子,甚至连产品就不是手机。那么我们可以看到呢。
其实这个排名呢就是这个顺序呢就是呃我们当前这个和我们当前用户搜索的这个请求相关联最密切的一个顺序啊。那么首先那ID为一的ID为2的这条数据排在最上面,就是最符合我们当前用户搜索的这个预期结果的。
那么也就是说这个也就是所谓的相关度了啊。那么当前这个检索的过程。你看首先。我当前这个原数据字段呢是会被分词的。我当前搜索词这个小米AFCC手机它也是会被分词的。
我们依次拿啊每一个用户搜索词分词的结果去匹配到开索引。这个过程呢就是全文解索。好,那么到这儿呢,全文检索我已经给大家讲明白了。如果面试的时候呢。呃,你跟那个监考官聊的时候呢,可以用自己的语言整理一下啊。
把这个话把这个招牌索引啊怎么创建的,还有全文检索这个过程呃,是如何去检索的那这个问题就已经差不多了。好。

系列 6:P15:compare and set(不具备原子性) - 马士兵学堂 - BV1RY4y1Q7DL
好看,这里其实最关键的是在于这就是compare and set,到底具不具有原则性,这是什么意思,好听同学们,你们想看,作为一个从零,然后把它改成一,又把一写回零的过程,注意写回零这个操作。
往回写的这个操作,这个操作是什么操作呀,这个操作叫compare and set,也就是说它是它有两步,第一步是什么,第一步是判断哥们儿,你是不是现在这个值是不是依然为零,唉如果你是依然为零的话。
那么我这个时候把你从零变成一,注意这是两部,同学们,你们想想看,如果这两部中间被打断了,比如说我这个线程正好判断哥们儿,你是不是依然为零,目前目前它依然为零,然后还没有把零改成一呢,由另外一个线程过来。
已经把这个零给改改成改成八了,接下来你执行零变成一,结果又把这八变成一了,这明显不是你想要的结果,这肯定是不对的,所以如果你想compare and set这件事能够完成的话,还有一个很关键的操作。
就是这个compare and set必须得是原子性支持,就这个中间不能打断,来能get到这点,同学老师扣一,对啊没错啊,你说的非常对,那么它到底是怎么支持的呢,仔细听看这里有同学说。

老师我这没法干了呀,虽然我知道跟跟到cs了,但是往下跟就跟到c加加了hosport的事项了,没关系,你不就是unsafe那个类的compare and swain吗。

看这里作为on safe这个类来说。

当然这个就是呃c加加代码,c加代码看起来远远不如java那么的轻松一些啊,呵呵凑合看,没关系啊,你认真的跟着我的思路走就行了,注意这里给大家看的是unsafe这个类的cpp,就是c c加一个代码。
就是hot sport的具体实现它是怎么实现的,它是unsafe这个类里面的compare and sweat,and具体怎么实现的呢,我先不用去管它,直接看他最后的时间是什么。
是atomic这类的compare and exchange,它它底层叫compare exchange k这样一个时间好,那这个compare and exchange。

如果你再往里跟的话,它有好多好多好多定义,转来转去。

转来转去,我就直接给大家看最后的结果,告诉大家,最后的执行是在这里执行的是这个类atomic linux,x86 in lin h p p,atomic原子的具体实现哪个哪个平台上的实现。
linux的平台上哪个cpu的架构,x86 的架构具体是怎么实现的,在这atomical compacts change,如果你仔细读的话,你会发现它是一条汇编的直线。
a s m c语言里面嵌汇编就这么欠,好最终的汇编时间是在这lock 1 p同学们,你们发现了这样一条指令,这条指令是x86 的cpu原语,cpu的汇编。
这条指令叫compare and exchange,c m p and exchange,what,ok啊,原来这条指令是在底层上就直接支持的,看懵逼了,我靠不会吧,我这讲的够慢的了。
已经这玩意能跟上吗啊,能跟同学老师可以啊,还可以是吧,嗯反正呢这个过程非常的详细,比较比较比较细碎。

尤其是跟c加,如果说你没跟上的话。

没关系啊,像老师这么体贴入微的人,当然是选择给你做好笔记了对吧,如果你想跟进去unsafe这个类的,compared sweat in。

会跟到unsafe的cpp这个类里面的,会跟到atomic这个类的哪一行。

最后会给你解释到底啥意思。

好吧,所以没有听懂的,大概听懂就可以,大概听一个就可以,笔记可以发吗,明天因为我们是一个训练营,当然笔记可以发,讲的很润,居然讲得很润,我的天一点儿一点儿一点儿都不硬核吗,好你看这里啊,同学们。
atomic这类的complex change,最终的一个实线是这条指令叫lock if mp,compare and exchange,细节我们先略过它前面是一个红,叫lock if mp。
这个lock 1 mp到底是个什么东东嘞。

转到定义来看一下,这就是那个红的定义,这个定义是什么意思呢,总而言之很简单,就是如果说,是mp的话,if mp如果是p的话,前面加一条质量叫lock,所以m p是什么意思,最关键是在这儿是吧。
mp是啥意思呢,p的意思呢就mti,multi person,有没有s啊,mi buds啊,叫多人多多个人的运动,sorry讲错了,multi p scissors,ok多核多核运动啊,看这黑。
while processors啊,叫多核多个核,如果你的cpu有多个核,前面就要加这条指令,lock指令,如果你的cpu只有一个核,那你就compare chang这一条指令就可以了。
你想想看没有自己能打断自己的自己,先把自己给干死,然后再去干敌人,没有这种可能性,所以一个核的不需要加lock。

那也就是说多个核的需要加这样一条指令叫lock,所以最终的一个具体的实现就是这样一条指令。

go语言的。

看这里最终的一条实线就是这条指令,这条指令叫look compatichange,好这条指令支持原子性,这条指令是atomic的why,这条人流为什么是atomic的。
我们再说一下compare exchange本身,他们不需要不,它不是知识原形,这块还能跟上吗,同学们,茅茅厕顿开啊,你的茅厕终于开了,原来都便秘是吧,还能跟上啊,能跟上同学老师可以啊,o。
啊原则性就是不可分不可断的,没错没错没错,你说的太对了好听,我说我再给你说一遍啊,为啥要讲其他的语言,因为一个牛逼的架构是对于你来说,语言都不是问题,小case看这里,这是一个cpu,这是cpu 1。
这是cpu 2,他们的对内存里的某一块数值,要进行一个什么操作呢,就是这样操作叫compare and exchange c a s操作,这俩哥们儿啊都是通过一条总线去访问cpu的,去访问内存的。
sorry,访问memory的,我粉我,我执行这个操作的时候,有可能被其他cpu打断,所以我保证不了这条操作的原则性,我保证不了说我中间不能被别人打断,但是我现在需要对它进行保证,我怎么办呢。
我前面加一条lock指令,lock指令的意思是把整个总线给我锁住,哥们儿,我在锁这个锁住它的时候,o其他cpu不能进行操作,c2 c3 c4 c5 c100 ,随便你是谁,这个时候总线不能传数据。
只能传我自己的数据好了,这是他最底层的一个实现,叫locompared change,好我们稍微回顾一下,就是所谓的cs操作是啥意思呢,稍微回顾一下啊,这讲的有点有点有有有有有点多了。

看这里回到我们接下来的操作,所以这个cs操作是啥意思呢,就是哎我底层我执行了compared wap int。

然后呢,如果我要跟现在的这种hobt时间呢,我最后我最终会跟到一条指令上,这条指令叫lock compare and exchange。

我讲的就是这个过程,那么如果你了解了这个过程之后,你就会知道了哦,原来所谓的c a s它是cpu级别的一个支持,是支持的,第一个呢它有一条短语叫cas,原语叫compare and exchange。
第二个呢这条源于本身不具备原子性,可是如果他前面加了一条lock指令,它就支持原子性,当然这条logo指令,它在硬件层面也进行了一些优化,比如说它锁定的是北桥信号,而并不是一条总线,那个就有点超纲了。
就算了,ok请问总监是怎么所做的,硬件级别的一个标志,标志位在硬件级别上,说这根线通电了,这根线通了电,高电平一表示锁定了,哥们儿,只能归我用,我什么时候用完了把它归零,其他的cpu就可以用了。
好了基本上面试就面到这种程度了。

不会再升了,所以我讲到现在关于cs从表面一直到最深入的,来,能get到同学老师扣一。

嗯那好,那有同学会说讲到现在为止,老师那个synchronized跟这有半毛钱关系吗,对这个叫自旋锁,synchronized的原来的实现叫重量级,所,而自旋锁是用来实现轻量级锁。

轻量级锁的意思我再强调一遍,虽然他总线上也是需要加速,有同学老在这里做混淆啊,说老师,你这个cs到最后了,不也是得通过硬件的这个lock吗,那你中间经过操作系统,是不是他中间最后还是要经过lok啊。
好我画完这个图,你不就理解了吗,轻量解锁的意思是我不需要经过操作系统,我自己就到lock了,而重量级锁的意思是,我要经过操作系统的一系列的管理,我需要把我的等待的线程放到队列里。
我需要订购操作系统的一系列的调度,我才能够执行,所以重点是有没有操作系统的参与,听懂了吗。

这就是轻量级锁和重量级锁的概念,那有同学会说,老师原来synchronized,到目前为止是有一个锁升级的过程,中间它是有一个轻量级锁的实现过程,是这样的吗,是的好,还能跟上吗。
能跟上我们就牵扯到更细致一点的内容了啊,能跟上给老师扣一啊,ok。
系列 6:P150:ES 支持哪些类型的查询 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们来看下面这个问题。那ES支持哪些类型的查询呢?这是一道来自美团的面试题啊,对应的岗位薪资呢在25K左右。啊,下面我们来看一下这个问题,我们如何来回答。啊,那么这个题目呢属于一种开放性的问题啊。
那其实也比较简单。那么咱们按照不同的划分方式呢,其实答案也不唯一。比如说咱们可以把人呢分为好人和坏人,按照年龄划分呢,也可以分为大人和小孩啊,你也可以按照性别划分,划分成男人、女人。
或者按照国籍划分成中国人啊,外国人或者巴基斯坦人、印度人等等等等。好,那么咱们ES中的这个查询类型呢,首先咱们按照最常见的划分方式呢,比如说咱们按照语言来划分啊,那么ES呢支持多种查询语言呢。
首先那么第一种呢咱们最常见的叫rySL啊,也就是编specific language啊,那它是ES中啊支持咱们ES就是ES内部的特殊的一种呃查询语言。好。
那么第二种呢就是脚本查询啊scripting或者叫script都可以。好,第三种呢是aggregations脚本查这种是呢聚合查询的语言啊。好,第四个叫查询啊。
是支持咱们使用那种关性数据库的查询语句来进行查询。那么第五种呢叫事件查询啊EQL查询。好,那么如果问到这里啊,就是面试官可能会延伸的去问你一下啊,那么这几种查询语言的区别是什么呀?
那首先呢快DSL呢是解决我们80%应用场景下的这种啊查询语句。啊,就是说咱们大部分情况呢用的都是DSL来进行查询。那么脚本查询呢,它本质上是ES啊。
为我们提供一种专门用于复杂场景下支持自定义编程的这种脚本语言。那它是一种可编程的语言,它的灵活度是比较高的。它的语法是类似于java的啊,也有那种关键字啊变量函数等等啊,但是它的性能啊是不如快DSL的。
也就是说如果咱们能用DSL来解决的问题呢,咱们坚决不用script的好,只是script呢它能解决。一些特别复杂的场景啊,那这个就是他们俩的区别。而这个呃aggregations呢,它的。
它和这个上面两种最本质的区别啊,就是尤其是和快越DSL的区别呢,在于它的他们解决的业务场景不一样。那快越DSL呢,它是用来解决全文检索的问题的而我们aggggregs用来解决数据分析啊。
这种数据聚和查询啊,他们的业务场景是有本质的区别的那这也是他们最本质的区别啊,最大的区别。🤧那srcle查询啊这个circle查询的支持呢本质呢它是ES为一些啊他不愿意去学习一门新语言啊。
比如说DSL他不愿意去学DSL这种脚本啊,这种语言的时候呢,你可以使用my circlercle来进行一些呃或者说是大部分场景下的查询。但是呢circle查询它有一个缺点呢。
就是对新版本的支持不是那么友好。还有一种是对复杂的一些脚本呢,可能支持的不是特别好啊,这个就是咱们常见的几种呃查询语句的区别啊。那么这个EQL呢,其实咱们用的就比较少了啊。好,那么第二种咱们来看。嗯。
咱们还可以按照场景来划分。按照场景来划分呢,就是说按照业务场景来划分啊。那比如说第一种呢也是最简单的一种啊叫queries string。
那queries string呢其实咱们在生产环境中用的是比较少的。什么什么情况下来什么场景下,什么情况下咱们可能会用到的。好,比如说咱们看到那么当前我打开的这个页面。这个网页呢是叫的一个查询的工具啊。
叫 tools啊,它有一个conl的界面,它是在这个界面里边咱们是可以执行一些一系列的查询脚本啊,咱们的queryL applications脚本语言呢等等,都是可以在这里边去进行执行的。
那么它有一系列的好处啊,首先呢它分为左右两个区域。那么右侧可以给我们返回这个响应的上下文左侧可以支持我们去写一系列的脚本。比如说啊我们查询一些这个索引的时候呢,它会给我们去智能的产生一些智能提示啊。
比如说我们在写一些。

代码啊,写代你写一些代码的时候呢,好,除了智能提示之外,还可以给我们进行forat啊智能的格式化。还嗯当然了,这里边呢既然有好处,它也有一定的麻烦啊,它有一定的缺点。那就是它依赖于客户端。
依赖于我们安装这个be banner这个组件啊。

好,那么carry dream呢它有一个好处的,就是说当你有一些比较简单的查询的时候呢,比如说我们local host的9201啊,这是我们的服务地址啊。9201一些比较简单的查询。
比如说我想查询呃caping index,我们查询当前集群中嗯唉。Local host, cat notes。我们来看一下9201。点com。好,我们可以方便的看到当前集制中有哪些节点是吧?
或者说我们呃加个V也可以啊。那或者说我们可以查询,比如说刚才的查询语句product search。好,我们同样可以看到当前呃这个集群中的product所以给我们导致一些数据啊。呃。
它的好处呢就是我们不依赖于客户端,我们可以方便快捷的查询一些简单的脚本。但是呢它的致命的缺点啊,就是说这里边呢,首先它没有智能提示。那第二个呢,我们一些比比如说像这种稍微简单一些,要跨越多行的这些代码。
我们写起来很不方便啊。好,这个是什么时候会用呢?就是我们这个脚本比较简单的时候可能会用。



好,那这个呢是关于这个que string啊,咱们来看第二种呢,就是这个for textex啊全文检索。那么这个咱们第三个问题呢,实际上已经讲过了。好。
que stream呢大概有这么几种match match all,还有match呃mtimatch啊,这个知道就行了。还有这个短语查询啊,match phrase。呃。
以及咱们呃后面要说的这个time们 queryry啊精准查询,还有咱们嗯这个过滤器这个过滤器和ferry的最主要区别呢在于这个filter呢,它本质上是没有这种评分机制的啊。
它的查询性能是要比query要高一些的。好,还有这个组合查询。那么组合查询呢可能面试官呢可能会延伸的问你一些其他的问题。比如说这个组合查询里边这个叫minum啊ho match这个参数它是什么意思?好。
那这个啊这个参数的含义呢,实际上呢咱们简单的要说一下吧。好,在呃组合查询呢,其实就相当于我们在呃执行scle语句里边V尔啊后面跟多个条件。啊,比如说V尔条件一and条件2是吧?好。
那么当我执行多个条件的时候呢,这个shoul啊它默认啊,比如说sho相当于我们这个al句。啊,这个or组句里边,比如说里边我查询了多个条件啊,比如说这个。布尔查询呢,咱们这样啊,咱们结合代码来说一下啊。
因为这里边呢面试官可能啊有很大的概率,可能会问到这个问题啊。比如说咱们以这个。


我是大哥,所以为例。好,咱们在 searcharch置的时候里边呢,首先quary最外层嵌造一个布尔查询啊,布尔查询呢其实就是组合查询。这里边呢首先支持四个词句filuter。然后。嗯,还支持m。
还支持。m note还支持。秀的。好,那这里边呢可能唯一可能会出现的一个考点呢,就是说当我们这个shift这个条件啊,呃这个子句在查询的时候呢,就相当于我们这里边有多个条件。比如说条件一啊。
我这里边就写伪代码了啊。好,这是这里边第一个中括号呢就是条件一啊,第二个条件呢就是条件2。那么当shift的句出现的时候呢,这多个条件啊,你至少要满足一个啊,比如说我们这儿有三个条件。好。
那么这个时候呢,我们的查询语句这三个条件你至少要满足一个,就是它返回的结果呢是至少要满足一个条件。好,当我们出现map的时候呢。好,比如说我们当前查询的是这个m啊。而没有s的时候。
那么比如说这里边也有多个条件。那么此时呢这里边max句里边的多个条件要同时满足,这里边有两个条件都要同时满足。好,那么假如说我们同时有效的啊,又有map的时候,这个情况是比较特殊的。
首先啊我们来说一下这个参数叫minum嘛,就是咱们刚才说的这个叫minum。好,在这里边啊。MI好,那么这个参数什么意思呢?首先啊在我们只有s子句的时候呢?默认情况下,你即便没有这个参数。
那么我们当前s子句需要至少满足的条件数呢,默认就是一。如果我们把这个参数配置上,我们给它改成2。那么此时呢s子句里边需要满足的条件数呢至少为2,也就是三个条件至少要满足两个。好,那么有一种特殊的情况呢。
就是在s子句和max的子句同时出现的时候。好,那么此时呢呃如果一旦s啊,那么它遇到了max的子句呢,那么此时的条件,这里边三个条件呢啊至少要满足的条件个数呢变成了0。也就是说呢。
如果max子句出现的时候,那么sho里边的条件呢可以一个都不满足,那是没有关系的。好,那么呃当然了,除了max之外呢,还有filter也是一样的啊。好,也就是说呢s子句遇到了filter子句也是一样的。
这里边条件可以一个都不满足。好,那么如果我们想让它满足啊,我们可以加上这个minum should match,那么一旦有了这个参数呢,那么这个s子句里边需要至少满足的条件个数呢,就是比当前配置的个数。
那么我们配置唯一,那么它至少要满足一个条件。那不管是有bi filter或者m子句都是这样的。好,那这个是唯一在面试中啊,可能会问到布尔查询的一个考点啊。

好了,那么这四个子句的意思呢就是m的每个条件都必须要满足filter也是每个条件都必须满足。但是那么filter呢它是不计算相关度的。那么秀呢就是多个条件,你可以满足其中一部分。
而m的n呢是每个条件都必须不满足。好,那么这个是他们四个子句的分别的含义。好,那么当然了你还可以按照地理位置,它支持的这种搜索类型,啊,还有地理位置搜索。那么地理位置搜索呢,咱们之前。我看一下啊。
这个云笔记里啊,我简单说一下,你像这种呃矩形查询呢,在矩形中查查找一些点呢,或者说基于你当前位置查询啊半径查找啊,比如说半径50公里查找范围,有哪些点。你像你的外卖软件呢。
或者说你的一些美团或者说一些团购的软件呢,都会有这样的呃查询信息,或者或者说是查询方式啊,还有这种多边形的查找以及复杂比例位置的这种查找。当然了,知道这个地理位置查找这种类型就可以了啊。
那么不用在这个里边去探究的过于去深啊,就是探究的太深啊,是没有必要的。呃,还有一种查询类型呢叫嵌套查询。那么嵌套了查询呢其实只持三种啊,一种叫啊你记住这三种类型就行了。第一种类型的叫object。
第二种类型的叫啊,我写一下啊,第一种叫OBJECT。其实咱们在之前讲呃第二个问题讲那个ming的步骤类型的时候说过啊,第二种类型叫NESPED。第三种类型的叫jo啊,好,记住这三种类型的查询就可以了。
那么以上呢就是关于当前的这个呃按照咱们看一下啊。啊,是按照场景来划分啊。那么不同的这种呃查询的场景呢,它对应对的这种呃业务逻辑是不太一样的啊。好。好,那么下面咱们看啊按照数据类型划分呢。
咱们就可以分为全文检索啊,精确查找以及模糊查找。那么模糊查找呢主要包含以下几种sgeer呢就是智能提示啊,咱们看到的比如说。


好,比如说百度的这个这个搜索包啊,百度。好,那么我们看到呢这个呃蓝色的方块呢,其实就是这个sgeer,它的这个智能提示框啊,就是这个方块。

好,那这是第一种啊。那么当然了,还有像模糊查询啦、公配服啦,正式查找啊,那么它统通都是模糊查询,而精确查找呢就是查询指定的值啊,matdge就是权文检索啊,大概呢就可以分为这么几类。

好,那么下一个问题呢,咱们来看一下这个prome match有什么区别。
系列 6:P151:ES 中 Term 和 Match 搜索有什么区别 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们来看下面这个问题,term和mat的区别是什么?那这是一道来自阿里的面试题啊,对应的岗位薪资呢在25K左右。好,那么下面啊我们来看一看这个问题,我们如何来回答。
那么很多小伙伴呢在面试中被问到相关问题呢,就是栽了跟头啊。那么如果屏幕前的小伙伴呢在面试中也被问到类似的问题啊,可以在弹幕里扣1。那么下面我们来看一下,首先是tom和match,它们的区别是什么呢?
我们来从代码层面上来看一下啊,那么当前屏幕的左侧呢有一个match搜索啊,在这里边有一个match搜索。那么下面呢有一个tm搜索。好,这两个他们同样都是搜索的一种搜索方式,一种搜索类型。
那么它们的区别呢在于当前对搜索对啊,是搜索词。这个搜索词呢是用户传过来的搜索词。

他们的区别呢就在于是否对搜索词进行分词。啊,也就是说match对搜索词是分词的,而我的tm呢对搜索词是不分词的。不管是tm也好,那个呃不管是mat也好,还是tm也好,他们对于这个原字段啊。
就是这个name原数据是没有任何关系的。那么原数据是否分词呢取决于它的字段类型。好,也就是说呢我当前这个两个查询呢其实匹配的结果是一样的。因为小米这个词呢它本身就是一个词项。
那按照默认的分词器它是不会再产生任何更细利度的这个词项啊。好,咱们可以验证一下啊,怎么去验证呢?好,可以用1个API当然了,这个面试官在面试的时候呢,咱们不呃可以不去这个这个代码咱们是不用执行的啊。好。
我这是为了方便你去理解。然后咱们anaer,然后通过这个首先呢这个TST。指定这个小米。好,因为默认的分词器呢就是stander的,咱们可以不写。好,你看得到了一个词项,小米。
也就是小米是一个最细腻过的词项,咱们不用去管它,咱们验证一下。那么可以看到啊第一个这个结果。啊,第一个搜索的结果呢有。呃,5条数据都搜到了,因为每一个每一个结果里边呢,它都其实包含了小米这个词项是吧?
那么当前麦去搜索,它的语义呢就是所有name幕字段中,只要匹配到小米这个词项都是可以被搜索到的。我们看每一条数据呢,第嗯这个第四条数据,这里边有小米往下,那么这儿有小米啊,同样小米。
小米好OK那么如果要体现区别呢,比如说咱们随便拿一个这个数据来举个例子啊,那么比如说咱们要搜索小米PHONEPHONE小米phone好,那么咱们下面同样。没。嗯。好。
那么下面啊咱们同样啊也匹配一个这个小米蜂。PHONE好,那么这样的结果就不一样了。好,咱们看上面搜索它是有结果的。好,执行看一下结果还是啊toto还是6条数据啊。因为除了小米之外呢,我们多加了一个词项。
好,在这个搜索词里边,咱们添加一个。好,咱们来看一下它的分支结果。

那么它被分成了两个词项,也就是说,如果我们使用麦age查询的,那么包含小米或者phone任意一个词项的结果都会被匹配出来。而我们如果使用tm查询的时候啊,如果我们使用t查询的时候。
那么当前的这个搜索词会被原封不动的,它原先是什么样,就是什么样啊,我们此时用小米phone搜索,那么当前就没有任何结果,这是为什么呢?咱们验证一下啊,首先来执行一下结果啊,没有任何结果。因为呢。

Tm查询呢会拿着这一个词,拿着这一个短语作为一个整体和当前每一个字段啊,咱们来看一下所有的数据,每一个字段它的每一个词项来进行检索。你看比如说小米 phone啊,它的它的这个分词结果是什么呢?
是小米和phone。那么如果我使用T查询呢,我会拿着这一个短语分别和每一个词项去进行匹配啊进行比对。那么发现每一个词项都和小米 phone这个短语是不匹配的。因此它搜不到任何结果。
那它这个就是ter查询。好,那么什么是keyword啊,咱们来看这个文档,那么什么是特m和keyword呢?好,那么默认啊每一个每一个字段,它默认都是一个t类型。比如说咱们查看一下当前所引的这个m啊。
它的字段类型。


好,我们可以看到name字段啊,咱们把这个其他的字段折叠起来。那么name字段呢它默认是一个t的类型。好,当然了,它有一个字段叫keyword。那么这个keyword,那它就是一个sstore类型。
它是不分词的。也就是说呢好,那么我们在比较 termm和 keyword的时候呢,其实比这种比对呢其实是存在一定的问题的。Tm是指的搜索类型。而我们的keyword指的是字段类型。好。
那么我们比如说我们当呃我们这个查询把这个 termm改成。


name点keyword的时候。啊,当然这样子查询可能会出现问题啊。哎,你看我们这个结果又出现了啊,结果这这个结果又又有了,什么意思呢?好,注意看。当我们使用name讲keyword进行查询的时候。
因为这个keyword字段类型呢,它是不对啊我的数据进行分词的。那么name点 keyword这里边看不到啊。那么它的子字段呢会在name的基础上,我保留原封不动的保留我的原数据,它原本是什么样。
就是什么样。也就是说此时呢我这个特m搜索是拿着小米phone这个短语去匹配这个完整这个短语,所以它就能匹配到。好。这样大家应该明白了吧,match啊,如果我们改成match呢,咱们再来进行检索。啊。
会报错。那么怎么办呢?咱们把这个小米磁项呢把这个给它贴出来啊,它不能用这种方式进行检索。啊,不能用这种value的方式啊。好,用这种方式好,你会发现呢它的结果依然能匹配到啊,因为因为什么呢?
因为我match对小米这个词项呢呃它本身是不应该被匹配到的。为什么呢?因为小米这个词项啊,首先我这这是一种特殊情况啊,呃,那么小米和phone我使用match搜索的时候,按理说呢是会被分词的。
而这个keyword啊而这个name点 keyword是不分词的,也就是说呢原本这个是不分词的,而我这个小米和phone呢是两个词项分别和它匹配,但是为什么匹配到了呢?
因为啊当这个当这个搜索词和name和你的这个原数据完全匹配的时候,那么match搜索是一种特殊的情况。好,到这儿呢,其实我把这个match和tm。
还有这个keyword它们之间的这个区别呢给大家已经介绍清楚了。那么。呃,其实在面试的时候呢,你只要能说出啊match和这个term啊,咱们再改回来啊。好。
你只要知道magdge和 termm它是针对搜索词的,是针对于这个传入的搜索词的。而这个keyword呢,它是针对原数据的就可以了。好。
那么如果能把这几种搜能把麦agdge和 term这两种搜索以及keyword和t这这两个字段的类型彻底理解了,那样更好用自己的话去描述,千万不要死记硬背OK。

系列 6:P152:生产模式和开发模式 - 马士兵学堂 - BV1RY4y1Q7DL
OK我们来看下面一个问题,什么是开发模式和生产模式?那这是一个来自阿里意面的面试题啊。呃,首先我们在回答这个问题之前呢,先来思考一下面试官问这道问题的初衷是什么。
首先呢这两个概念呢是一个非常表象的ES问题。那么开发模式和生产模式呢是在我们学习过程中呢非常容易被忽略的两个概念。尤其是我们在没有对这两个概念充分理解的前提之下。
在项目的前期啊是非常容易给项目后期啊挖很多坑的。好,我们下面来解释一下什么是开发模式和生产模式。

首先开发模式顾名思义呢就是ES为我们以开发或者学习为目的而提供的一种模式。我们都知道呢,ES在索引创建成功之后,很多业务参数,很多我们这个ES的这个参数啊,所引呢比如说像呃m屏的字段类型。
比如说我们使用的分支器,比如说我们设置的主分片的数量啊,一旦我们创建成功之后,这些参数是没有办法在后期进行修改的。所以我们在项目初期如果没有对我们的业务呢做充分的调研评估和测试啊。
贸然的就开始创建索引啊,开始往里边写数据了。那么后期我们维护起来是会变得非常困难的。那么基于这个前提之下呢,ES给我们提供了一个开发模式和生产模式。那么在用于生产啊为前提的这么一这么一个前提之下呢。
我们生产模式啊,会触发一个叫引导检查这么一个。呃,启动项检查这么一件事。好,在生产模式下呢,我们启动ES啊生产模式顾名思义,就是用于生产啊,用于生产开发为目的的这么一种模式。那么在此模式下呢。
ES会给我们启动一系列的这种机制的检查,包括我们的配置的检查,一旦发现了我们配置不合理或者说我们在启动的时候,可能会犯一些这种比较低级的错误,它会阻止你这个服务的启动,也就是说换句话说,就是宁缺毋滥啊。
就是我宁可服务启动不起来,我一定要让你的配置呃变得非常合理。因为一旦我们以一个不合理的这么一种呃这么一个前提啊,比如说我们的这个JVM大小配置的不合理。我们没有打开内存锁。比如说我们分片分配的不合理啊。
等等等等。那么此时ES阻止你启动。因为这样的话,在项目后期啊,呃就是把问题呢尽可能在我们项目开始之前。啊,就暴露出来,否则的话后期会拆呃挖很多坑。但是呢这一系列的检查会导致我们一开始学习。
尤其是对我们新手刚接触ellect search的同学呢会变得非常困难。那么在此前提之下呢,ES为我们提供了开发开发模式。而开发模式下呢,ES会忽略这些检查。目的呢是为了让我们尽快的上手,啊。
就是尽快的启动ES嘛,否则比如说我们呃刚刚学习ES。那么一开始我就是启动ES的服务就要花很长的时间,那么可能会非常打进学习的积极性。好,综合以上原因呢,ES为我们提供了开发模式和生产模式。好。
那么我们在学习啊就是以学习为目的的这个前提之下呢,我们可以为这个。节点之上呢,配置discovery点s啊s signal的配置当前节点为单节点模式。那么此时就处于一个开发模式。
或者我们在多节点的这个前提之下呢,不要去配置和集群发现相关的配置。那么此时我们仍然会处于一个开发模式。因为一般来说呢,我们如果是要学习像DSL是这种ES特有的查询语句啊。
比如说像aggregations,像script的这种查询脚本,是不需要去启动集群的。所以当我们一旦呃去在配置文件中配置了和集群发现相关的配置项的时候,就会触发生产模式。因为因为什么呢?因为生产模式下。
一般都是需要我们去配置集群的。如果你仅仅是用于学习,我们没有必要去配置集群。所以ES就会觉得啊你如果是用于学习,你干嘛去配置完呢?你既然配置了这个集群发现,那么我就认为你是生。

环境啊,那么此时我就要去启动项做启动项检查。那么我总总要有一个这么判断的依据。好,那么一旦触发了生产模式之后呢,就会启就会触发一个叫启动项检查的这么一个叫bu checks的这么一个东啊这么一个东西。
或者叫这么一个玩意儿啊,那么这个启动项检查会检查哪些项呢。好,我们在下面呢也给大家列出来了。当然在面试的时候,这些东西我们不可能每一项都记住。所以在面试的时候,我们可以把这个启动项检查作为一个引申。好。
怎么引申呢?好,我们在回答这个问题的时候,我可以说啊基于我自己的理解啊,那么为什么ES要出要设置这个开发模式啊,以及ES为什么要设置这个生产模式呀,好,就是为了刚才我说的那些原因。好。
那么它会检查哪些项啊,把这些东西呢,你能记住几个记住几个就行了啊,不用每一个都背出来。比如说这里边包含什么对大小的检查呀,文件描述符的检查呀,以及内存锁线程数以及。




这个文件的大小的检查啊等等等等吧。这些东西呢我们不用去全部啊给它背下来。只要知道啊,作为一个面试的引申,或者理解为一个加分项就可以了。


好,那么以上呢我们就把这个开发模式和生产模式呢给大家讲清楚了。那么在面试的时候呢,一定要组织好自己的语言,不要呃在回答的时候磕磕绊绊啊,这就可以了。

系列 6:P153:倒排索引的核心原理 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看下面这个问题。倒排索引的基本原理是什么啊,这同样是来自百度的一道面试题。那对应的岗位薪资呢在30K左右。倒排索引可以说是ES面试题中的重中之重了啊。那么下面我们来看一下这个问题。
我们如何来回答。好,那么关于道牌索引这个问题啊,在ES的面试题里边呢,几乎是必备问到的一个问题。呃,原因其实也很简单。呃,面试官针对你对倒牌索引所回答的一个程度呢,基本上可以断定你对ES掌握的一个程度。
那,尤其是ES的底层原理的掌握程度。好,那么关于这个问题呢,我也会拆分成多个小问题来由浅入深的逐步讲解。呃,我对大家的建议呢是根据自身的需求和呃你要面试的一个岗位的不同呢。
来呃决策自己需要掌握到一个什么程度。呃,那大家呢在百度上或者在这个搜索引擎里边呢,可能会搜索到盗牌索引这个概念呢,大多数呢其实呃对于盗牌索引的讲解呢可以概括概括成一句话。
就是所谓关键词到文档ID的映射啊这么一个关系。那之前呢其实我在讲全文检索的时候呢,举过这么样一个例子。那假如说右侧呢这个表格呢是我们呃一个原始的数据。
当前呢这个表格里边可能有大量的啊就是有一个非常大的数量级的数据。比如说那么这里边呢就达到了一个10亿级别的一个数量级。
那么我们要在当前这个呃表格里边去文档的这个product就是这种文本字段上去创建索引的。好,由于性能的原因呢,我们通常呢会采取盗牌索引啊,我们抽象了一个呃盗拍索引的一个概念啊呢。
实际上呢盗牌索引底层并不是这样的啊,我们以二维表格的形式来理解盗牌索引呢,也是为了我们方便其。

由浅入深的理解套排索引。你在面试的时候呢问啊,如果面试官要问到你这个问题,你也可以这样去回答。好,我们由浅入深来回答。那么所谓强文检索呢,就是我们针对倒牌索引呢逐个去匹配。那么倒牌索引呢。
实际上我们来看啊,在这个案例里,那么我们当前的这个呃原数据就是原始字段呢,这个product被拆分成一个一个词项呢,就是我们的ction这个字段啊,那么它呢有另外一个字段叫posting list啊。
那这个字段存储的就是包含当前小米这个字段在原始数据中所有ID的一个集合啊,实际上它是一个有序的in类型的数组。那么从词像到这个posting list叫倒牌表,我们有一个术语叫倒排表。
这个映射关系呢就是所谓的刀排缩引。当然了,这个招排表,还有词祥字典,它的一个底层的存储逻辑呢并非这么简单啊啊,包括你看po list呢,除了这个文档ID呢,它还有一些其他的,比如说次频啊这些数据。呃。
我们后面会讲,那么咱们目前呢只需要知道有这么一个映射关系就可以了。它就是刀排索引。OK那么针对于招牌索引呢,其实呢它有这三个呃非常基础的我者大家都要知道啊,就是面试中我们一定要能答上来的三个数据结构。
首先呢我们的词项很好理解,它有一个专业的术语叫Tm dictionary,就是词项字典啊,叫词项是项目的项,项羽的项字典。啊,顾名思义,它既然是个字典呢。
它就是一个它实际上它是一个字典去存储的一个不重复的一个字段。那么posting list呢叫倒排表。啊,倒排表里边存储的是包含当前词项的所有的文档ID的有序数组,并且是int类型的啊。
int类型的最大的这个数据量是多少呢?是2的32次方,对吧?所以我们int类型啊,其实我们倒排表为什么单个的这个分片里边,它会有容量的上限呢啊,也其实就是这个原因啊,好,那么了解了这两个数据结构之后呢。
其实还有一个呃比较特殊的,叫T index,这个是什么呢?其实呢呃倒排索引,咱们如果把问题回答到这儿呢,面试官呢其实可以在这个基础上衍伸出一系列的问题。比如说哎比如说面试官会提这样的问题。
那么我们当前呢这个原原数据呢,有一个是一个10亿级别的数量级。那么我们把把这个字段,你要创建倒排索引的字段呢拆分成一个一个的词项,那么它是有可能假如说我们这个词项呢是一个高级的啊。
就是高基数的一个呃这么一个数据。就是他重复的数据非常少。那么我们有可能这个t dictionary就是词祥字典呢,它也是一个非常高的数量级。因为这里边没有重复的嘛。啊,当然这是一个比较极端的情况啊。
那么当然这种情况是有可能发生的。比如说它是1个10亿级别的数据是有可能的吧。因为我一个字段就拆分成了好几个词项嘛。好,那么甚至有可能它是一个更高的数量级,这都是有可能的。那么我们在电力倒牌索引的时候呢。
虽然说啊我们知道了一个词项啊就是说1亿个数据啊,我们通过一条索引呢就可以知道这11条数据包含了哪些索引啊包含了这个词项,但是我们这个词项字典的检索,它又是一个问题。因为什么呢?
因为我们这个词项字典又是一个很大的数量级。那么在这儿呢,其实就衍生了一个底层的数据结构叫FST。那么FST呢,实际上是一个呃。TRIE就是前缀数的一个变阻。啊,或者叫字典数。
这个我们后边就会讲这个这些东西呢,其实都是可以跟面试官来提的。那么FST呢就把这些呢把这些数据呢。把这些数据呢做了一个高效的压缩,甚至我们可以把它压缩到1个GB。
就是说我们10亿甚至更多的这这种更高的数量级,我们能压缩到这个把它的总体级压缩到1个GB啊以下就小于GB。那么当然了这个后后期我们再来讲解FST那这个呢是其实是倒拍索引最底层啊,最核心的一个数据结构啊。
它也比较复杂。那么词项字典呢,我们可以把它理呃词项索引啊,就是 index呢,我们可以把它理解为这个图可能有点小,我把它放大一些啊。


🤧嗯。🤧嗯,叫tm index啊,可能有有同学可能看不清,我再写一遍啊,叫term。

领带。好,我们来看这个从字面翻译上来来说呢,它叫词像索引是吧?其实索引是什么意思呢?索引本来就是帮助我们去检索数据的。那么我们从这儿呢其实就可以判断出呢。
它的作用就是为了方便我们去检索term dictionary。我们看到下面我这儿有一张图啊。那这张图里边呢,其实呃用一张图呢就概述了我们当前倒牌索引呢,它的一些基础的数据结构,包括每一种数据结构。
它的作用啊,你像倒牌表就是存储了我们当前。


这个图。那么招牌表呢,这里边呢其实就是存储了我们当前呃词项字典,词项字典的所有数据,就是它也就是这些ID的数据啊,包括此频的一些数据啊,当然了,它是一个有序类型的数据,这些都要回答回答出来啊。好。
它其实在这个招牌表上呢又可以衍生一些问题。好,比如说我们来看上面这个图啊。



比如说呢我们11个数量级是吧?11个数量级这些数据呢包含当前小米这个词项。假如说我们当前呢这个商品表里边有大量,因为是小米商城,小米商城可能有大量重复的这种词项的数据。比如说小米这个词项呢。
它出现了100万次。那么这100万字呢,就代表当前这个posting list的。我当前这个词词条里边呢存储的这个招牌表里边有100万个ID每1个ID呢它又是一个int类型是吧?
那么int类型呢占4个字节。那么四个字节,100万条数据呢,相当于占400万个多少啊字节。它其实就约等于4个兆B吧啊,这个数量级就是4个兆B啊,其实准确一点是3。8。那么没有关系啊。
这就这个数量级咱们知道就可以了。那么4。8这个兆B呢,它的这个空间占用的大不大呢?啊,实际上咱们在单独来看这一条数据可能觉得不大,对吧?那么如果说你的数量级是10个亿呢。好。
那么第一个面临的问题呢就是存储压力。第二个面临的问题呢就是好当我的数量级特别大的时候,我的减索性能会特别下降。因为要设计之前咱们讲过一个问题叫什么叫磁盘IO好,我的IO上去之后呢,我的性能必然下降。
所以我们通常呃在这种ES在这个底层呢是做了一系列的这种优化的,其中呢有一个就是啊我们的数据压缩里边涉及到两种算法叫一个叫呢FOR就是roll那个frameme of reference这种压缩算法。
第二个呢叫呃rolling map这两种压缩算法呢都是呃一些比较底层的东西啊。当然这些可能是呃关于盗盘索引。



面试官可能会衍生出来或者或者说延伸的一些问题啊,比如说面试官会怎么问呢?好了,你讲解了倒牌所有的数据结构之后呢,面试官会问你哈,那么面试官呃这个倒牌表里边有这么那个多的这个数据。
他是怎么样去优化它的性能的?

或者说好我的数量级磁项字典这么大,我是怎么样去保证它的检索性能的?好,等等等等。当你了解了这些数据结构底层的这种存储方式之后呢,这些问题就迎刃而解了啊,所以到这为止啊。
到目前就是说本就是当前这个视频为止啊,咱们需要了解到哪哪个地步呢。首先是倒派索引它的这些基本的数据结构,你要知道每一个数据结构,它存储的是什么东西啊。
你要知道词项字典存储的就是一个呃非呃非重复的一个词项数据叫叫词项字典啊,这个名字你要知道还有这个词项索引它的作用啊,你要知道它是为了辅助我们去理解而抽象画出的一个数据结构。好,那道派表咱们已经说过了。
那么包括这三种数据结构,它其实在此盘中都有对应的这种文件来存储的。比如说我们打开当前的一个文件夹,我这已经提前打开了。那么看到当前呢是一个ES集群中的一个节点啊。
这里边我们打开了一个节点其中的一个索引数据。好,我们看到这里边呢有很多很多后缀名不同的数据。其实它和my circlel一样的,我们的数据。


其实无非就是什么呢?啊,一个客户端是吧?啊,客户端clet,还有一个什么,还有一个服务端server是吧?CS架构,那么底层还有什么叫存储引擎。我们ES中呢这些数据文件和my是一样的。
里边也是一些文件来存储的。这就是基于磁盘的数据库和基于内存的数据库的区别啊。我们这些文件啊持久化到磁盘里边呢,有不同的后缀名。好,我们这儿呢需要关心的前三个就是我们第一个呢叫TIM。你。
第一个呢叫TIM,第二个叫TIP还有一个呢叫DUC好,我们这个视频啊,我们需要了解的这三个文件呢叫啊就是这以上三个文件。好,这三个文件分别是存储的什么内容呢?首先呢。

posting list的倒排表啊,就是里边存储的是此项的这个倒排表的这些ID数据嘛?ID啊这些ID是存储在一个叫TI叫DOC的这个文件里。就是DOC存储的是高拍表,还有磁频反磁频等等这些数据。
那么此项字典啊,这个是存储在一个叫TIM的这个文件里,它存储的是FST的公共前缀和公共后缀。好,那么此项索引呢,它存储在一个叫TIP的文件里。啊,TIP文件里边它存储的是啊这个啊不对,刚才我说错了啊。
这个呃这个是什么呢?呃,词项字典啊,它存储在TM文件里边,它存储的是呃。这个倒牌表的指针什么意思呢?就是我们倒排表这个ID的数据呢,实际上是一个二进制的字节数组。而我们词项字典。
它里边存储的是呃我们这个二进制数组里边的这个下标啊,比如说01010101啊,存储的其中的一个这个数组的下标啊,这个是词项字典而倒排表它是叫而这个词项字典这个字项索引,它存储在这个TIP文件里边。
它存储的是FST的公共前缀和公共后缀的指针啊,这个FST公共前缀和公共后缀的指针啊,不理解没有关系啊,我们后边还会详细的来讲好,那么到此为止呢,咱们其实就已经把倒排索引的一个基本数据结构讲完了。
那么一般来说呢你能回答到这儿呢,其实面试的时候呢,这个倒排索引你能拿60分就已经可以了。但是呢你别看你拿到60分,其实剩下的40分呢,你要花更多的时间来理解,就像一个长跑30千米呢最后200米是最难的。
你往往要花出更多的时间呢才能进步一点点。

ok。
系列 6:P154:为什么 ES 不采用 B+树作为索引底层的数据结构 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看下面一个问题啊,为什么ES呢不像my circlercle一样采用B加数作为索引底层的数据结构呢?那这是同样是来自一道阿里的面试题。那对应的岗位薪资呢在20到25K左右。好。
下面呢我们来看一看这个问题,我们如何来回答。那么在理解这个原因之前啊,我们首先来看一些概念啊,一些其他的概念。首先什么是索引?那么每个人我相信大家呢呃心里都对索引有一个自己的认识啊。那么关于这个索引呢。
咱们不必在这里边探究的过深。什么是具体索引啊,什么是非聚体索引啊。好,咱们从宏观层面上来看,索引啊,它其实呢就是一个静态的文件。它就是以文件的这种形式落地啊,保存在你的计算机的磁盘里的。
我们看到右侧这些文件呢,就是my circle它的数据文件,还有索引文件等等等等。那么并且呢所有的索引呢本质呢都是为了帮助我们快速检索原始数据的。那么这个是它的目的。啊,这是他的目的。那么并且啊任何的。
所以呢都是有。啊,都是以数据结构作为载体的一种或者多种数据结构啊,那么。在my circlecle中呢,它的这个数据结构呢就是低加数啊,就是这种叫递加数的数据结构啊,我们待会儿会来说。好。
那么我们可以看一下啊,咱们打开我们本地安装的myscle。好,这个是我my circle安装的个目录。那么打开它内部的一个data的一个目录。好,我们可以看到这里边呢有一些文件啊,有一些文件夹。好。
我打开我本地的my circlecle的这个客户端。

好,我们可以看到这里边的数据库啊,打开文件夹对比一下。😊,首先除了第一个数据库,我们可以清楚的看到数据库和。当前安装数据库的文件啊,它的根目录呢有一个一一对应的这种。关系。你比如说你像beom。
还有t DB是不是一样的?好,那么这说明什么呢?这说明我们对应啊关联的这个数据库的文件呢,就保存在我对应同样名字的这个文件夹里边。好,我们以呃当然这里边除了第一个数据库除外啊。
那这个里边呢保存的是呃其他数据库的数据库信息啊,那么我们以当前比如说t测DB这个数据库为例啊,我们打开一张表,任意一张表。好,我们打打开它的选项啊,呃,我们打开对应的文件夹可以看到里边有一些文件。
首先呢前两个文件。是同一张表的数据文件。那么这里边呢后缀名不一样呢,指的是什么呢?要FRM的文件呢,这个指的是表。结构啊表结构。好,那么这个IDB呢,它存储的是索引和数据文件啊,点IDB代表当前这张表。
它使用的是inow DB的存储引擎。好,那么我们把当前这张表啊,我们找到这张表就是哎CN这张表啊,尝试修改一下它的存储引擎啊,这个引擎咱们可以给它改成my sum,这是最常见的两种存储引擎。好。
保存之后,我们可以看到这个数据文件呢,瞬间呢就变成了3个而D的文件没了,变成了MY和MID这个MY和MID呢是同时出现的。好,下面这个MYD呢它存储的是数据文件。而这个呃原始数据啊。
那这个点MYI呢它存储的就是my sum这种存储引擎的索引文件。啊,那么这就诠释了什么是以文件的形式落地啊。

好,那么我们理解了索引的基本概念之后啊,我们来看。其实我们刚才提到了一个概念叫存储引擎啊,那么数据库是由哪些部分组成的呢?好,我们可以看到这个图里边清楚的标注了三部分。首先是客户端啊,那么客户端。
咱们刚才使用的这个叫inno这个叫heycircle啊,在最上方看到没?

这个黑 circlecle其实就是一个客户端。还有咱们经常用的n,还有这个circle server management studio啊,这个是给 server用的啊,这些呢通通都叫客户端。
它是使用drivers驱动,就是咱们使用的GDBC的那个驱动文件啊,连接到我们的数据库服务里的。那么数据库服务里边包含的这些连接器啊分析器啊等等。咱们不必去关心。
那么所谓服务端呢就是安装在你的服务器里边的这些呃我们看啊,我这已经打开了,我们这里边安装啊,windows里边安装的这个my circlecle的服务呢,是一个正在运行中的一个状态。好。
那么linux也是一样的啊,它其实就是运行在你计算机里边的一个进程。😊。



他就是一个进程。好,那么最底层呢就是存储引擎,它是啊就是存储引擎呢是通过呃你像m sum和indoDB啊,通过存储引擎来调用你的数据文件来对你的数数据文件呢进行逐合写啊,负责管理你的数据文件啊。
包括你的索引文件。那么这两个存储引擎内部呢使用的就是以B加数这种呃数据结构为载体。啊,这两种分种引擎呢它使用的就是B加数这种数据结构啊。好,那么下面啊我们要理解B加数这种数据结构。呃,换句话说呢。
就是说我们my circle为什么啊不适合做全文检索?其实本质上呢就是数据结构的问题,它不适合做全文检索。好,那么下面我们来看啊毕加数为什么不适合做全文检索呢?

好,之前我们已经了解过全文检索了。那么我们下面来看,那么什么是B加数呢?那在理解B加数的概念之前呢,我们有必要呢先来看一下什么是B数啊,那么B数和B加数呢,其实也是呃除了ES之外啊。
就是抛开ES在my circlecle的层面也是经常会问到的一个面试题啊。所以大家呢注意听一下。好,那么B数啊,B杠数呢指的是B数啊,这个不叫B减数,它就叫B数。好,我们来看一下这个图啊。
那这个图可能画的比较复杂一些啊,咱们打开一个网站。那这个网站呢是一个专门学习数据结构的一个网站啊,那么这个里边呢有一个叫B去。


好,我们打开,也就是B数啊。好,那么我们在当前这个页面里边呢看到了一些信息啊。那么首先我画红框的这个里边呢,有一个叫max maxax degree啊,这个degree指的是不或者接啊。
老师呢一般喜欢把它叫做接。那比如说我们当前这个呃我们以max maxax degree等于4为例子。咱们往呃B数这种数据结构里边存储几个数字,咱们来看一下它是怎么存储的啊。

好,我稍微把这个页面放小一些。咱们把这个速度呢调快一些啊。2。是。是。5。没有。7。八。9。是。好,那么我们再把页面稍微放大一些啊。好,我们看到呢当前这是一个竖形的结构。
那么当前这个树形结构呢就是一个B数。

Okay。好,那么数据的检索过程是什么样的呢?首先呢我来解释一下这个max maxax degree的一个概念啊,呃max degree呢指的就是最大的出度的数量,也就是说指一个节点,它向子节点啊。
它的子节点最多有多少个。说白了那么这个绿色的这个线呢,它就是它的出度。好,max degree呢指的就是它最多有多少个这样的出度,其实呢就是寻址路径。max degree等于4呢。
就代表当前0004这个节点最多有4个子节点,最多有4个寻址路径。好,那么这样做呢,也是为了避免它的子节点过多啊,造成这个资源的浪费啊,导致你的这个呃查询效率变慢。好,那么我们来演示一下啊。
我们把这个这个速度稍微降低一些啊,咱们来演示一下啊,如果是B数这种情况呢?好,我们要检索当前数据等于七的这一条数据好,它存放在什么位置。


好,我们来看啊。fin的。看当前红框转移的顺序。好,我们来看啊。那么首先呢当前红框第一次闪烁是闪烁在这个位置。好,当发现0007呢不在这个节点里的时候。
那么计算机呢会判断啊这个计算机的交互过程是什么样的呢?首先呢这个数它是啊我们刚才已经解释了,这个数据结构是以数据啊就是以数据结构为载体嘛,以这个BB加数的数据结构为载体。当然这个是B数啊。
那么最终存放的位置呢是dis,也就是磁盘。哦,那这个磁盘在计算机进行交互的时候呢,首先呢会被拿到内存里。当然了,根节点是缓存在内存里的啊,叫RAM。好,拿到内存里之后呢。
其实最终啊给我们调度的叫CPUCPU是负责来计算的。那么计算就是说CPU从内存里拿到这个数据之后,发现啊,0007这个数据不在你当前这个节点里。OK那么我调用啊我我告诉这个计算机。
我操纵计算机来进行第二次这个磁盘的IO好,进行第二次IO呢,这个路径就是这里因为000070007是大于0004的,所以我们向右侧进行寻址。那么寻址好。
那么CPU呢会调度呃这个计算机资源啊当前这个节点好,放到内存里,然后供CPU来调度。好,那么当前又产生了一次IO。那么在不考虑根节点缓存的情况下呢。
首先根节点一次IO那么当前产生了第二次磁盘IO那么就是第二次。好,那么0006和0008被CPU调度之后呢,会判断0007在不在当前这个节点发现不在之后呢,好,那么0007是大于0006的。
同时它是又小于0008的。那么它的三个寻址路径呢?好,就会按照中间。这个位置进行寻址。好,最终找到0007这个节点。好,那么这时呢就产生了3次IO。好,那么也就是说我们当前这次查询呢有三次红框的闪烁。
每一次红框闪烁呢,都要把这个磁盘中的这个节点呢放到内存里,供CPU去调度和计算。好,那么知道咱们知道了这个调度原理之后呢,好,咱们就理解了这个呃CPU这么检索的一个过程啊。那么在此过程中呃。
速度最慢的就是磁盘的IO。因为在计算机的这个呃模型里啊,就是说咱们所有的计算机呢都是基于这个弗诺伊曼的这个模型,是吧?在计算机的这个硬件里边呢,磁盘它的速度是小于。什么小于内存的。啊,这个没问题吧。
这个是绝对没有问题的。那么。内存的速度呢又是小于CPU的。所以一般来说呢,咱们磁盘呢都是计算机的这个性能瓶颈。啊,这个能理解吧?那么所以说咱们要尽量的避免啊我们对磁盘频繁的产生读和写的操作啊,OK。
那在这里边呢,又涉及到一个概念啊,咱们需要了解一个概念叫d。

叫。data配置。好,那么这个data page置呢是my circle中的数据页,也就是最小的数据单元啊,是my circle中磁盘和内存最小的数据交互单元。好,不理解这句话,没关系啊。
没有这个不知道这个d page的概念没关系啊,我相信大家呢都听过一个词叫做格式化。

好。好,那格式化什么意思呢?很多人把它理解为删除当前磁盘的数据,其实不然啊,那么删除磁盘的数据呢只是格式化的一个结果,而不是目的。好,那所谓格式化呢,就是写对当前的磁盘呢写入文件系统啊。
这里边的文件系统呢有很多,像NTFSFTS啊等等,还有那个linux常用的那个。叫EXT是吧?EXT4,咱们现现在最常用的。呃,那么什么叫文件系统呢?这个里边有一个概念啊。
是为了帮助我们去它可以帮助我们去理解这个d配置。好,我举个例子啊,比如说咱们呃你新房的装修,比如说这是一个衣柜。那么假如说衣柜里边呢没有做任何隔断,就是一个箱子。那么你的衣服放在这里边。
你女儿的衣服也放在这里边。啊,你妻子,你太太的衣服也放在这里边。那么只能堆在一起,因为我只有一个箱子。那么这样的话就是说如果你从这里边找一件衣服,那可能就会相当困难。那么有什么办法呢?好。
我们聪明的人类呢就想到了一些办法,对当前的衣柜呢打隔断画格子。好,划分成若干个隔断之后呢,哎我就可以把不同分类的衣服呢放在不同的格子里。比如说我这个衣服放袜这个格子放袜子,这个格子放我的衣服。
这个格子放我女儿的衣服,这个格子放我呃妻子的衣服。好,那这样的话就是说我可以快速的定位到一个格子里边去找我对应的衣服。那其实呢所谓文件系统呢,就是对你的磁盘打隔断。
那么像windows默认的文件系统呢叫NTFS。那么这个格子啊最小的这一个格子呢就是4KB。好,那么这一个格子是什么意思呢?就是说你每一次CPU调度的时候呢,从磁盘里边取数据的时候。
我一次性呢最小去读取一个格子的数据,也就是4KB。好,这就导致一个什么什么结果呢,咱们来看啊,我桌面上有这么两个文件。好,有一个是叫16KB的文件啊。咱们打开来看一下。啊,点击。看一下属性。好。
我们看来看啊,那么它的大小呢实际上是15。6KB,但是它却占用了16KB的空间,是为什么呢?好,注意啊,那么当前也就是说我磁盘呢每一个格子是有4KB没问题。那么当前我这15。6KB的空间呢。
首先前三个格子呢都填满了。那么前三个格子,1个4KB呢,就是12KB。那么剩下3。6KB呢,占用了最后一个格子啊,它留了一点空间没有占满。也就是留了这么一点空间,没有占满。好。
但是在CPU去取磁盘数据的时候呢,我一次至少取一个格子。所以当前15。6KB呢就占了4个格子。那么CPU在取的时候也只能取1616KB。所以它最终占用的空间呢就是16KB。好,那么咱们还再来看啊。
那么这有一个呃叫两1KB的文件。那么其实它占用的空间是稍微大一点,是2KB啊,咱们打开看一下。你看啊它的内部空间呢啊实际数据只有1。5呃1。65KB,但是它却占用了4KB的存储空间,因为没有把格子占满。
它也要占用一个格子CPU在取的时候,它只能取啊这4KB的空间。好,其实这就是4K对齐啊。

好,那么咱们尝试呢把这个1KB的数据复制出来。

啊,放在这个16KB的文件里边,放在最末啊放在最末。对。放在最下面啊,敲一个回车,一个空格。好,咱们保存保存之后呢,它占用了多少空间呢?实际上就是10啊15点。15。6加上。啊,加上一点几来着。
一点几忘了啊。那么其实呢它的大小一定是大于16的对吧?一定是大于16的,而小于。20。但是啊因为一个格子呢就是4KB,那么它就是CPU带取在读取磁盘的时候呢,肯定是四的倍数。
所以呢它取它那个当前文件呢占用的空间呢一定是20KB,咱们可以来验证一下啊。好,你看这个空间。诶。好,是不是20KB没有问题啊没有问题。

好,那么咱们把这个关了,那我讲这些有什么用呢?好,那个当前的这个格子啊,在NTFS的文件系统。是4KB,一个是4KB。那么在它的上层应用呢。
就是说我们的这个my circlercle呢作为呃操作系统上层的应用呢,它的这个每一个啊也就是最小的格子呢,这个data配置呢它其实就是这么这么一个小格子,它是类似的。但是上层应用呢。
它一次性啊只能取N多个格子。所以这个data配置它一次就是my circlercle和呃内存它交互的一个最小的数据单元。那么它的大小只能是四的倍数。在my circlecle里边呢,它的这个倍数呢。
它的这个大小呢就是16KB。也就是说啊咱们当前这个B数的这个图形,每一个节点呢它就是一个最小的数据交互单元,也就是一个data配置也就是一个数据页,它的大小呢就是16KB,并且是固定的。好。
知道了这一点。那么我们刚才在当前这个数里边去进行查数的时候,那么数据ID为7的这条数据呢,我们检索了3次,这是第一次,这是第二次,这是第三次。那么也就是说我们从磁盘中取了3次数。
也就是产生了48KB的IO。那么一个人48KB。那么在高并发是吧?这种场景之下呢,可能就会产生大量的磁盘IO好,那么这就会造成IO瓶颈回过了回过头来看笔记啊,那实际上B数中的存储呢啊。
实际上是这么一种啊,实际上这么一种结构啊,我们放大一些。



好,在每一个节点里边呢,它都存储了哪些信息呢?首先呢啊我们当前这个ID的原始数据,除此之外呢,还有你当前呃这个数据行的这些数据信息。好,我们来打开表上来看。

看一下他的数据啊。好,假如说我们在ID这个字段上创建的索引,那么原始数据啊,就是我们的索引信息呢只是一个呃数字类型,可能占用了很小的空间。而我们其他的这些字段就是nameDIC这些其他的所有字段呢。
就是我们刚才在图中看到的这个data的这一部分,它是比较费空间的。

好,那么还有一部分呢,就是我们当前呃子节点的寻址地址啊,它就是指针啊,这一部分也会占量占用少量的信息啊。但是这一部分呢,比如说我的m max degree等于4。那么当前这个存储指针的这个部分呢。
就只有4个啊。好,那么最占用空间的就是黄色的这一部分,对吧?那么我们想。来想一个问题。我们每一个节点大小是16KB啊,是固定的。那么也就是说我们当前每一条数据的空间如果越大。
那么当前每一个节点存储的数量也就越小。比如说如果每一条呃每一条数据呢占用1KB的空间,那么我们当前这个节点就只能存16条数据。如果每一条数据只占用啊,比如说一个字节。或者说0。5KB。
那么我们当前这个节点就能存放32条数据。以此类推,如果说我们能尽可能的把数据进行减重,比如说我们把这个data不存了。只存它的缩引。那么可能这一个数字占用空间非常非常少。那么这样的话。
我们一个节点就能存放大量大量的这个呃数据。那么比如说我们的数据呢一共有1600万条。好,当我们的数据量很大的时候,我们的节点单个节点存放的数据越多。那么我们需要的节点数也就越少。好。
当我们的节点总数下降的时候,基于这种max degree的这种啊存储的方式是吧?degree DGRE啊,没了是吧?

在哪呢?在这里。好。

缩小一点啊。好,当我们的这个max degree一定的时候,我们的节点数量降低了。那么我们的数的深度就会降低。因为我们层啊当我们的这个层数不变的时候,比如说我们只有两层的时候。
当我们这个max degree产生了3个,产生了4个。比如说这一个节点,这儿一个节点。好,那么我们当前就前两层呢就有第一啊,下第二层有4个就有5个节点是吧?那么我们当前因为max degree的限制。
我们只能通过增加数的深度来增加更多的节点。所以说当我们的节点越来越多的时候,数的深度就会越来越深。好,数的深越数的深度越来越深。好,那么就会造成我们当前这个节点呢不断的向下寻址。啊,不断的向下寻直。好。
每一个节点呢是16KB当我们的深度越深的时候,那么比如说1616,每一次16161616,那么这样呢就会造成大量的磁盘LO也就造成了性能的下降。好了,理解了这个原理之后啊,我们再来看一下什么是B加数。
好,其实呢B加数啊,就是把我们当前这个data啊给干掉之后,你看我们啊这就看着清量多了啊。那这里边呢原本这个位置呢是有一个data存放数据的。好,我们把这个data给干掉了,把它放到了叶子节点里。
那这样的好处呢,其实啊就是方便我们每一个节点呢去存放更多的数据,从而降低我们节点的总数啊,这样的话啊我们的这个磁盘IO呢就会大大降低啊,从而增加性能。好了,那么理解到这儿呢,我们其实可以尝试理解一下。
我们想象一下我们刚开始提的这个问题啊。就是为什么说B加数这种数据。




后呢它不适合做全文检索呢。好,我们再回忆一下什么是全文检索呢?全文检索一般来说呢是在搜索引擎,或者说在这个呃它的搜索需求呢是在文字字段上搜索。比如说我们搜索你拉这个 searcharch。

对。啊,网比较慢哈。那么我们搜索的这个结果,一般来说呢,我们看。😊,一般来说呢,我们搜索的这个结果啊都是在这种文本字段上进行的。也就是说呢我们要创建的索引一般都是文本字段。好,我们打开。

啊,my circlecle也就是说假如说我们这个name呢就是这个title啊,就是搜索引擎里边那个titleDESC呢就是它的内容字段。那么我们想一个问题啊,ID和这种文本字段啊。
有的文本字段呢可能动辄上几KB甚至几兆。那么如果说我们在这个DESC这种字段上去创建索引,那么势必会造成什么呢?因为一个文本字段很大。那么如果我们用B加数这种数据结构啊,我们来看。



好,我们来看啊,那么每一个节点是不是啊每一个节点,咱们来看这个图吧。



好,那么每一个节点的大小因为只有16K。那么如果说我们创建索引的字段呢,是一个文本类型,那么有可能一条数据,比如说一条数据。啊,16KB啊。那么假如说一条数据它的索引大小超过了16KB,甚至是一兆。
甚至10兆都是有可能的。或者说咱们就一兆吧。那么一兆呢,你想想一个节点,我连一条数据都存放不了。那么我一条数据我的索引文件可能就用好几个节点来存储。那么这样呢会造成什么问题。
我的这个节点数啊会指数级的飙升。啊,会以一个非常大的数量级来啊来存储。那么这样呢,其实呢就会导致我当前的这个数的深度呢特别特别深。特别的深哦,从而降低我当前磁盘查询的这个性能。啊。
因为产生了大量的磁盘IO嘛。

好,能不能理解?好,那么总结下来呢,为什么说这个啊。

啊,在在这里啊,那么为什么说盗牌索引不适合做全门检锁呢?好,第一个原因。

索引往往字段很长啊,就是倒牌索引这个全文检锁的字段,一般这个字段的这个索引长度是比较长的。所以如果一般使用B加数来存储啊,那么当前的数会特别的深。啊,所以性能会特别的差。这是第一个也是最主要的原因啊。
这也是为什么my circle达到一个,比如说千万级的时候,比如说达到2000万的时候。啊,或者3000万的时候,那这个性能呢会指数级下降啊,会直接下降很多。好,那么性能无法保证,并且索引会失效。
索引为什么会失效呢?因为如果说我在B加数上创建索引,创建的是普通索引,那么你要查询的时候呢,我们经常在惯形数据库中使用的是这种叫likeck查询是吧?likeck查询。那么因为最左匹配原则呢。
咱们为了保证这个准确度,你不得不在两边啊做模糊查询。那么如果说你在左侧使用的百分号呢,会导致你的索引失效。啊,这个如果不理解的话,可以在搜索引擎中尝试搜索一下什么是最左匹配原则。那么并且精准度差。
那么这个如果你理解了道开索引啊,不是说如果你理解了这个全文检索,那么你应该知道为什么精准度会差啊,也就是说为什么相关度会低。啊,并且无法和其他属性产生相关性。什么意思呢?
就是说呢我们在做毕加数做检索的时候呢,只能用likeck这种方式去查询。啊而我们全文检索呢,实际上是可以关联一些像呃其他的,比如说别名啊呃英文单词啊,或者说拼音啊,或者是昵称啊。
或者是这个混淆字啊、错别字啊,这些都是可以识别的。或者说你像霸道和普拉多这个例子都是可以关联的。但是如果你用这个毕加数来做检索。那么只能说是有一个文字包含的关系。比如说你搜霸道,那么。呃,你搜霸道。
可能这个文本里边是丰田霸道,你可以匹配到。但是如果原数据中存储的是普拉多,那么你显然是存储是检索不到的。也就是说它的精准度是比较差的,相关度是比较低的。好,那么咱们到这儿呢就解释了为什么呃B加数呢?
它不适合做全面检索。

系列 6:P155:FOR - 马士兵学堂 - BV1RY4y1Q7DL
好,我们来看下一个问题,倒排索引底层的压缩算法。那这是一道来自美团的面试题。对应的岗位薪资呢在35K到40K左右啊,这个问题呢稍微有一些难度。如果你了解倒排索引的底层的话。
你会知道倒排索引它底层包含了倒排表,而倒排表是基于两种压缩算法来实现的。第一种叫FOR。那么下面我们来看这个压缩算法是如何来存储数据的。好,那么倒牌索引的样做算法呢。
实际上是基于倒牌索引这个问题所引申出来的一个比较底层的问题。那么我相信啊屏幕前的小伙伴啊,包括很多面试官在内呢,可能都没有真正的去深入底层了解盗盘所以它底层的一些算法。那么如果你想在面试中。
如果被问到这个问题啊,想拿到一个比较高的分数啊,我建议大家是要学习一下这个压缩算法的。好,那么压缩算法它本身解决了一些什么样的问题呢?好,其实呢从字面我们可以看到啊,那么压缩算法呢。
它的目的呢是为了压缩数据啊,咱们之前了解到啊,咱们学习了关于呃倒拍索引,它底层的三种基本数据结构之一叫posting list啊,就是倒拍表。那么它存储的是当前词项所对应的这个映射啊。
映射的是所有的原数据中包含当前词项这个小米。



ID的一个有序的int类型的数组啊,并且是有序的,而且是int类型的是数组。好,那么这儿呢就会涉及到一个问题,什么问题呢?

咱们目前计算机体系呢是基于一个叫冯诺伊曼的啊这么一个啊我就不写了,冯诺伊曼这么一个。啊,计算机啊里边的一个科学家。那么基基于冯诺伊曼这个模型建立建立起来的计算机体系。那么否诺易曼呢有三个基本原则。
其中之一呢就是二进制。也就是说咱们数据的存储呢是基于二进制,何谓二进制呢?好,假如说啊咱们当前要存储一个数字一,那么咱们可以用一个叫we的这么一个东西啊,比特来存储。什么叫一个比特呢?
就是一个零或者一个一。那么当我们数字存储零或者一的时候,我们就可以用一个比特来存储。然而,我们想要存储数字二的时候,二进制呢就发挥了作用。那么此时好,咱们重新画啊。40比如说我存零和一的时候。
那么一个比特已经存不下了,因为我只能存零和一,那么此时我就需要进位。好,本来呢11个比特啊,这是一个比特,我们可以存储最大的数字就是一。而两个比特,那么当前就是我进啊进位了,那么这个数字呢就是3。
这是两个比特。好,当我存储4的时候好,我这把零换成一就变成了11。这就是两个比特所能存储的最大的数字,也就是它的取值范围呢是0到3。好。0123嘛,能存储2和3。当我们存储4的时候。
那么我们就需要介入到第三个比特。那就是100啊,存储5,那就是101,存储6就是110,存储7就是111。也就是说我们单个比特的时候,存储的最大数字就是7,取值范围就是0到啊0到7。好,以此类推啊。
那么这个就是二进制的一个基本原理。对于我们程序员而言呢,这应该是一个常识啊。好,那么我们在定义int类型的字段的时候啊,我们一个类型,我们一个字啊,我们一个数字类型呢实际上是定义了。四个字节。
也就是32个比特啊,这个B是大B啊,是字节的意思。好,一个字节呢等于8个比特,这没问题吧啊,这是计算机的常识啊。那么int类型呢占用4个字节,也就是32个比特。它能存储的最大数字呢就是二的32次方减1。
因为它的取值范围呢就是0到2的32次方减1,没问题吧。这是它的取值范围。好,那么一般来说呢,int我们是有符号整形。所以可能我们其中有一个比特啊,要用来存储这个呃正负号啊,就是正数还是负负负数。
所以我们一般来说呢,int类型的它的最大值呢是二的31次方减1啊,这是这个原因啊,呃大概是21亿多吧。好。

呃,我们简单说这么多啊,那么我们来看现在问题在哪儿啊?问题在于我们当我们存储这个招牌表的时候。

假如说我们当前包含这个此项的ID呢有很多很多。假如说我们有100万个,那么100万个ID呢,也就是。100万个4个字节。因为每个字每一个数字呢是四个字节嘛,我们乘100万。
那么他得到的最终呢就是400万个字节。啊,换算成照B呢,大概就是3。8个MB。好,也就是说我们当前这一个词项对应的倒排表,它所占用的字节呢啊它所占用的磁盘空间呢就是3。8兆。好,看似不大。
但是我们要思考一个问题。我们词项字典基数有可能很大。也就是说我们倒台表当前的3。8兆呢只是一条啊,只是一个缩引才对应的postsing list就是3。8兆。那么假如说我们有11个啊。
这里边纵向基数有11个,甚至更大。我们拿它乘以10亿。那么它的空间是不是就不可估量了?我们要知道压缩倒台表,它的一个目的是什么呢?首先第一个。为了节省什么空间。空间就是我们的成本。第二个,为了性能。好。
当我们磁盘空间占用的多的时候呢,我们会占用更多的磁盘IO网络IO和内存资源。所以说我们一般来说呢是把灶台表进行压缩,然后啊以最小的代价用来存储啊,同时也能提高它的性能。我们后续会讲为什么。

好,那么我们来看啊倒牌表呃,这个FOR呢它是如何做到呃压缩我们的这个盗牌表的。首先呢假如说啊我们当前的这个ID就我们拿小米这个词项为例。假如说它有100万个啊这个包含小米的这个盗牌表的ID啊。



好,我们就以这个为例子啊。

好,那么100万个ID我们刚才已经计算了,它的大小大概是3。8兆啊,我们约等于就按4兆来算啊。好,那么倒牌表这个FOR呢这个压缩算法呢?首先呢它是怎么做的呢?假如说啊我们一种最最极端的情况。
我们这100个ID100万个ID呢就是1到100万这100万个数字。好,我们先来看这种特殊情况。好,每一个ID呢就是一个第1个等差数列嘛,就是1个11到100万的这么100万个ID。好。
那么我们如果用普通方式来存储是这么大的空间。好,那么假如说我们做一个什么操作呢?做一个呃每一个ID呢,我们去减去前1个ID而保存的差值。那么第一个ID呢,因为它前边没有没有ID,所以它就是一。
那么第二个ID减去它前1个ID呢,就是它的差值也是一。第三个减第二个也是一以此类推,那么最后1个ID减去它的前一个数字呢,也是一。所以呢我们100万个int类型就变成了100万个数字一。好。
也就是说我们当前取了一个差值列表啊,下面这个列表呢是上面这个列表的一个差值运算啊,这么一个结果。好,那么有一个什么样的效果呢?首先呢我们称之啊这个下边这个列表呢叫它delta list。啊。
给他起了一个名字叫daelta list。好,我们在面试的时候,可以向监考官去输出这些关键词啊,delta list就是它的差值级。好,那么本身我们一个in类型占4个字节。好,为什么占四个字节?
是因为它的取值范围最大是2的31次方减1啊,咱们就按32次方来算。好,那么我。目前来说呢,这个100万个ID呢因为最大值里边是谁呢?里边是一,也就是说我所有的数字呢都可以用一个比特来存储,为什么呢?
我们来想啊,我们来想呃我们计算机就是我们的JDK里边为什么要定义这个呃int类型。你看硬类型嗯。撤回一下啊。int类型,shott类型。或者说这个浪类型为什么要定义这些类型呢?就是为了用更合适的类型。
好,如果你的确定你的这个数字范围取值范围足够小,我就用更短的类型来存储。这样的话会占用更少的磁盘空间。其实这个也也叫呃叫。这个int类型,你比如说我每个int类型呃四个字节,每个类型四个字节。
这样的话是便于我去检索的。因为我定一个int类型呢,实际上就在我的磁盘上去开辟了一个四个字节的空间。不管你是不是用得完,那么我都占用四个字节,shott类型呢就是两个字节,而闹类型呢就是8个字节。好。
那么这种方式啊这种存储方式呢,其实这个浪类型in的类型shot的类型就是定义在我们的JDK里的。好,那么我们当前呢一旦确定了当前这个取值范围,它的取值范围是几啊?是0到1。
0到1所可以使用的最小的啊这个存储代价是多少?那么就是一个比特啊,就是一个比特。因为一个比特它的取值范围就是0到1。那么这样的话,我们当前100万个数字,本来一个数字用4个字节存储。
那么我们一个数字就可以变成用一个比特来存储。那么原本四个字节是32个。啊,一个那个一个数字类型的是32个比特,我们现在给它变成了一个比特。也就是说,我们当前呢存储的压缩效率高了32倍。懂不懂这个意思啊。
一个比特乘以100万是100万个比特,而32个比特乘以100万就是3200万个比特。好,那么当然了,这个压缩效率最高32倍是取决于我们当前这个数字,它有一定的特殊性。我们这个ID呢它有一定的特殊性。
它比较极端。是吧。真正在啊生产。你如说你在用的时候,这个倒排表它不可能啊恰好是1到100万这么100万个连续数字的,对不对?好,所以我们下面啊我们来看。


当我们这个数字啊比较普通的时候,它有一定的。普通性或者说他有一定的代表性。他。就是一串普通的。呃,声序的in类型的这个数组。那么我们怎么来做呢?
首先呢我们第一步呢还是要啊这是个posting list的招牌表。那么我们第一步呢还是要进行差值运算,计算当前每一个数字和它前一个数字的差值。好,那么第一个数字73我们不变是吧?
那么第二个数字300减73,那剩227,302减300剩2332减300剩30,343减332剩11啊,以此类推。好,那么我们就得到了一个delta list,也就是差值数组。
那么差值数组跟上面的原始数组的最大区别是什么呢?好,这里边有个关键点叫做取值范围。好,取值范围啊,这个有什么意义呢?这个取值范围很重要。取值范围决定了我们当前每一个数字类型,它应该用什么样的类型。
或者说用几个比特来存储,那么我们当前这个取值范围啊是0到227或者2到227。因为这里边最大的数字就是227。好,也就是说,如果我定一个类型能把227存储下来,那么其他的数字存储一定不是问题。
那么现在问题来了,我们应该用几个比特来存储这个227呢?好,我们往右看。右边这儿有一个啊。右边呢是用几个比特啊,左边是几个比特,而呃不是啊,左边是最大的值,而右边是用几个比特。
当我们用一个比特来存储的时候,它的取值方向就是0到1。当我们用两个比特放大一些啊。

好,当我们用两个比特来存储的时候,它的取值范围就是0到2的2次方减1,也就是0到33个比特就是0到2的3次方减1,就是0到74个比特就是2的4次方减1,就是0到15。好,以此类推。
那么当我们要存储227的时候,那么也就是说我们啊我们首先使用7个比特来存储,就是2的7次方减1,就是0到啊0到127。显然,0到127这个取值范围我们是没有办法存储227的。那么我们就需要用8个比特。
当8个比特呢就是就是200呃0到255。好,这是它的取值范围。也就是说我们只要用8个比特来存储227啊,就可以足够去存储它了。嗯,好了,那么现在啊如果我们用8个比特来存储。

好,那么227能存储了,那么其他数字意味着也都能存储了,对吧?没有问任何问题,但是现在的新的问题产生了什么什么样的问题呢?我们用227,用8个比特来存储227是合适的。是没有资源浪费的。
因为7个比特不够嘛。好,但是我们这个数字二呢,如果也用8个比特来存储,是不是显然就很浪费呀?因为。二呢我们只需要用0到3是吧?用两个比特来存储,它的取值范围是0到3嘛。好,我们就足够来存储2了。
你非要用8个比特来存储,那么我们岂不是浪费了中间的这6个比特吗?好,那怎么办呢?我们能不能把每一个数字类型给它定一个合理的。啊,合理的这个类型呢就是说用合理的比特数来存储呢。好。
大家呢一定有这样的问题啊,你面试的时候呢,跟监考官也可以这样侃侃而谈。但是问题来了,所谓int类型。其实只不过是JDK中给我们提前定义好了这个in特类型。那么你定义这个类型。
这个类型实际上是啊你这个信息是就是类型等于一个inter类型等于4个字节。那么这个信息实际上也是需要那地方的那个空间来存储的,对不对?好,也就是说JDK中事先给我们定义好了int。
sht along这些类型,包括这个字符串这些类型,他们都是需要这个这些信息啊,这些类型的信息都是需要空间来存储的。那么咱们定义这个8个比特,5个比特,其实呢它本身也是个类型。
只不过GDK中事先没有给我们去定义这些类型。比如说我们称8个比特存储一个数字,称之为阿尔法类型。啊,阿尔法这样写的吗?好,那么5个比特来存储了一个数字叫贝塔类型。
那么其实这个类型本身它也是需要啊这个信息。你比如说阿尔法类型是用8个比特来存储一个数字,那么这个信息是需要空间来存储的,它占有多大空间呢?一个字节。啊,因为最小的这个空间呢就是一个字节。
比特啊比特是我们计算机没有办法直接拿比特来做这个这个这个和磁盘的交互的啊,最小就是一个字节。好,也就是说我们这个类型呢需要占一个字节。好,那么如果说我们把一个一个数字呢拆分开,那么我们需要为每一个类型。
每一个数字呢单独的定一个类型。有可能这个是比如说阿尔法类型啊,这个第二个数字呢是伽马类型,它是个贝塔类型。那这样的话。好,如果说比如说它是8个字节。好,它是两个字节啊,比如说两个比特,它是8个比特啊。
我我我撤退一下撤回一下。那么227呢,我们用8个比特来存储。而2的话,我们用两个比特来存储。好,那么本来来说呢,如果我二这个数字呢,我用8个比特来存储,浪费了多少个比特呀,浪费了6个比特。好。
那么如果我们硬要用两个比特来存储,那么我们就需要单独给它开辟一个类型。而这个类型使用一个字节,也就是8个比特。好,那么此时所占用的总空间呢就是两个比特加8个比特,最终等于10个比特。
也就是说本身我可以用8个比特来存储,那么你非要用两个比特来存储。那么其实最终它占用的空间是10个比特。反而更多。好,那这就是我们为什么不用啊,就是给每一个数字开辟一个类型的一个原因。好。
真正的一个比较合适的做法是什么呢?我们把这些取值范围相近的数字。拆分成一个数组。比如说从这里边切开。那么这些比较大的数字,我们可以给它定义一个类型,比如说叫阿尔法类型,用8个比特来存储。
那么它们共用一个类型。而这些数字比较小的类型,我们可以把它拆开,放在一个数组里,我们给它定义另外一个类型。那这样的话我们只需要定义更少的类型啊,这样的话我们这些类型信息呢就占用更少的空间。好,当然了。
具体怎么去拆呢?啊,这个是动态去计算的。有可能说从这儿拆性能这个效率更高,有可能是从这儿拆啊,我当然只是为了给大家讲解这个原理啊,假设假设咱们从这儿是拆开的。那么咱们来计算一下当前这个压缩算法啊。
把这个delta list拆分成更细粒度的数组,我们来看它会占用多少空间。首先呢拆开之后,那么第一个数组呃,首先呢取决于这个数组中的最大值227,227用8个比特来存储。好,用8个比特来存储。
那么它本身的每个数字就占用了8个比特,也就是一个字节。那么当前这个数组呢,它一共占用两个字节的空间。那么定义这个类型啊,需要花费一个字节。好,也就是说我们左边这一部分呢一共是三个字节。
而我们右边这个数字啊右边这个数组,每一个数字呢是5个比特。我们一共有4个。数字乘以4等于20个比特。好,其实我们之前在讲倒派索引的时候啊,讲基本原理。之前在讲成数检索的时候讲过一个关于格式化的概念。好。
那么在计算机中呢,最小的存储单位呢就是字节,一个字节,一个字节,一个字节。那么这个呢就是24个比特。好,当我们存储20个比特的时候,实际上。1个81个8前两个字节空间都已经占满了。那么第三个字节的时候。
实际上还有4个4个比特是吧?还有4个比特占据了当前字节的一半。好,但是一个字节你可以把它理解成一个盒子。我们在做交互,做数据交互的时候,我们只能一个一个字节的拿,这是计算机的底层原理啊,这是没有办法的。
也就是说呢我们当前这四个啊这5四个数字呢占用的空间呢其实是三个字节。好,那么定义当前这个数组的类型啊,这个5个比特这个数据类型,它也是要占用一个字节,对不对?一个字节,也就是说加上这三个呢。
一共是4个字节啊,一共是4个字节。也就是说左边是3个,右边是4个。那么我们最终加起来。就是7个之间。好,那这样的效率就是最最高的。好,那么当前的这个就叫做FOR叫frame of reference。
好,如果面试的时候问到了倒牌索引啊,问到了倒排索引。如果面试官向你主动发起了提问,什么样的提问?比如此类问题。好,那么ES是如何保证高效存储倒牌表的这些信息的。



好,你就可以去回答。第一种叫FOR这种压缩算法。当然咱们后边一个还有1个RBM啊,这个好记。RBM啊不叫RMBRBM啊这两种下的算法你先给它解释出来。如果面试官没有问好了,你也可以主动的向他发起啊这个。
就是说向他主动的去解释。好,那么招牌表,你比如说里边啊有一个高效存储的问题,数据压缩的问题。好,引申出来这两种算法。那么可能监考官不知道是吧?那可能你这个题目就拿到了一个比较高的分数。好,那么嗯FR呢。
咱们就先介绍到这儿。

系列 6:P156:RBM - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看美团的这道面试题,倒排索引底层的压缩算法RBM那这个问题呢实际上是基于上一个问题的延伸。倒排表底层压缩算法的第二种叫RBM啊。
注意它不叫RMBOK下面我们来看一下这个RBM是如何来实现的。倒排表的第二种压缩算法叫RBM啊,它的全称呢叫rory米的 mapap啊,背译成中文呢叫咆哮未途。那其实很难理解。没关系啊。
跟着老师的思路一步不来。首先呢这个存在即合理啊,那RBM之所以存在呢是必然是因为FOR呢有一定的局限性。它有它解决不了的问题。什么样的问题呢?我们来看之前的RBM啊。
它这个数组呢其实是有一定的局限性的啊,我们来看啊。

这个数组它有一定的特啊或者说特殊性啊啊可能大家觉得这个数组它既不是连续的数,又不是等差等比数组,又不是什么非分纳计数列啊。那为什么啊它的特殊性在局限在哪哪里呢?好,那么我来说,那么当前这个数组呢。
它是一个比较稠密的数组,何为稠密数组呢?咱们来看这个图啊。


啊,我们来看这个。我这儿呢列出了一个特殊的数组。

好,那这个数组呢啊我放大一些啊,它有一个典型的特点啊,大家可能觉得这数字比较大啊,其实这不是最重要的,最重要是什么呢?

好,其实我们来回过头来看这个FOR算法呢,它本质上的思路呢是为了压缩我们当前啊所谓倒牌表这个数组的。

最大值或者说压缩我们的取值范围。那么零到最大值。如果越小,这个最大值如果越小,那么我们当前这个数组每一个元素呢,它使用的比特数也就越小。因为基于二进制这种原理啊,就必然是这种情况。好。
那么也就是说我们最终的目的呢就是要压缩它的这个数组里边的元素的值,它的取值范围。好,我们来看这个数组。

那么当前这个数组,如果我们依然采取FOR那种呃使用差值计算的逻辑,用前一个值用后一个值减去前一个值,比如说3003万减去2001万。啊,就每一个值呢它计算出来的结果呢,它仍然是一个非常大的数值。
比如说2000万减去1000万,它得到的数值仍然是一个非常大的数量级,对吧?每一个数值减去前一个数值都仍然它的结果仍然是一个比较大的数量级。那么也就导致了比如说本来我2000万啊,比如说用呃。
30个比特,当然这个不是呃,这个数值肯定不对啊。我这举个例子,比如说2000万用30个比特来存储,那么1000万可能它仍然是30个比特,因为它的数量级没有变。好,那么也就是说我们当前如果还使用FOR呢。
可能啊差值列表它并没有起到我们想要起到的那个作用,就是使用更少的比特来存储。怎么办呢?既然差值不行啊,我们聪明的人类呢就想到这个办法,我们使用除法。好,我们把每一个原始数组。
当然我们这儿呃用下面那个数组来举例子啊。我们好,假如说这是个倒拍表,那么数值是比较大的。当然了它的差值也是比较大的。当然没有刚才那个数组那么极端哈,那么6万多减去1000多,当然仍然还是6万多。
13万减去6万多,仍然还是6万多。那么这个数组我们尝试呢用每一个数字啊,就是把每1个ID呢除以一个固定的数字除以多少除以65535啊,6536,为什么是6536呢?好,咱们先暂停啊,咱们先暂停往右边看。
😊。

往这儿看。那之前咱们说了啊,这个int类型呢,它实际上是32个位来存储是吧?每一个位呢存储两个数字,也就是说呢零就是一个0一呢就是一个1而二呢就是1个103呢就是114呢就是100,以此类推。
5就是101。好,这就是二进制。那么二进制的最大存储。数量是二的32次方,也就是int类型啊,是最大存储2的32次方个数字。好,那么我们来看这儿啊,那么这个呢就是1个32个比特数。
那么我们把这个随便拿出来一个数字啊来研究一下。好,使用rolling beat mapap来存储的话,首先呢第一步呢会将这个数字呢转换成二进制。196658,我们来看啊,我们用计算器来转换一下。

十进制的多少196658来看一眼对不对啊?196658转换成二进制。好,那么这个是就是11啊,000若10110010。好,也就是。

哎,也就是这个啊也就是这个底部的这一串数字。好,当然了,前面它不足32位呢,是因为前边呢它没有用到啊,咱们给它补齐就可以了。也就是说它其实仍然是占用了32个比特来存储的。好。
那么这个数啊这个二进制的数呢有一个特征啊,我们把它。高16位和低16位。

分别拿出来拆开。左边呢就是它的高16位,高16位呢前面这个零啊是不做计数的啊。那么后边这个11呢,咱们把它换算成二进制,它其实就是3。啊,咱们刚才已经说过了,零就是零,一就是一。啊。
一十进制的一转换成二进制的一还是一。那么二的话就是转换成二进制,就是103的话就是11。所以呢这个一一呢转换成二进制,它是3,而把后面这个数字啊,把它的这个第16位。转换成十进制。咱们来看一下。
实际上真正有效的啊就是它的后6位110010,也就是这一部分数字。110010,咱们转换成来110010,转换成十进制,结果就是50。好,那么也就是说把当前这个19哎,196658呢。
按照这种方式呢进行拆分呢,拆分成了两个数字,分别是三和50,对不对?



哎。

好,咱们来看啊,咱们尝试把这个196658呢用另一种方式来计算。啊,用另一种方式把它除以一个叫65536。得到的结果呢其实就是3,你可以拿计算机算一下啊。如果我们对6536啊,就是196658。
对6536取模呢,也就是说啊196658除以6536,它的余数呢就是50。哎,是不是发现啊惊人的巧合。那实际上呢这两种啊计算的结果是一样的啊,把它拆分成两个16位数,其实就是65536。
为什么要除以6536呢?就是因为一个int类型呢是32个未来存储,我们处以6536是多少?换算成二进制呢?就是22的16次方。


那么二的32次方实际上是等于两个二的16啊,咱们这样。二的32次方实际上是等于2的16次方乘以2的16次方的。也就是说,32个位呢是int类型,而16个位是什么类型啊?是short类型。RC对吧?
也就是两个shott类型相乘的积。那么我们如果把int类型拆分成两个shothort类型的乘积呢,那么每一个shott类型的最大值不会高于二的16次方减1。好,这就是short类型的最大值。
那么两个上的类型最大值呢啊它们分别都是65535。也就是说我们。啊,这个倒牌表中的任意一个元素,我除以6536,最大值不会超过65535。余数最大就是6535,这是必然的,最小值就是零嘛。
整除了就是零嘛。好,那么我们把当前啊就是原始的这个招牌表做。这一步除法之后呢,得到一个除数,每一个数字呢都会有一个除数。并且会有一个余数,1000就是1000除以6536,除以得数是0。
余数是100062101除以6536,得数是0,余数就是62101。当大于6536的时候呢,这个余数就更多一些嘛。这个呃得数就是2余数就是313,以此类推,当我们把每一个元素都做了除法之后除以6536。
那么得到下边一个数列。好,这个数列如何来存储呢?那么ES中呢实际上它底层呢是套用了一种叫rolling beat map的算法。那这种算法是在loin里去实现的啊。那么首先呢我们把这个T值啊我全屏一下。



好,这里边呢我们可以把它看成1个P86对。T呢就是它的得数。而value呢就是它的余数啊,这些就是它的余数。我们把K呢可以放在一个数组里啊,这个数组呢叫它的K值的数组啊,它因为每一个值。
因为它这个得数呢最大值是65535,也就是说它的取值范围是6535,并且它的最个数呢最多也是6536个啊,也就是说当前的这个上的类型存放K的这个啊存放K的这个盒子,就是就是它。
它的元素的个数最多有65536个。哦,并且最大值呢是65535。好,如果不明白为什么呢?仔细啊仔细想一想,多想一想。并且还有个问题呢,为什么我们要除以6536呢?而不是除以其他的数字呢?
因为这样的呃我们。我们考虑一个比较基础的问题啊。当周长一定的时候。面积最大的值一定是矩形。其实这个原理是非常相似的。这样的话我们可以拆分成两个shothort类型啊。呃。
还有一个原因呢就是方便我们用类型去存储。因为这个shott类型是已经定义好的,我们不需要再去开辟额外的空间来存储这个类型啊。好,那么这个就是一个原因。那么当我们比如说把数字零存放到这个key啊。
shott类型的这个key这个数组里边之后呢,我们把所有得数是零的元素呢,放在一个盒子里,叫container。好,roller get map呢内部呢使用三种container来存储它的value。
第一种叫er ray container。所谓alcon就是代表这里边呢其实就是一个数组。并且是。呃,这个有序的啊这个有序的从小到大排列的一个数组。呃,并且这每一个元素因为都是呃一个st类型嘛。
对吧都是一个short类型,所以它的最大值不会超过65535。啊,这是它的最大值。啊,65535啊。好,并且每一个盒子都和这个K的数组一样啊,最多的元素个数是6536个,但是最大值不会超过6535。好。
那么呃这个。array数组啊是比较好理解的。那么第二种啊,这个array container是比较好理解的啊,这个呃它的三种coner之一啊,容器。那么第二种叫get map container啊。
这种coner呢稍微有一些麻烦。

好,那么有些同学可能不太理解那个be mapap是什么位图是吧?那么咱们在基于冯诺伊曼这种模型的二进制啊这种前提之下呢,其实存储数据的这种方式呢就是用一个比特来存储嘛,什么说了好多遍了。
那么比如说我们存储一个数字。一,那么int类型呢就是四个字节,当然用s类型存储也可以就是两个字节,当然了,如果它大到一定的这个数值,比如说它超过了二的16次方,我们就必须用至少用int类型。
就是四个字节来存储。好,这是咱们之前讲过的东西啊,那么比如说如果我们用inter类型来存储这1000个数字。那么假如说这是1000个数字啊,那么我们当前呢就要消耗4000个字节的存储空间,对吧?

这是二进制的存储,必然会造成的一个结果。好,那么什么叫be map呢?好,那么it map呢,这是一,这是0,这是。2,这是3。好,那么当我用8个比特来存储数据的时候,它的最大数值就是二的8次方减1。
OK那么并且啊我一个八字节一个字节的这么数数字呢呃这个一个。呃,八个字呃8个比特嘛,我只能存储一个数字。最大值是28次方减1对吧?那么如果啊我们的这个比特原本是用来干啥呢?是用来存储数据的。
我们现在存储的数据稍微变一下。我们不存数字了,而是用来做标记。记住啊,有关键做标记。好,标记什么呢?标记我当前这个位置啊,记住啊,这个是beta map标记我当前的这个位置是否存数据了。
那么当前它的位置呢就是它的下标,所谓位置就是下标啊,这下边这个就是个下标,从右往左数比如说这第零位,这是第一位啊,这是第二位,这是第七位好,一共8个比特嘛。好,从右往左数一共是0到78个比特。
那么我们当前这个位置是一嘛,第三个位置是一就代表当前第二个比特,这个位置它存储了一个数字,存储的value值是几呢?就是它的下标。那么当前这个beta map存储的三个数字,分别是2。
5啊第一个数字是2,第一第二个数字是5,第三个数字是7。好,也就是说呢我用了8个比特位,存储了三个数字啊,三个数字。好,如果说我们这个beta map使用率最高的情况下呢。
我们其实8个比特能存储8个数字。但是有一个特点就是首先数字不能重复。其次啊它只能是0到7这么7个数字,最大范围,如果是8个比特,它的最大范围就是0到7啊,取值范围就是0到7,并且不能重复。好。
那么beta mapap有这样一个特点之后呢,咱们回过头来再来看看什么呢?看我们当前这个container,它有一个特点,是吗?


好,我们这个container里边其实是有一个特点的。好,首先呢它里边的数值是不是首先也是不会重复的,因为啥?好,我们往上看啊。

好,当我的照牌表里边的数字,首先照牌表里边存的是ID对吧?ID是不会重复的,并且ID是我们告诉你ID呢是一个有序的从小到大的数度。那么当我的这个。呃,首先呢我除以6536之后,这个数字P是会重复的。
但是重复的T呢会放在这里边啊,把重复的value放在这里边。也就是说呢当我这个一个盒子里啊,就是一个P对应的这个盒子里。我的这个里边的元素是不会重复的,并且取值范围是0到65535。啊,6535。
那么不同的盒子里边会不会有重复的数字呢?比如说啊我举个例子啊,比如说呃第一个ID啊,假如说咱们的原数据呢,第一个有1个一。



那么第二个数字呢是65537好,那么一除以6536,得数是0,余数是1,那么它就会被放在第一个呃K是零的盒子里。元数是一,那么65537除以6536,得数是一,余数是一。也就是说中间会有一个一的盒子。
那么65537呢,它的这个数字一呢就会被放在中间。这个呃P为一的这个盒子里,并且数值也是一。那么也就是说好它的value是会重复,的确会重复。但是重复的这个value呢。
它一定会放在不同的container里边。不会见面的,明白吧?好,那么也就是说呢我这里边呢最极端最极端的一种情况,65536个数字呢都已经放满了。

65536是都已经放满了,分别是012点点点点点点点点到65。等到6535啊。到65535好,0到65535一共65536个数字都填充满了,这是最极端的情况。哎,我们有没有发现有个很巧合的情况啊。
我们的runing bit map正好也是能存放,若干个连续的不重复的数字。那么如果我们用65536个比特来存储这样一个数列是不是非常合适啊?因为啥呢?
因为我们只需要用65536个比特就能存储65536个数字。

个数字。对吧好,如果我们用硬的类型来存储,我们来想65536个。字节啊乘以4啊要乘以4个字节。对吧那么是多少乘以4就相当于乘以32个比特。是吧。要占用这么多个比特。
而我们beter mapap呢只占用了6536个。对不对?这就是一个性能的呃这个存储效率的一个区别。好,那么针对这两种啊存储方式的不同,一个是array啊,一个是beat map。


他们的这个效率是有区别的,并且他们是各有优势的。因为既然他们两个同时存在,不要觉得dta map的生用效率很高。但是如果你比如说B5536个。好,我们往下看啊我们往这儿看。

假如说我们有1个65536个呃比特的这么一个beta map。那么也就是说这个010101有65536个,但是我们这里边就填了一个数字,那是不是也是非常浪费啊?如果说数字特别少的情况。
我一个数字是多少个字节,是32个啊,等于32个比特。好,但是我如果用位图,那就是65536个。

好,你除以一个8,你再算一下,肯定是比32要大的,对不对?肯定是比32要大的。也就是说呢好,在不同的情况下啊,我要采取array和beter map的这两种是哪个countener呢?是要动态决策的。
怎么决色呢?咱们来看下面这个图啊。


好,那么这一张图呢就非常清晰的展示了使用aray container和beat map container的一个曲线图啊,或者说一个走势图。好,那么当然了,这个横轴呢就是我们当前的文档个数啊。
就是你的ID的个数number of stop。而Y轴就是当前啊你使用这些啊就是存储这些文档ID呢所占用的空间啊,memory。used啊us啊。那么咱们来看,当然零个文档的时候是不占空间的,没有问题。
那么当我比如说有一个特殊点是40964096个文档的时候,如果使用耳瑞卡,就是4096乘以多少,一个数字占用它是shott类型的16个比特,对不对?好,咱们换算一下,4096乘以16啊。
咱们找计算器来算一下。

还好。4。096乘以16这么多个比特。好,我除以8得到自结数。等于808192,再除以个10哎,不对啊,1。024好,除以1024得到的就是KB数,也就是8KB。咱们来看。

好,图上得到的结果呢,这个点呢其实就是当。我存储4096个数字的时候。好,我使用array container占用的就是8KB。对不对?好,那么当文档各数4096个数字的时候。
那么因为啊我beat map,我固定6553。6个。比特对不对?好,因为我是固定的。

因为为啥固定呢?因为我的盒子大小是固定的。

好,我来看啊。因为这个盒子大小是固定的,它最多有65536个数字。为了我们能兼容最极端的情况,就是这个盒子装满了,一共6536个数字。所以我们的这个beta mapap呢。
我们也要定定义到6536个be。

所以啊6536个B的呢换算成大小呢,咱们刚才其实已经换算过了,那就是8KB。也就是说65536个数字,65536个这个6536个容量的这个beatter mapap啊。
bit map它不管存储多少个数字,哪怕存储一个数字,它的大小恒定是8KB。好,那么这样咱们选哪个就非常清楚了。当我数字就是文档的个数呢小于4096个的时候,我使用array container。
它占用的空间是小于8KB的。当我的文档大于1096的时候,那么。显然使用这个beta map container啊是更合适的。因为它的空这样的空间更小。好,那么我们就很清楚的知道在什么样的情况下。
我们应该使用哪一种container,比如说array还是beta map。


好了,那么下面呢我们这儿列出了一个对两种不同的container所占用的空间的一个呃等式啊,一个式子。呃,还有一种呢叫ra containerer,这种就是比较特殊了。它是loin5之后啊。
loin5之后新增的一个coner呃,适用于哪种情况呢?你比如说像这种比如说我的这个原始的数据啊,原始的文档啊,完原始的这个招牌表,它有一种更极端的情况。比如说它的ID是1123点点点点点点到100万。

那这种情况呢,实际上我们有一种更高效的存储,我们只存头和尾。好,我们只存一和100万。因为我们知道这个数组是连续的,所以其实我们只需要8个字节就可以了。对不对啊,只需要8个字就可以了。那这样的话效率啊。
如果存100万,即使用不管用那个bitt map啊,或者是这个run或者是con,它的效率都是远不及这个run container的。好,这种情况呢就比较极端啊,咱们知道就行了。
一共这么三种bit map啊。


呃,一啊不是一共三种container啊,这是关于rolling map压缩算法中的呃它的一个具体的过程啊。那么只有啊就是面试的时候啊呃,一定要知道这个FOR和RBM这两种算法。
并且要知道他们针对的不同的场景RBM。

好,FOR是针对于一个叫稠密数组。F而这个RDM呢针对的是稀疏数组。给面试官说清楚就行了。啊,有有可能有的面试官都不知道这个这两种算法是什么。好,另外不管是哪种算法,它的作用,都是为了压缩招牌表啊。
倒牌表知道是什么吧?

好,再回我们来再回顾一下啊,招牌表就是倒牌索引的三种数据结构之一叫招牌表。

好,那么呃这两种压缩算法呢就给大家聊完了啊。

系列 6:P157:字典树 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们来看下一个问题。什么是字典数?啊?这是一道来自百度的面试题,对应的岗位薪资呢大概在30K左右。我们来分析一下面试官为什么会问这么一道问题。其实倒牌索引的底层的数据结构FST啊,就是基于字典数啊。
也就是前缀数,它的变种衍生而来的。O那么下面我们来看一看这道问题,我们如何来回答。好。回答这个问题之前,我们先回到之前一个问题啊,我们在讲倒排索引原理啊,基本原理的时候呢,遇到过这样一个问题。
我们稍微放大一些好。

我们讲到这个图的时候呢,实际上是把全文检索啊基本的过程呢给大家讲明白了。那么右边作为原始数据呢,我们首先呢有一个前提呢,就是这个数据有一个很大的数量级。比如说10亿啊,我们的单位是亿。好。
那么如果我们在某些文本字段上做检索的时候,无非就是面临一个扫表的问题,一个精准度的问题是吧?我们要做模糊查询。好,那么首先我们抽象的把这个二维表格作为了一个盗牌索引,它首先只解决了一个问题。
就是把模糊查询呢变成了精准查询。什么意思呢?好,我要包含以上若干信息呢。我这个字段呢不能只能不能就是说准确的就是说做一个eccels查询,不能说去做等号查询。所以说啊性能会非常的差。
那么倒牌索引呢无非就是把这些啊拆分成成一个一个词像。那么如果说如果说我这个字段里边的词项特别多,又没有重复,也就是所谓的一个高级字段。那么这种情况下呢,会面临一个问题。
我的term diction呢就是存降子典,有可能数量级是大于我的原始数据,它的数量级的。比如说这个是10亿,那么有可能我这有100亿个行,对吧?这都是有可能的。啊,当然这是一个极端的情况啊,那么。
这样的问题会导致我们呃思项字典在做便历的时候,或者在做检索的时候呢,又面临一个更啊更复杂的这个性能问题。

怎么办?好。带着问题啊,我们来看什么是字典数。首先呢嗯我们要我们理解这个索引啊,它是帮助我们去做快速的检索和查询的是吧?那么要实现这个目标呢,其实我们首先要追求两个最基本的要求啊。
那么其实这个也是我们软件行业呢自打诞生以来啊,所到目前为止啊,不断在追求的一个目标。所谓的小呢就是通用最小化算法啊,我们能用一个比特来存储的。啊,这个数据我们坚决不用两个比特。好。
不要觉得我们这样抠细节啊,其实这个和性能啊和ES的性能高低是有直接的关系的。当然,不光是ES啊,任何任何软件你用到的readdis啊,或者说这个这个其他的一些中间件呢啊都是一样的。
它都要遵循通用最小化的算法。我们能用最更小的空间来存储。我们坚决能省得省。它不像我们在嗯可能在做业务开发的时候,我们关系型数据库my circlecle是吧?你起一个名字,比如说我的name字段啊。
你随随便便就给了50个字符的长度。那么可能大家觉得这个50个字符的长度啊,是足够我们用了。但是大多数我们比如说起一个name可能就是4个字符啊或者8个字符就够用了,你没了足够用就开辟了50个字符的空间。
但是只要你啊只要你不管用或者不用,我们当前都要占用50个字符的空间啊,当然了,这是可变的,这是不可变长度啊。好,扯远了,咱们首先要理解,咱们要用最小的空间存储最多的数据啊,这是通用最小化算法。
那么快呢就是我们检索的速度要足够快。好,带着这两个啊带着这两个信息呢,我们往下看啊。

那么我们把当前这个是从英汉字典里边截取的一小段啊一小段内容。那么我们以它来代替什么呢?来代替我们当前这个思想字典,我们可以把它理解为就是英汉字典的英文部分呢,理解为这一部分,这是我们要存储的信息。好。
但是有点区别啊,这个英汉字典里边是有只有value的,就是我们这个是key,后边有个value,咱们先不用管它value。其实在。


嗯,这个慈项字典它的最终存储方式呢是FST里边也是有valueue的啊。但是咱们先先不用管,先来看字典数。好,那么我们现在要做的什么呢?要把当前。

这一段啊就是这一串英文单词,我们做高效的存储。好,那么我们当然这的数据太多啊。如果说英汉词典可能有比如说上10万个单词啊,甚至呃因为这是英汉词典,就是说可能就是这么一个数量级。
那么我们有可能存储的是全国人啊,外国人的姓名啊,比如说全国的这个人口人口普查有60亿啊,现在可能是70亿啊,70亿个人的姓名啊,如果全都是英文字母的话,它是不是一个非常庞大的数量级啊。
咱们先不用管什么70亿啊,咱们就看1万如果说10万个英文单词,按照字典序来排,什么是字典序呢?这其实就是字典序啊,我来解释一下啊,有人可能还不知道。那么我们来看啊,首先如果一个字母A。
它一定是排在第一位的。好,只要是我们来看啊,当前前两个字符呢abbandon放弃。那么第和第二个单词是有一个公共前缀的。abbandon后边有个MNT,那么MENT就排在后边。
也就是说呢我们第一个字母一定是首先呢哎。

我们首先排序呢是按照第一个字母来排。第一个字母是A的,一定排在第一个字母是B的前面。如果第一个字母相同,看第二个字母。好,我们来看第二个字母,第二个字母都是B。那么如果说第一个字母都一样的前提下啊。
我们来看第二个字母,第二个字母是B,一定排在第二个字母是C的前面。如果第二个字母都一样,我们来看第三个字母。好,第三个字母,我们这儿就有一点区别了啊,我把这个。重新画一下啊。好,我们来看第三个字母。
第三个字母,我们看第一个是A,第二个是A,那么第三个就不一样了。第三个是B,那么B一定排在A后面。好,第二个字母,第三个字母仍然一样。我们看第四个。没有的话一样的话,我们再看第5个、第6个、第7个。
直到看第八个啊,空白排在最前面。啊,后边是任何字符都要排在后面,这个就是字典序。其实我们在很多比如说电影的演员表,他们都是按照字母呃字母的顺序啊,其实就是按照这个字典序来排的。好,知道了字典序之后。
我们再来看当前如果我们要存储这一系列的英文单词,那么如果我们为每一个单词开辟一部分空间,是不是会造成很多浪费,为什么呢?你想啊如果这个单词有10万个。假如说呢这个10万个都是以A开头呢?
或者说里边有9万个以A开头呢?那么其实这个字母A这个字符A,我们是不是要存储10万个。是不是非常浪费啊?其实甚至说像这种你看完全重复的这些abend和abment。
那么这两个词呢其实就有6个7个字符是一样的。那么我们有必要把它存储两次吗?其实没必要啊,我们可以把它作为一个公共的前缀来存储。那么这个也就诞生了叫前缀数。其实叫字典数啊,那么它也可以这样叫叫profi。
啊啊他两种叫法都是一样的。好,那么我们往下看啊,假如说我们要存储这么一个英文单词,我们下面呢来演示一下。呃,我这儿呢假如说这个t拼写错了啊。好,假如说呢我们下面呢就是这是一个字典啊,这是一个词项字典。
就是我们倒派所用的词项字典。我们就以四个为例啊来演示一下它存储的一个过程。好,首先呢我们要存储第一个term啊,这就是一个词项嘛。Okay。叫MSB。那么我们之前讲过什么呢?讲过这个。🤧呃。
B数和B加数啊,那其实这里边的节点的概念是一样的啊,节点里边会存储很多信息。那么。那么这个箭头啊这个箭头它就叫度。它就叫杜,咱们在。cer啊这个这个前缀数啊,carry啊,这个怎么读的?好。
这个前缀数里边呢,我们用箭头来表示它的度啊有点粗度。因为它是往右出出去的嘛,出度。好,那么当前的这个零呢就代表一个节点,这个节点里边也是存储的一些信息呢啊。比如说它是一个起始节点是吧?
那么我们起起始节点可以标个号,零这个节点呢它有一个出度啊,我们来看其实其实呢你像这个每个节点呢可能有多个出度是吧?指向多个子节点啊。那么我们当前输入零节点。
那么它的第一个出度好来存储第一个字符MSB的第一个字符就是M啊,然后那么它指向它的一个它给的节点啊,就是目标节点。好,我们称之为一给它标个号。那么一呢有一个出度叫S。

就是存储当前MSB的第二个字符,同样B第三个就是第二个第三个节点的出度。好,因为B是最终字符,所以我们指向一个final节点。啊,就是中止节点。我们用这个粗一点的这个边框来表示啊。好,那么我们来看啊。
当我们去存储MSBTECH的时候。好,同样我们可以在这个数上进行扩展。那么前一部分实际上都是一样的。MSB啊MSB到这儿是一模一样的。那么当输入到T的时候,这个也就是它的第四个字符啊,我们。
这个字符那么到这儿为止,到这儿呢,就要在它原本的这个终止节点上呢去引出一个出度。然后我们来存储字符T。好,然后我们接着往右看啊。好,然后最终呢就是TECH啊一个一个指向指向最终节点。
当H是呃这个当H是最后一个字符的时候呢,我们指向该种节点。好,终止节点有两个啊,当前这个数呢有两个终止节点。好,这个终止节点的作用是什么呢?啊,其实我我待会儿给大家演示一下啊。
这个终止节点是用来判断当前是不是啊存储了一个完整的字符串。好,我们来看第三个词项啊,就是MSN。好,那么这儿就有点区别了。同样MSB和MSN的这个公共前缀是什么呢?
首先呢前两个字符呢有一个完整的公共前缀。到第三个词项的时候,那么公共前缀变成了MS。好,我们看到这里边呢,其实应该明白一个道理啊,就是说我们每一个词项在输入下一个词项的时候呢,都要判断我们的公共前缀。
最大公共前缀。前两个词项的最大公共前缀是MSD到前三个的时候,他们三个有无公共前缀就是MS好,MS也就是说当S指向下一个节点的时候。往下看啊,当S指向下一个极点的时候,它们就会产生分支。
MSN也就是S指向这个节点,它就会有两个出度。第一个节点就是指向MSB这个数的分支。而这个N呢就是一个指向的另一个分支O并且N指向的这个节点也是一个final节点。OK好,以此类推。
我们输入WLTECH的时候。好,那么这个就有明显的区别了。什么区别呢?我们看到MS开头的啊已经结束了。那么到WLTECH的时候,它们的初始节点都不一样了。第一个字符都不一样了。那这个时候呢。
其实呢我们当前零这个节点其实就是entre啊,初始节点。那么零这个节点呢我们往下看啊,它初始节点就会产生一个。第二个出度啊,其实这是一个出度,这是一个出度。出度我再写一遍。好,产生了两个分支。好。
那么也就是说其实M这个里边有它的公共前缀全在这个分支里边。而W的公共前缀全在下面这个分支里。好,当然了,咱们WLTCH往下存储,大概就是这个样子啊,那么最终指向一个终止节点。好。
那么下面啊呃我来讲解一下这个数呢,它有一个呃什么样的特点呢?首先呢是最大限度的来保证我们前缀的复用率,比如说前两个单词,比如说前三个单词,如果像我们当前这种情况,我们在存储这种大量有重复字符的时候。
比如说那么AB如果有1万个以AB为前缀的时候,我们只需要指存储1个AB。当我们有比如说有5000个以ABA开头的啊三个字符重复的这个公共权缀的词项的时候呢,我们同样也只需存储一个。
并且这个AB也没有浪费。好,那么这样的话,我们就最大程度的保证了前缀的一个复用率。其实这里边还有问题,因为我们没有公共后缀,我们来看这个问题。好。往下。好,也就是说呢。
其实WLTECH和这个上面MSBTECH那么这两个分支呢,因为初始啊就是第一个初度第一个字符都不一样,所以初始节点这个NJ节点呢产生了两个分支。但是呢你看这里边呢。
其实还有一部分字符是重复的TECHTECH好,那么这个就是咱们后边要说的FST了啊。也就是说,在前缀数上做优化啊,同时我们要共享后缀,并且我们还要存储value值。因为我们要存储的这个值呢。
它还有什么呢?他还有个value60呢,是吧?也就是说我要我们要存储的这些信息。好,那么这些信息啊在FST里边存储着什么呢?好,我们后边再说啊,呃,下面的话我来演示一下。
就是用一个网站小网站来演示一下这个字点数,它存储和便利的过程。我这儿呢有一个网站啊,这个网站咱们之前也用过。

好,我们找到这里边呢有一个。

啊,在这呢啊,叫哎在哪呢?

啊,在这儿呢啊叫四点数。

好,字典数啊,我们尝试把当前我们的这个例子呢一个一个的去录入到这个字典数里面。

inert好,我们来看这个过程啊,放大一些。

它是不是创建了第一个分支MSB指向一个终止节点啊。那当然这个终止节点,它这里边呢实际上是用了一个绿色的填充颜色来表示当前它是一个final节点。好,那么我们来接着来看啊,当我们存储第二个磁项的时候。

诶。第二个事项MSBTECCH我把这个速度调慢一些啊。

好。没有。好,看第一个第一个节点哈,发现第一个出度是相同。MSBTETECHMSB前三个出度都一样。好,我开始产生啊,在这个终止节点后往后延伸。

TECH。好,当初度变为H的时候,判断当前指向的是中值节点标率。OK好,我们来看第三个事项MSN。

好,来,我们输入MSNreer。好,第一个出度相同啊,这个空的是ent垂节点啊,初始节点。第二个相同。第三个不同了,那么产生了第三个啊,就就是S这个节点呢。因为它的出度不同,所以产生了第二个分值。
也就是N指向了一个终止节点,它也是一个final节点了。好,我们来看最后一个啊。

好,最后一个呢,首先初始节点,因为第一个字符都不一样,1个M1个W,所以初始节点就产生了第二个出度。那么也就是说初始节点我产生了第二个分之TECH。好,让他慢慢来ECH。好。
最后一个直向中止极点H就是中止极点。好,标率完成。好,那么我们当前这个字典数就已经呃创建完成了。那么怎么辨历呢?好,假如说我查询当前数中是不是包含一个叫MSB的这么一个词项,怎么来检索呢?哎。
我们便历一下啊,不在这儿啊,在。

啊,find好,点find呢就是在当前数中电力是否包含我们当前这个词项。查询首先看它的过程。好,首先根据点啊,第一个出度M有好,第二个出度S。

B有,并且好这里边注意啊,它检索的过程,我们要检索看这个输出结果,首先是放的,就是发现了MSD。那么第一个字符M,我在当前初始节点叫ENTRY。我们在初始节点中,电力有没有第一个字符M。
首先我们发现了它的速度M,我们就去顺着M去查询它的target节点,目标节点。好,M这个节点找到之后。查询有没有SS发现好,这个M的唯一出度就是S。那么接着往下走。那么B好,那么S呢有两个出度。
1个B1个N显然这个B是存在的,那么指向了B节点。那么是否当前啊就是查询到了这个MSB还取决一个条件,就是最终查询到的这个节点,它是不是一个发译中节点。好,显然B是一个value动节点。
所以执行的结果呢就是查询到了MSB。那么我们再换一个例子啊,MSBTE。TE。好,我们来查询。首先,MSB肯定没问题。MSB。好,接着往下走,T找到了E也找到了。但是我们看结果not found。
这是为什么呢?好,首先我们MSBTE这个此项呢在这棵树中每一个出度都找到了MSBTE,但是不符合一个条件,就是最终这个E指向的这个节点呢,它并不是一个。诶。并不是一个什么ban节点。😡。
所以当前没有查询到,所以当前这个数中并没有存储MSBTE这个词项。那么我们再来看,我们把MSBT啊MSB改改成MSD查询。

M。S好,到这儿往下看。C没有找到。首先MSnot found。那么M第一个字符找到了S第二个字符找到了。那么S指向这个节点呢,它并没有一个C这个出度,所以也就是说没有找到C字符。
所以最终是not found的。好,那么这个就是字典数的一个存储和便利的过程。

系列 6:P158:FST 的构建原理 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看下一个问题,讲一讲FST底层的构建原理。这同样是一道来自百度的面试题。对应的岗位薪资呢在40K到50K之间。那么这个问题呢是有一些难度的。FST呢是倒排索引底层的数据结构。
那么一般来说在面试倒排索引的时候,FST通常会做为一个进阶或者衍生的问题来提问或者回答。好,那么下面我们来看一看这个问题该如何来回答。FST是什么呢?FST名字叫有限状态转换机。那么这个名字比较抽象。
很。很不方便我们去理解。所以在我们理解FST之前,我们先来看一种数据模型叫FSM。FSM叫做finit。也就是有限状态机。那么这个这个东西是什么干什么的呢?好,我们来看下边这个图。我们用这个图来表示啊。
比如说表示周老师的一天,那么他的一天可能有以下这么几个状态。首先是睡觉吃饭啊,周老师有可能在卫生间有可能啊这一天有可能在工作,有可能在玩手机。当然了呃,这个是没有开始,也没有结束的。
他有可能这个时候在睡觉,有可能这个时候在工作,工作累了,有可能就玩手机,玩完手呃,手机玩玩完了,有可能又去工作。当然了,工作的时候有可能去上厕所。当然了呃这个啊这个描述这个周老师一天啊。
这个数据数学模型,这是一个数学模型,叫做有限状态机。那么它表示有限的状态。也就是说我们在呃。我们在表示一件事儿的时候,这个状态是有限个的呃,并且这有限的状态之间可以互相转移。
OK但是呃这种有线状态机啊有有几个特点。首先状态有限个。另外的话,同一时间啊只能呃只能处于同一个状态。也就是说比如说。周老师在吃饭的时候不能不能同时睡觉,对不对啊?吃饭的时候不能同时睡觉。
工作的时候不能同时睡觉,工作的时候不能同时吃饭啊,其实我有的同学可能会教一个真儿啊,说工作的时候我一边工作一边吃饭,或者一边吃饭,一边上厕所是没有问题的啊,不要这么杠,咱们只是啊描述这么一个问题。
描述这么一个现象。这种机制呢啊是存在这样的问题。就是说首先啊我是一个我是一个有环的,有闭环的。我可能是无限的循环,就是说没有没有一个开头也没有一个结尾,所以状态是无序的。
那么它的特点就是说我们用一个节点来描述一个状态。我们看到这个圆球形的形状,叫做da是一个节点,它来存储一个状态。那么我们用这个边用一个双向的箭头来描述状态之间的转换啊,其实在FSM里边,这种叫做度。啊。
不光FSNM里边叫数啊,很多种数据模型。比如说呃多路平衡查找数,也就B数啊,B数和B加数,它们都是其实又叫多路平衡查找数啊。多路平衡查找数之间的那个路其实就是说的是柱。来,我们看一下。好,我们看B加数。
B加数里边有一个属性叫degreeedee这个也也就可以理解为度。所以max degree等于5,也就代表我们当前这个B加数的最大出度等于5。

好,在这里边我们用箭头来表示度,这是它的几个特点,有限的状态啊,是一个闭环。OK当然了,所以说周老师的一天有可能是这样的,先去睡觉吃饭,然后上卫生间工作睡觉,有可能是工作、玩手机、工作卫生间。
有可能是工作工作工作,对不对啊?当然了这个不会是同一个状态,我们会记录多次啊。OK有可能是工作,玩手机工作。当然了,这种不确定性有很多,它有可能是很多种情况,而且这种情况是无限多个,并且呃没有。
并不代表睡觉就是他一天的开始。有可能啊0。00的时候有可能是在吃饭啊,有可能是在上厕所。所以啊FSM是一个呃无效的,也就是说它是没有顺序的。OK这就是FSM,也就是有线状态机的一个机制。好。
理解了这个机制啊,我们再来看另外一种数学模型叫做FSA。和FSM不一样的话,呃,FSA叫做有线状态接收集。那么和SSM的区别就是呢我们有了一个开始节点和一个final终止节点。
意思就是说哎我们的一天啊从哪开始是要固定下来了。比如说啊我们同样用一个圆圈来表示一个状态,用一条出度来描述啊一一个事件的转换啊,这里边存储的其实就是我们呃图像中的字符。OK我们还是以刚才那个例子啊。
还是以刚刚才这个前缀数的这个例子,我们拷虑下来考虑到这儿啊。我们看一下,如果使用FSA来存储这个comitionary这个词项字典啊,它的存储的过程是怎么样的?首先输入MSB的时候,和前缀数是一样的啊。
开始节点终止节点是一样的。MSB分别对应3条出度。OK当输入MSBT值的时候,还是和前面数是没什么区别的。这个时候呃,节点三作为一个终止节点来表示。
节点三是MSB的一个final nodefinal node的一个终止节点。节点7表示MSBT的一个终止节点OK那么区别在于什么呢?区别在于我们刚输入MSN的时候。如果我使用的是前缀数前缀数啊。
那么这个节点啊这个节点的初度是指向一个单独的节点的。我们可以去看一下是不是这样的啊,它是指向一个单独的节点8的。如果我们使用的是FSA啊,有线状态接收机。
那么我们当前这个出度是指向直接指向同一个终止节点嘛,也就是这个vimo。状态为7的这个节点。OK那这样做有什么好处呢?我们为什么或者说换一句话说,我们为什么要这样做呢?哦。
那么我们把当前WLTH啊作为一个。啊,再次输入我们看一下为什么要这样做。如果我们使用WLTH啊,WLTH呃,使用MFIA来存储的时候。和上一个前缀数不一样的是。当WL啊第一个出度不同的时候。
那我们后边便不会再有交集。那么如果使用FA的时候,WL啊W第一个出度和M和零零节点的第一个出度不相符的时候,我们新开了一条就是新开了一条路WL没有任何重复的地方,那我们TECCH啊。
因为和上一个和MIN输入的时候,TECCH是可以重复使用的。所以啊我们把终止节点这个WL的终止节点值呃不是终止WL的下一个节点指向了这个节点3。那么TECH就呃得到一个复用。那这样的话。
我们又提高了这个数据的存储的使用效率。那么观察一下FSA有什么特点呢?首先是确定性,也就是说在任意几定状态下,对于任何输入只能便利一个transor。什么意思呢?比如说我们便利WLTH的时候,呃。
在节点零的前提下,我们只能走啊走这一条走这一条幅度啊,不可能重复便利同一个状态。也就是说实际上我们FSA是没有呃是有向的不循环的。所以我们不可能比如说我们WL从这个三节点要绕过去,那是可能的。
O这就是说不可能重复遍历同一个状态。单个的唯一性就是说紧张啊紧当啊当前紧张有限状态进在输入啊末尾处于终止节点啊,最终状态时,所谓最终状态就是我们啊以粗框你这个边框加粗的这个节点来表示。
当只有处于最终状态时才接受的输入序列。什么意思呢?其实和前面数一样。比如说我们输入的是MSBTECCH啊,这个时候我们可以啊放的就是说我们接受这个输入,呃,代表当前MSBT取是一个完整的图像。
当我们输入MSBTE的时候,因为节点5不是一个中止节点,所以也就是说我们不接受特定的输入。也就是说当前的图像不存在。好,举例MSMC是否存在MS不存在MSC啊,因为初动不存在,所以啊这个实项也不存在。
OK那下面啊我这儿给大家去描述了呃在。FSA这个检索过程,它的一个便利顺序。首先是节点0,节点0的时候,我们当前出这个节点没有任何出度,T式的运营。当输入MSB的时候,呃。
当输入这个当这个状态达到节点一的时候,呃,我们的T变成了M。当状态变成了二的时候,我们K变成了MS。当状态为三的时候。K为MSB以此类推啊,因为MSB这个final节点是一个final的节点。
所以啊我们就找到了MSB。同样呃,如果。呃,这个状态接着往下走啊,4567到7的时候,我们也就发现了MSDTCH这一个。呃,这一个节点那不是这一个时项。啊,到七怎么办呢?到7哎。
我们退回来到2退回来节点6543到三的时候,因为3啊T是节点三的唯一一个出度,所以我们就往后退往后退推到节点2当退到节点二的时候,我们刚才已经便利了B的出度,所以我们要便利下一个出度,便历下一个初度啊。
T啊这个N是节点2的下一个出度,所以我们便利啊便利完之后呢,我们便要变立一个N初度N啊,初度N因为它也是一个终止节点,所以我们就便利到了MSNMSN。OK那么同样啊到MSN以后呢。
我们还是要反向的去啊反向的退回去MS二节点二节点呢,因为N是节点二的最后一个输入,所以我们要接着往后退。S只有唯一的输入,接着往后会到M的时候。因为M还有下一条出路叫W,那么这个时候我们就要开始建立W。
也就是节点走到9,然后以此类推,WLWL找到三个节点WLTECH。OK那就这就完成了我们呃四个图项的一个便利。OK也就是说完整的FIC的一个变过程。好,那我们思考WL是否存在呢?
因为如果按照我们刚才说的呃,首先我们输入WL。第一呃我们前几个条件都满足,并且我们观察当前紧张,我们输入的最终状态呃,是一个呃这个末尾是处于最终状态的,就是WL指向的一个节点,它是一个终止节点。
但是关 node。那么我们也就代表我们当前输入LFL呃WL的时候是应该有个输出的。但是我们当前的图项字典里并不包含WL,对不对?所以为了解决这个问题呢啊我们就引入了一种新的啊一种新的。
也就是我们今天要讲的这种数据结构叫做FST有限状态转换机。啊,你先状他找问。嗯,其实FST啊最重要的功能就是实现Kvalue的映射。什么意思呢?就是说除了K,我们刚才看到的这儿只有K,对不对?
我们的K值是4个值向,那么FST支持K到value的映射。也就是说我们的每一个指项对应的应该是有一个value的啊,相当于但是FST啊经过检测,因为FST的查询速度要比哈需要要慢一点。
但是它有什么好处呢?它可以极大程度的节省内存。因为其实字母只有26个。如果按理来说,我们如果使用FST来存储的话,我们只需要这个最最大出度不会超过26个。那么有人有同学问了,哎,我们的词像有中文啊。
有中文怎么办?虽然有中文啊,但是我们有一种东西叫编码,比如说常见的中文编码,UTF8,对不对?啊,可以把中文转换成英文啊,用来存储。那这样的话,实际上你不管多少个图项,不管多少个词项啊。
我们其实最终可以把它压缩成一个非常小的数量级。这样的话呃我们就有条件把一个实项可能上一行的数据,甚至缓存到内存里边去。啊,所以它达到的特点它的特点就是说在呃内存的使用上要比他基M少很多。
但是可能性能上要比还子慢一点,但是仍然是一个非常快的呃,这个查询速度啊,是可以接受的,查询速度非常快。FST在路ing中使用的非常广泛。比如说道派索引啊,同义词、正态索引。
还有搜索关键词、建义词等等等等。好,那FST啊说到这儿,FST其实我们还是不了解什么叫FST。FST顾名思义有限状态转换题,这儿既然多了一个转换。首先啊我们往下看。嗯,我们来看这儿往下往下翻。啊。
来看这里边是FSP的一个构建过程。首先我们给每一个磁项去多了一个value值。啊,这里边的value值是我提前给好的啊,是比较具有代表性的。我们观察怎么样去把呃。
这个value值存储到FST的这个构建过程中呢。首先FST和FSA的啊一样,也是一个有一个初始节点,有一个终止节点。我们仍然用这个。呃,粗框的节点来表示终止节点。但是不一样是每一个呃终止节点的话。
有可能会有一个那个outputfinal out的final output的一个输出。嗯。OK那么我们接下来把尝试把这下面几个词项啊通通的去存储到呃FSP的这么一个结构中去。首先是输入MSB啊。
输入MSB的时候啊,因为MSB有一个value,它跟MSSA的区别就是多了一个value。那么我们怎么去存储呢?好,这个其实我们可以参照FSDloing底层一个源码,我们来看一下啊。啊,我们打开看一下。
啊,稍微等一下啊啊,这里边FG已经打开了。

好,我们参考FSP嗯,FSP嗯找到这个。十点。哎他对。

好呃,在FST的描述中啊呃这个这个出度就是2。FSE中用这么一个对象,也就是arrk啊范这么一个范形对象来描述节点的出动边。那么它里边包含了几个属性。lel呢就是我们当前啊这个出度里边乘组的字符啊。
在这儿就是M。当然了,这个实际上SSD存储的是labelled的呃S码对应的二进制二进制啊内容。那么output呢存储的就是我们呃这个建制度的value值。好。呃。
target就是我们当前指向的呃下一个节点flag呢呃这个解释起来比较复杂。我们在后边的课再给大家讲解,它其实是记录。因为我们呃虽然这个数据要进行压缩。呃,但是你虽然你压缩的足够小,但是你不管压缩多小。
我们数据仍然是需要解码的。呃,你既然需要解码,那么其实有些东西你是需要标记起来的那ag这个东西呢,它其实类似于我们之前在讲呃RBM算法的时候里边那个我给大家去看一下啊。啊。
我们在讲RBM里边有一个这个东西。它其实就是用来标记当前啊这个东西它就是用来标记当前这个数组每一个数字里边使用了几个字符啊,其实它就是一个flag,它就是一个flag,只是标记的东西不一样。
但是他们的目的都是为了让当前的呃数据结构能够快速的解码就是解码回去,逆向的把数据啊逆向回去啊,他们的作用都是一样的啊,这个就是flag的一个作用。那么至于flag的具体啊,具体代表什么含义。
我们在讲解不来那个FST的存储存储的过程时候再去做细致的讲解。那么这个四个对象就是呃。二次啊这个这个对象的主要的4个主要的资格属性。啊,主要的四个成本属性nex flag output put啊。
这个我们在后边去讲OK啊,理解了这四个基本的属性之后呢,我们再来看当我们。呃,当我们啊存储十的时候,十也就是我们当前呃valued output好,我们存储到当前。啊。
这个ar的里边的out put这个属性中去out put这个字段。OK那呃一般来说我们把呃这个数据啊都存储的越靠前越好。因为是为了为了构建哎最小化的SST的存储。所以啊我们通常来说呃越往前越好。
数字越小越好,能能得到最高呃最高的一个复用效果。OK比如说好,那存储完第一个,我们再接着往下看。当存储MSBT的时候。诶。存储节点和出度的这个过程和之前是完全一样的,但是不一样是什么呢?不一样啊。
我们先把这个out先给它干掉。把奥的干掉了,这个箭头先把干掉吧。一开始这里边存储的不是一个十嘛,对不对?好,这里边存储的是个十。那么因为我们要复用什么?要复用MSD。呃,这三条出路。
那么但是我们MMSBT值它的output的值是5。那么如果我这儿存10的话,你想想我们在取MSBT值值的时候,MSBTECH实际上就是10加0加0加0加0加0加0啊,实际情况下这个零啊是不存在的。
如果我们这个值是零的话,其实在存储的时候是不做任何存储的啊,我这儿显示为零是为了方便大家去理解O那怎么办呢?啊,如果既然是MSB是MSBT取是5的话,那我们就把当前的值改成5好,改成5之后怎么办呢?
改成5,我的MSB它的数它的这个output就变了,那怎么办呢?我们就往后一倍想想移到这儿行吗?移到这也不行,因为MS一相加它还是10,那么和我们SBMSBT值就不一样了,违背了。那么我们接着往后移。
我们移到这儿行不行呢?我们移到这儿唉。貌似是可以的是吧?那么也不行啊。因为好,现在如果移到这个位置的话,MSB等于5MSBTECH等于10,那这个值相反的。如果MSB等于5MSBT值等于10。
那这样就可以的。那怎么办呢?好,那么所以我们就给当前的MSB啊,去构造了一个什么final。当前这个值是记录当前节点的终止节点的一个output那这个节点啊。
这个这个output是不计算在我当MSBTC是计计算它的value的时候啊,是不不参加计算的OK那它这是呃这是一种计算的方式。那这样的话,我们再去计算它的结果的时候,我们观察MSB就是5加0加0等于5。
再加上fin节点的output。那这个时候啊我们的结果MSB就是10MSBT是就是5加0加0,加到最后还是5fin output等于0。哎,这个时候就符合了我们的要求。当然了,这个值是越小越好。
能往前存储的,我们不往后存储。OK那MSN等于2的时候,原理是一样的。原先这不是5嘛,对不对?原先哎我们先给它改过来。原件照是5,哎,这是5。好,这是0这儿是。这是0fin等于5。唉。
那这个时候如果这改成二了,我们输入了个MN因为MSN等于2,那这儿改成2。那么如果我们改变了MSN,那么我们就要呃去。修改啊去检查一遍任何以MS就是说跟他有共共前缀的所有事项。
首先是MSB等于10MSV等于10。哎,这个时候MSNMSB。等于2加0加0加5等于7,显然是不可以。那么我们能不能还差多少?还差3差三我不能放便吗?不能因为MSB和MSN共用了MS这个前缀。
所以MS不可以动。所以我们只可以考虑在MSB这去修改它的值。差一个3,我们把它改成3。哎,这样的话,MSB这三个数值加起来是5是没有变的。那么再看一下MSBT值MSBTECCH加起来还是5啊。
仍然是符合条件的。MSN等于2MSN加起来等于2,没有问题。O那这样的话就满足了啊我们所有前三个值项啊,就是说到目前为止三个项都可以满足。OK。那么我们再来看录入最后一个图像的时候。
输入WLTECH的时候,因为啊我这就拷贝一个和上面是一样的啊,WTHWLTECH。输入WLTECCH首先啊呃M是2S是0,我们这儿加1个WLW是8,因为WLRTCHWL是8,W是8,那这儿是0。
后边的都啊,因为复用了,后边都是0啊,这个是没有什么特殊的地方。那么这儿啊所有的节点都是满足的MSB我们检查一下MS。B加起来是5MSBT取。
不是MSB加起来是12加3加5等于10MSBT取MSBTECH等于5。因为啊因为我们只有当你是MSBB是B指向的这个呃target节点是终止节点的时候,我们才要加5,所以我们MSB是要加5的。
但是MSB teach取因为MSBB并不是T取的终止啊,终止终止节点。所以说我们不能把这个终止节点的out去加到这个MSBT的计算中来。所以MSBT取加起来还是5MSN还是2,没有问题。
MSSNHR那么WLTHWL加TCH也还是8没有问题。好,那我这里边加了1个WTH啊,这是为了为了去讲解。呃,大家先看吧啊呃加入WLRTH的时候,因为WLTH是8W呃,首先W是TW是8。
那么L呃WTH啊,W是8,那么L是0。那么因为我第二个字符已经和WL的第二个字不一样了。所以我第二个初度,也就是几。8的初度啊,我的初度值也是8。那加起来就是8加8加加0等于16啊,这样的话也满足了。
因为我们没有和呃这个M这个公共前缀去产生任何的没有产生任何修改。所以也就是说。我们在修改WTH和W和M就前三个词项的时候,如果我们没有发生呃前缀的冲突,我们是不用和呃我们是不用去检查它的值的变动的。
只有发生了冲突的时候,比如说WL和WTH呃,比如说这个MSN和MSB通们有公共前缀的时候,这个时候我们才需要去检查之前啊就是我们改变出改变out的时候啊,是不是对前面的节点有有任何影响。
OK那这就呃完整的展示了FST去存储啊,去存储呃这么一个词像字典的一个过程。好,那我这儿给大家准备的一个网站啊,这个网站是一个叫FSBbu。
那这个网站是演示FST它一个构建过程的那我们把当前这个值和value啊拷虑过来啊,直接复制过来。我看见丢了一眼。啊,他构建的结果和咱们是不是一样的,我把这个拽出来了。哦。这个。好,我们来看一下M。
首先啊可能这个画的图不太一样,但是咱们呃。美观这个画的图的方式不太一样,但是结果是一样的。我们需要比对的是哪些东西呢?首先是初度啊初度的这个路径是不是一样的?首先我们看MSBMS。B啊B是一个终止节点。
但这里边并没有啊任何的就是展示终止节点的地方。这个首先这个地方是你们按照我们的来这儿我们是有一个终止节点,并且终止节点是有一个奥德斯的输出的啊,另外的话呃我们再看第二个MSBT去MSBTE啊。
E这居然拐回来了,这但这并不代表一个循环。我们把这个只要把这个节点的位置啊,挪到这儿挪到它的后边啊,和我们的画的基本上是一致了。MSBTE然后C然后再走H到终止节点。
也就是MSBTECH和我们是一样的好,MSBTCHCH之后呢,我们看MSNMSAN是第三条是这个节点,第三个节点的第二个幅度MSN。也就是第三个节点,也就是序号为20个节点的第三个幅度到第二个幅度。好。
也就是它的第二个出步MSN啊,这是一样的。它这儿没有标记这个零就代表当前的N没有output啊,我这其实按理来说是应该不加这个零的。但是这也是我们为了方便我们去看啊,有地方我加里。加啊,嘉陵和梅加一。
我们都视为没有auto的就OK了。好,那么说完了MSN我们再看WLRTHWLTCHW是第二个速度,是节点0的第二个速度。然后L是当前的这个。当前WLL指向的是和B和这个B指向的是同一个节点。
L和B指向同一个节点。B的output是等于3啊,这儿我们也是3M的是2,我们这儿也是2啊,L的这个output是0,对不对?TH也都是也都是空的好,那再看WTHWTHW是8,那么T啊,我这也是8。
那么这Tout也是8啊,那这就验证了我们当前这个FST它的构建是没有问题的。但是需要注意的是呃在这个网站中,它构建并没有关于out和和这个呃关节点的一个一个就是说一个咱们非常明显的看出来的地方啊。
所以要以我们这一种方式为准啊,它是有这两个节点,这个节点是有out的。那么这个节点output是0。

O。有两个终止节点。那这样的话呃我们就可以去理解FST它的一个它的一个呃构建构建的这一个过程。啊,回过头来,我们再看看这个问题啊,我们这个WL是不是存在我们刚才在构建FSA的时候啊,FSA的时候哎。啊。
这样思考WL是否是否存在呢?哎,我们把这个拿过来啊,拿过来。好,WL是否存在呢?WL如果WL是有值或者没值的,那么可以比对当前这个output值是不是存在啊,那显然啊在这里边是不存在的啊啊。
因为我们多了一个output,我们就可以去比对WL是不是存在。当然这是一个比较啊取巧的一个去判断呃,其实并不严谨。那么我们在后边的课啊去给大家讲解FST它存储的一个详细的详细的一个存储的数据结构啊。
这儿我们只是讲解了一个原理啊,就是存储的一个原理这么一个过程。真正去存储的时候,它是用两个数组来存储的FST一个cur数组,一个叫fo两个数组来存储它的节点它的速度的。好,那么这节课先到这啊。
下节课我们。

系列 6:P159:文档的写入原理 - 马士兵学堂 - BV1RY4y1Q7DL
。好,我们继续来看下面一道来自阿里的面试题document的写入原理啊,这也是ES面试题中一个非常常见的问题。好,下面我们来看一下这道题,我们如何来回答。好。
那这个问题呢在面试中呢也是一个非常高频的问题,并且在此问题上可以衍生出一些其他的问题。比如说ES的检索性能调优,查询性能调优。没错啊,就是查询性能。
ES的查询性能其实和ES的底层写入逻辑呢是息息相关的那包括呢写入调优。那这里边呢其实就涉及到了一个关键字调优。啊,是这个优化的优啊。呃,调优里边能涉及到很多相关的问题,甚至包括ES的写入的并发问题啊。
咱们都是基于基于这个写入原理啊,这个基础之障而来的。好,那这需要注意的是,咱们这个视频里啊,就是咱们本本节视频里边呢是不包括啊是不用去考虑。比如说多个分片的数据同步问题啊,就是数据的这个协同问题。
以及这个数据的写一致性问题啊,写一致性的策略这些问题,咱们暂时先搁在一边。其实那些问题呢是更倾向于什么啊写入过程,数据的写入过程。啊,它怎么是保证这个多个分片的这个数据一致的?啊,当然了。
这是其实是另外一个问题啊,咱们先不用去考虑啊,那么下面咱们来看这个数据是怎么写入进来的啊,咱们把这个图放大一些。

OK嗯,那假如说呢这个图呢整个过程呢,咱们好嗯好比是咱们要把一车砖头放到仓库里。那么咱们磁盘呢就相当于是一个大仓库啊,空间比较大。而咱们的这个一车砖头,就相当于咱们是批量写入数据,一块砖头就是一条数据。
那么大家都知道啊,基于计算机的啊这种。防东硬卖模型这种计算机系统啊,那么我们磁盘啊磁盘这个硬件其实是性能最低的一个硬件。好比说我们这个大仓库门口站了一个老大爷。啊。
或者说是一个工人啊负责搬砖的那我们的小车如果要直接向磁盘中写入数据呢,假如说我们里边有100块砖头啊,这是个小车。好,我们批量的往里边卸数据。那么大爷呢一秒钟只能搬一块砖头啊,每秒。
那么这个时候就会就是说频繁的啊大爷搬一块砖进去,搬一块砖进去啊,就会造成大量的这个IO嘛。自盘的IO是呃非常耗费资源的啊,非常浪费时间的。那么怎么办呢?有一件事呢啊这个缓存其实就是这么来的嘛?
缓存的作用是啥呢?其实就是做起到一个缓冲的作用。何谓缓冲呢就是缓解这个冲击力。说白了就是把整个过程放慢。好,那么你给大约时间,就是说你大约你不是这个数量大吗?你给大约时间就行了。好。
那么也就是说咱们把这个车呢不直接搬到这个大仓库门口。好,咱们打个比方。好,那么假如说呃缓存呢一般来说都是基于内存的嘛。在ES中呢啊它这个写入机制呢,实际上里边ES呢给我们开辟了一块空间呢。
叫做buffer。其实这个buffer呢就是缓冲区。咱们可以理解为它是一个啥呢?小仓库。啊,小仓库。那么这个小仓库的作用是啥呢?这个小仓库呢跟大仓库的最本质的区别呢,就是首先它的空间更小。
因为它是基于内存的,但是呃内存的是性能更高嘛,咱们可以把它想象成为一个现代化的啊机械化的仓库。它搬砖的效率比如说是100块每秒。那这个时候呢,咱们可以把小车呢,比如说咱们这一车砖头100块。好。
我们可以把砖头呢一下子就陷进这个内存bu法里边,它不是性能快吗?好,那么ES的机制呢,当我把数据写入到内存里边的时候啊,注意看我放大一些。当我们把数据写入到内存里之后呢,好,注意这个小仓库。
它的内它的空间阈值是比较小的啊,当然了,这个阈值我记得是十0兆还是G边M10%,我忘了啊,当然了,它的大小是固定的,我们可以人工的去干预去设置它大小。这里边呢有一个呃有两个关键点,叫空间阈值和时间阈值。
就是它的这个。啊,空间和时间的阈值。好,空间阈值默认就是一秒。当然呃这个时间阈值默认是一秒,空间阈值我忘了啊,但是它大小是固定的。当我这两个阈值啊,其实就是封顶值嘛,最大值任意一个条件满足的时候。
比如说时间阈值一秒钟,我当我的时间达到一秒的时候,不管我这个仓库写没有写满,我都会把仓库这个小仓库的东西。给放出来,放到这个大仓库的门口啊,那么这个一摞砖头,就是这一这个仓库写满之后啊。
就是达到空间阈值或者时间阈值之后的这一堆数据,这一小坨数据叫做一个索引的sigment feel,这么一个索引段文件啊,叫索引段啊,段落的段啊,索引的段。好。
那么索引断文件呢会马上把数据同步给OS catch。这个OS catch是基于啊操作系统缓存的。我们把数据交给OSca这个过程也是非常快的。好,那么OSca接入到数据之后呢,会马上响应请求。
告诉我们当前ES整个服务啊,我们这个sment的文件已经同步过来了。那么此时啊sment的文件呢会被处于一个叫open状态。好,当我s的文件被打开之后,好,我们当前写入了这个数据就可以被查询到了。
说白了啊,我再举个例子啊,那么当前的这个数据呢其实交接给OScaOSca给了你一张票啊。好,那么它相当于啥呢?它相当于是一个呃门口登记啊,就是登记你这个数据的。好,你的这个数据你的货已经入库了。
我给你开个票。好,那这个票他拿到数据之后呢,我们这个数据就可以呃给客户交代了,你拉了一车数据。好,那么这一车数据比如说这是这个小车嘛小车把数据放到内存里。然后说了s的文件sig交接OScaOSca呢。
其实就是个仓库管理员,我们把仓库管理员把数据啊交接给仓库管理员之后,好,仓库管理员他负责给这个大爷来对接,并且给给当前这个文件开一张票。好,那么这个票呢呃就告诉我们当前这个数据已经入库了。
当然了真正这个还没有真正持久化到磁盘。

你啊。好,那么到此为止呢,其实这个过程呃,到sigment的文件被打开之后,我们用户作为客户端啊,作为客户端的用户而言,我就可以检索数据了。好,注意啊,只有当sigment文件被打开之后。
用户才能检索到这条数据。注意啊,这里边呢因为有一个默认一秒钟的时间阈值,默认是一秒钟。所以很多人会问到,为什么ES写入数据之后要有一秒钟的延迟呢啊,就是这个原因造成的。当然了。
这个时间呢咱们可以设成10秒100秒。好,这样做的目的是什么呢?其实咱们要明确一件事儿,就是首先呢写入性能和查询性能啊是不可兼得的。或者说写入实时性。大家都知道ES是一个近实时的啊,实时性啊实时性。
和查询性能是不可兼得的。查询性能什么意思?好,也就是说如果我要更高的形实时性,我必然会。呃,牺牲查询性能。因为啥呢?因为我会浪费更多的计算机的性能,或者占用更多的资源啊,待会儿我会说好。
明确了这个呃这一个点之后呢,我们再来看它的接下来的一个过程啊,我每隔一秒钟或者当我的这个。内存bu法写满之后,就是这个小仓库塞满之后啊,不管是时间到了或者说仓库写满了,我都会把数据倒出来。
放到生成这个s文件啊。当然这个sig文件一去一回,这个呃过程是非常快的啊,并且它是一个原子性行为啊,是个原子性行为。好,当我的仓库再次写满的时候,我会生成第二个s文件。好,假如说它的编号是一。
它的编号是2。那么这个过程呢会不断的重复。第三个第四个第五个好,点点点点点。好,那么每一个s的文件呢都会把数据交给这个仓库管理员。这个仓库管理员好,他这个仓库管理员呢,这个OSca呢。
实际上是也是有一个空间的阈值的。当然他也有一个时间的预值啊。当我这个OSca写满了,或者当我这个时间阈值啊,这个条件达到了之后,时间阈值默认是30分钟啊,这这儿呢默认是30分钟。好。
我30分钟或者说我的这个OSca写满之后呢,我就会执行一个叫刷盘的操作。我会刷盘的。好,此时呢仓库管理员呢就会把这一坨数据呢好放到磁盘里。好,那么交给这个老大爷来处理。当然了。
这个过程呢和我们的用户就无关了。因为我们的用户其实这个数据只要到这个位置,我们用户就可以检索了。好,其实呢这个过程变相呢就实现了一个什么叫读写分离。读写分离的意义在于什么呢?在于减小磁盘的写入压力。
并且提高我们查询的实时性啊,提高我们的查询性能啊,减这个数据写入的性性能啊。好,这两个过程一旦分开,我这边写我这边的,你那边啊,就是我这边呃写我的。你那边同步你的数据,我们互不相干啊。
这两个过程就分开了嘛。好,那么Fthink这个操作呢,它会执行一个它会执行一系列的操作啊。这个Fthink就是刷盘嘛。好。
首先呢这个会呃当前这个OS catch呢会执行第一个操作叫做comitcomit point啊。comit point是什么呢?comuter point就是OS catch呢。
会对当前这一系列的sment文件执行提交操作。啊,我数据提交给磁盘之后呢,commit point制定一个这个提交点。这个提交点的作用是什么呢?好,首先commit point在执行的时候呢。
会执行以下步骤。首先第一个叫选择相似的sigment文件进行merge。首先这个sment文件是基于文件系统的缓存的啊,那么这个mer操作呢也是基于JVM来完成的。好,注意这里边又有一个面试点。好。
那么我先卖个关子啊,那么大家往下听,当我这个sigment文件,比如说非常多的时候,比如点点点点点有100个。那么我们这个merge。就是要合并这100个文件生成一个新的sigment文件。好。
那这个过程就会非常的消耗GVM。也就是消耗我们的堆内存空间。好,也就是说,我们如果能避免产生过多的sigment文件,就能变相的降低我们资源的这个GVM资源的消耗。因为这个GVM资源是非常有限的啊。
是非常非常珍贵的。所以说我们要尽可能的减少sment文件的产生。好,那么话又说回来了,如果要减小sigment文件的产生,有两个途径。第一个是增大buffer这个缓冲区的大小,因为空间增大了。
你这个小仓库变大了。那么我提交生成index这个文件的index segment这个文件的次数也就减小了。所以说这个文件就减小了嘛。好。
同时我要降低这个refresh这个时间就是内存 bufferffer每隔一秒钟提交sigment就是index sment文件,这个时间的阈值,我们要把它时间阈值给它放大。也就是这个参数呢叫做。呃。
叫做那个什么interval啊,叫是这个参数名字,我忘了,我看这个图上有没有啊。没有啊,这个阈值参数啊叫呃什么fixix这个interval INT我记得我不记得那个单词怎么拼了。好。
这个时间默认是一秒钟,比如说咱们可以给它设置成10秒,甚至100秒甚至10分钟,比如说10分钟。好,那这样的话,我每隔10分钟可能才会产生一个sigm的文件。那这样的话。
我的当前的呃10分钟是600秒吧。好,那么我当前sigm文件的数量就会下降到原来的61%。好,从而节省我们的资源嘛,但是有一个缺点呢,就是好,我10分钟提交一个sigm的文件。
也就是我当前比如说啊我开了一辆小车里边装了100块砖头。好,那么我当前这个司机是吧?我这个司机这哥们儿啊。好,把数据交给你了。那么你要隔10分钟之后才会把这个数据交给这个仓库管理员。
仓库管理员给你开收据。好,这个时候我这个这个开小车的这个货车司机啊,才会拿到啊这个数据其实写进去了。也就是说这个写入数据型的呃实时性呢会由原先的一秒下降到原呃现在的10分钟。你写一条数据。
我十分钟之后才能检索到。好,这也是为什么很多你在手机上,比如说提交什么提现哪或者一些操作,好多操作要你比如说两个小时之后。啊,你才能查看到结果。其实呢就是为了提升我们呃就是牺牲写入实识性呢。
其实为了提升我们的检索效率啊。因为很多数据呢对这个实时性的要求并不是很高。所以为什么ES它叫搜索引擎,而不叫写入引擎呢?啊,这其实有一点差强人意是吧?但其实就是这么回事儿啊。好,那么到此啊。
我们其实已经说了到这个sma文件的合并这么一个过程啊。那么flash呢指的就是我们当前啊就是提交point点之后呢,这个数据呢同步到这个磁盘里啊,19号到磁盘里。那么commit point。呃。
把这个index s文件合并之后呢,会标记为删除,就是iss delete。那么会标记在一个叫点DEL的文件里,把这些文件通通标记为删除,并且生成一个sigment。啊,比如说101吧啊。
咱们随便给他一个标号,然后把这些老的12345到100这些文件通通给标记为删除。好,这个时候用户的请求呢通通会打到sigment101这个文件上来。然后最终呢这些文件呢会被回收啊。
这些旧的文件会被回收啊,从而释放资源。那么这个过程对用户而言呢,是无感知的。O。那其实整整个过程啊,如果你用心听的话,其实会发现一些问题。比如说哎我们来看当我们数据呢提交到buffer里啊。
创建sigment的文件,包括交给OS catch这个过程啊,响应打开这个in indexdexs的这个文件之后呢,整个数据呢并没有持久化到磁盘里,这个过程呢可能非常缓慢。
如果这个时候我的服务整个服务宕掉了。我的数据是不是会丢失啊?那么其实呢这就涉及到了另外一个问题。那ES如何去呃保证我的这个数据的完整性呢。好,那么这儿呢就提到一个文件呢,叫translog。
那translog呢是一个事务日志啊,当我们数据写入到bu法的同时呢啊会追加写入到translog里。所以啊这里边记住啊是trans啊是end啊,是追加的方式写入的。
不管你是删除还是呃执行删除操作还是写入操作,或者是更新操作。那么对于我translog而言,都是要pen。所以说我们不用去考虑这个translog文件的一个性能问题啊,这是完全没必要的啊。
那么translog之所以存在它的目的呢就是帮助我们数据在发生意外的时候丢失的时候,我们的数据回滚。啊,也就是为了保证我们数据的这个完整性。好了,那么这个呢其实不用多说啊,很多里边很多这个呃。
很多技术啊,这个中间件都会有这样的相同的这种东西啊,叫叫translog啊啊事物日志。嗯,好了,那么咱们的这个关于这个ES的写入原理呢,咱们就先说这么多啊。那当然了,这里边需要注意一些点。
就是在这个写入原理的这个基础之上呢,可能会衍伸一些问题。呃,这里边其实能呃衍伸出很多面试相关的问题啊。咱们后边都会说到呃,这里边还有一点呢,就是这个reresh啊。
这个是最最常问到的refresh的时间间隔,咱们可以手动去执行refresh呢,就是把手动的把这个小仓库的数据呢写入到这个sma文件生成s的文件。还有一个就是flash的时间间隔。
这个都是写入调优的一些常用手段啊,比如说增大flash的间隔,比如增大buffer啊,降低呃ES refreshresh的这个interval。啊,就是把时间增间隔设置大一些啊,都是一些常用的手段啊。
好。
系列 6:P16:hotspot底层原理 - 马士兵学堂 - BV1RY4y1Q7DL
我们做一点点小小的实践,先做一个小小的实验,就是呃这里面牵扯的内容呢有点多,我们先看呃最终的一个结论啊,就是这个结论呢是synchronized的,内部执行的时候,他有一系列的优化过程。
所以现在有一个结论叫做呃,当你进行一些简单同步操作的时候,你没有必要去使用新的锁,没有必要去写使用新的lock,新的什么reaction lock,新的read red lock等等。
你先不要去使用这些,优先去使用synchronized,为什么,因为这些都是用cs实现的,而synchronize内部也集成了cs的升级过程,所以你应该优先使用它,它不够使的时候或者功能不够的时候。
再去考虑用新的锁来实现好嘞,当然有同学可能会说,老师这个我我能观察到它的锁升级的过程吗,可以可以啊,小嘟嘟是一听觉得懂了过后啥也不是全忘了,你是能够听完了之后一点印象都没有是吧,那你也够牛的,够神奇的。
你是喝了什么健忘爽嘛,回头也发给我一个忘情水,你喝了刘德华的忘情水吗,大家看这里,如果你想跟踪到这个过程,就特别好玩的一件事情,我觉得大家用一个框架,这个框架呢叫呃j o l,这框架用起来相当简单啊。
同学们,这用起来超级简单,你没有用过的,没有关系,这个框架呢是那个open dk提供的叫j o l,j o l的全称叫java object layout,跟我读java object layout。
java的对象布局,这个框架用来干嘛的,用来观察,当我们new出一个对象来之后,它的内存之中到底是怎么样进行布局的,好我们先说结论,结论是java中的内存布局是这样子的,这个还是要讲。
你在这边没在这张ppt上看在哪里,ok对象在内存中的存储布局,这个是hosport一个具体实现,我再强调一遍,这种东西啊,是jvm的这种规范级别,它并没有要求的,这东西都是hot sport的具体实现。
作为我们new出一个对象来说,在内存之中它是这么来布局的,这个面试面的特别特别多,超级超级多,所以你啥也别说,你给我背过,他有同学说老师我开发之后用不上,没错,你是用不上,但是你面试中用上了。
每个月就能给给你涨个3000~5000,你不美吗,所以你好好听,认真听,给我背过就行了,这东西没什么道理可讲,他就这么设计的,这个设计是啥好作为一个对象来说,new出一个对象来的时候。
大家都知道在内存里头开辟了一块空间,现在这块空间里边到底是怎么布局的,这个布局是这样子的,普通的对象分四部分,四部分,第一部分叫macworld,叫标记字,这东西你就别翻译了,背过的名词就行了。
叫macworld,macworld占八字节,作为64位虚拟机,64位的虚拟机,64位的gm,他就八个字节,64位嘛,八个字节,第二个呢叫类型指针,叫class pointer,这个的意思是。
这个new出来的对象是属于哪个类的对象,你比如说new了一个object,那它指向的就是object。class,如果你用的是一个t那就是指向t一点,class好,这是一个指针。
这类硬指针叫class pointer,第三个呢叫实例数据叫instant data,这块就是我们普普通通所说的成员变量,比如说我们有一个类t里面写了一个成员变量,int类型的m。
那时候呢里边这个实际数据里面,就有一个int类型的m,如果还有一个指针类,是有一个指针类型啊,如果有一个long,那就有一个long类型好,这里头叫成员变量叫instant data。
第四个呢叫padding对齐,叫padding,对齐是什么意思,对齐的意思就是八字节对齐,就是如果前面这三项加起来不能被八整除,后面再给他怼上一些字节,让它能被整除为止。
有好多基础特别弱的小伙伴总是理解不了,为什么要对齐,对齐的时候是因为装配效率特别高,我举个形象一点的例子,比如说我们往那个集装箱里装货,我拿这个货物的时候,一双鞋一朵花,我完全可以直接来拿。
但是我为什么要装到一个集装箱里,规定的大小的这种集装箱大小是一样的,为什么,是因为我装配的时候,读取的时候,读数据的时候效率特别高,哪怕你里边只装了一半,但是我也要给你一个完整的箱子。
我装这个箱子的时候,是由于我装那个空间里,船里等等,我用这种空间这么大的空间装起来效率特别高,这个大家能理解吗,就是没有了web的碎片,如果你用那种特别小的好多好多小碎片,我还得计算你这个对象从哪开始。
到哪结束啊等等,好这个叫对齐,好能get到这一点的同学给老师扣一,就说我宁肯浪费一些空间,以前还有同学说说一个特别好玩呢,就说老师我非得往上补吗,我不能把前面一部分砍掉吗,大哥真的有人问这样的问题吗。
有没有人有这样的疑问呢,就是你你你你们家那个你个儿特别高,然后睡睡了一个墙,睡了一个床,这床不够长,你不是补床,你是把自己脚给砍了,牛逼啊,我只能说你你我只能说你太牛了,好开个玩笑啊,来看这里。
就是那个大家记住这个四部分嗯,mark word class,pointer,instance state和pdding,有同学说我能观察到这四部分吗,可以你用j o l这个框架就可以。
这个框架用起来超级简单好,打开这里,呃我们来观察这个它里面的布局,object o等于new object,我们new了一个object对象。
this is mode prinline class out,好这个下面就是把这个布局给打印出来,估计短出来的呢,就是用到了jo m一个类叫class lyout,静态方法。
pass instance,解析一个对象,哪个对象,older对象,two printable,把解析的结果转成可以打印的字符串,然后把它打印出来,跑一下跑一下,声音有点像胡歌,你说的。
其实我我我我我我我我不喜欢胡歌的声音,我喜欢王刚的声音,然而学不会好,大家看这里,这就是打印出来的内存布局,你看啊,从第零个字节,这是我们一个一个一个呃对象,一个operate最普通的一个对象。
最简单的一个对象,它里面没有成员变量吗,诶第零个字节开始往后数四个字节,这里指的是orbit header,叫对象头,第四个字节开始又往后数四个字节还是对象头,第八个字节开始往后数四个字节。
还是对象头好,这12个字节叫对象头,这对象图分两部分,前面八个字节,前面这八个是mark word,后面这个class pointer指针,有同学会说,ok那这个我能看懂吗,这东西是什么。
好这个你就可以认为是一个指针,一个地址,它指向的是谁呢,指向的是object。class,就是找一个对象之后,能通过这个指针找到对应的具体是哪个class,大家知道吗,作为一个普通对象来说。
它都有一个方法叫get class,对不对啊,应该有好多同学都用过这个方法,任何一个对象都有这个方法叫get class,拿到的就是class类的对象,好通过哪来拿的,就是就是通过这个指针拿到的。
好第12个字节往后数,由于前面三个加起来只有12个字节,不能被八整除,所以再补四个,所以他是lost due to the next ordinate alignment,对齐,根据对象对齐来说。
我在补四个字节,所以一个object对象,在内存之中一共占了16个字节,有同学说老师有人问这个吗,没错就有一线大厂问你一个object的占多少个字节,还有一个经典的问题。
就是mark word里面装的是什么内容,在我继续讲mark word之前,前面讲的这部分有没有同学有疑问的,有问题直接提,没有问题的给老师扣一看,我们能不能继续啊,可以是吧,ok不错,嗯你知道吗。
我一般都会问诶,没有问题,给老师扣一,总会有人扣一,那些扣二的都不好意思问,所以我也就混过去了,应该是20个字节,no new一个object 16个,这个看操作系统还是32 64的机。
目前64位不仅不聊32位这件事,你要聊的话,你还不如聊16位,八位的呢,没意思啊,16个,当然里面好多细节就是这个class pointer,会不会被压缩,压缩完也是16个,你不信你自己去算。
不压缩也是16个啊,这个不用去管它,那有同学就说哎老师这跟所有半毛钱关系吗,好,下面这个问题就是,mark word里面记录的到底是什么信息,mark word里面记录了啥信息,你仔细看。
这是我们刚刚用了一个非常非常普通的一个呃,object对象,你看它这里面的这个记录是什么,010000000这些是吧,看这里,假如我给这个对象上,把所有同学什么叫给对象上锁。
给对象上锁的意思就是这个叫synonoma,锁定这个对象,然后执行下面的操作,这就是被锁定的对象,这就是叫临界区啊,叫critical section,就是临界区的,意思是只有持有这把锁的时候。
才能够执行这个操作,形象一点的例子,你进一个厕所之前,锁上之后你才能去干事,你们都说俩人同时干啊,这个事情不能同时不合适,同时上一个坑屁股,对屁股不太合适啊,所以锁定这个门儿来干里边儿的事儿。
就是给这个对象上锁,看这里比较一下,跑一下,好我们来对比一下,所谓给对象上锁,这是对象没有上锁的状态,这是给对象上锁的状态,诶结果你发现没有,所以我们第一个结论就来了。
这个mark word里面记录的是什么所信息,就所谓给对象上锁,就是修改了对象的mark word,来给get到这一点的同学绕口一,这就是大厂问的这个问题,就是michael里面主要记录什么信息啊。
所信息这是最主要的,当然标准答案除了锁信息之外,还有什么信息,hash code,除了hash code之外,还有什么信息,gc垃圾回收信息,也就是这个macworld。
在hosport的具体时间里担任了很多很多的角色,最主要的是锁,有同学会说了,老师这个里面真的会所,会发生各种各样的变化吗,会的好,现在还能跟上是吧,能跟上我们继续啊,来看看笔记里头这张图。
看这里看这张图,这是64位的hosport的脑内的一个实现,如果你要观察它具体的实现。

你应该去哪查,你可以去找到那个hosport源码。

hot sport的源码就是c加加那个源码,mark o p s头文件啊,那个地方去读它,这个好像是给大家,摘下来了吧,我有印象是摘下来的啊,在这里就是你要是想去读他的那个每一位。
到底代表的是什么意思呢,你应该记住jdk 8的一个源码的mark o p h p d,在这个里面,64位的每一位都代表的什么意思,都给你做了详细的解释,我能给大家做了一张图,你不用去看那么琐碎的细节。
看这张图就可以,这一定作为一个锁升级的过程,刚才我说过,有偏向锁,有自旋,所有重量级锁,这两个锁是在升级为重量级锁之前的,一个用户空间的锁,作为这个锁来说,它是怎么标记的,不同的锁的呢,是这么来标记的。
优先看整个mark word里面的最低位的两位,这这这两位叫做锁标志位,比如说我们看到零零的时候表示的是自旋锁,比如说我们看到一零表示是重量级,所比如说我们看到一一,这个很难观察到。
表示它正在被回收的信息,比如说我们看到有同学会说前面还有俩呢,这五种状态怎么能用两位来表示,两位最多能表示四种状态啊,所以在一个前面这两类的时候,都比两位都是零一,没关系,前面再加一位。
看到001表示的是无所,刚刚new出来这个对象,如果你看到的是101,表示的是偏向锁o当然这个细节非常的琐碎,你大概记住概念就可以仔细听我说啊。

就记住概念就可以,你没有必要说记住每一位都是用什么样的这种。

具体不同的未来来标志的,我给大家把这个切下来,然后我们来对比一下刚才那个实线,你看这个时间,来看这里,你看啊这里看到的001,这是什么状态啊,对比一下是不是就是无锁开了,就是刚刚new出来一个对象嘛。
我们看到的是零零,看到什么状态了吗,这是什么状态,是不是就是自旋锁对吧,零零ok,这个你就能观察到它的一个所升级的一个过程,ok那有同学可能会说,这里面其实还有好多好多小的细节。
我不知道有没有同学有这个疑问的,就是老师啊,您这个最低位不应该在这儿吗,对吧,你最低位不应该在这儿吗,你为什么看第一个字节啊,为什么y有没有同学有这样疑问,有这样疑问给老师扣二,如果你有这样的疑问。
各位小伙伴麻烦你去查这两个东西,big ending大端,little ending小端,这叫高字节在前还是低字节在前,这个牵扯到计算机最基本的知识,作为一个比方说int 16位的这样的一个实现。
这两个字节的排列顺序到底是低位在前放前面,还是高位放前面,低位放前叫小端,高位放前叫大端,他这里展现出来的叫大端的一个,小端的一个视线,i'm sorry,小端的一个视线,ok所以你应该看第一个字节。
而不应看,不应该看最后一个字节,来这块能听懂的,老师扣一听不懂的,你给老师扣5693,乘以3762。64的最后的一个结果,你们你们你们反正答出来的数字好像都不对,我带小数点,你们都没带啊。
所以大家都听懂了,ok如果没有听懂的,去搜索这个东西,很简单一个事儿好吧,一般来说java的内部的一个实现都是小端在一起,而网络上的传输都是大端,好了不开玩笑了啊,呃这块还能跟上是吧。

系列 6:P160:文档的写入过程 - 马士兵学堂 - BV1RY4y1Q7DL
OK我们继续来看下面一个问题,document的写入过程啊,区别于写入原理。那么写入过程呢是一个宏观的过程。那么这是一道来自阿里的面试题,对应的岗位薪资呢在30K左右。好,那么下面我们来看一看这个问题。
我们如何来回答。关于这个问题呢,其实网上有很多不同的问法。比如说你对ES中数据删除。或者数据的修改,它的执行流程是什么样的那。关于此类的问题呢,其实都是同一个问题。因为ES中对数据的写入操作呢。
其实包含了以下4种。首先第一种呢叫create。嗯,cre呢其实咱们可能用的不太多。平常咱们在使用put写入数据的时候呢。啊,如果说你使用create APII来执行。
那么当前你要创建的数据如果已经存在了,那么ES呢会给你抛一个异常,告诉你数据已经存在了。如果数据不存在,则会执行成功。那么第二种叫dele。delete呢就很好理解。
删除文档ES不管是删除文档还是修改文档,实际上都是一个懒删除的这么一个机制。呃,换句话说呢叫标记删除。比如说我们原始版本呃,原始的数据在刚创建的时候呢,是1个1。0的版本。好,不管我对其删除也好。
或者说我对这个数据进行任何的修改也好。首先呢我会把这个数据1。0的版本标记为一字dele。好,其次我会比如说我如果执行的是修改操作呢,我会创建一个新的数据。比如说。呃。
比如说原原先的这个性别由男改成了女,那么男就会标记为is delete,然后创建一个女,然后给他个版本号2。0。啊,这是ES里边一个懒删除机制啊。那第三种呢叫index,那这个是最容易出错的问题。
因为ES中很多术语呢它都是重名的那这里边这个index和我们的这个索引文件啊是不太一样的啊,和我们的索引那个概念是不太一样的。这里边的索引,它其实是个动词啊,索引数据指的是像ES的索引中写入文档数据。
啊,所以这里边指的是写入文档。好,那么也就是说它是一个动词啊,呃,在ES中,如果我们执行的是index呃呃,就是你要称之为index一条数据呢,你就把它理解成写入一条数据就可以了。好,那这是他的第三种。
操作啊写入操作。那么这个可能不太好理解啊,你要反复的去呃琢磨一下啊。那么第四种呢就是update啊,这里边指的是partial update,就使用使用posts去更新数据啊。好。
这四种操作呢都指的是它的写流程啊。好,那么针对这四种操作呢,呃其实我们涉及到这个写入问题呢,就要考虑到一个它的一个写入一致性问题了啊。我们以下面这张图为例。那在这张图里边我们演示一下。
当我们客户端发起请求的时候啊哎。

好,我们来演示一下啊。这是我们的客户端。当我们要向这个集群中写一条数据的时候,首先呢客户端的请求打到了这个note4上面。note4呢此时作为一个客户端节点。啊,首先它是作为一个客户端节点。那么其次呢。
它还是一个考D内的节点,就是负载均衡节点。那么当写入到,比如说我们要修改note4中的一条数据。那么首先note4呢通过在路由表中的映射信息呢,确定当前你要修改这条数据或者删除这条数据。
它不在note4这个数据分片里。因为首先你是写操作。那么写操作呢只能在主分片上来完成。那么note4呢又判断你这条数据它不在note4上面,而在note5上面。
那么它就会对你当前这条请求转发至note5上面。好,那么下面一步呢,数据在note5中好执行删除或者修改。成功之后呢,会把数据同步分发至它所在分片的两个节点,也就是note4和note6。好。
等待note4和note6这两个副本数据都写入成功之后,那么note4和note6会把这两个数据的同步结果啊告诉note5。然后由note5最后转发给这个note4,就是把结果报告给note4。
那么此时呃note4数据写入成功。那么在整个过程中呢,note4充当了两个角色。第一个角色呢叫客户端节点。第二个角色呢叫c,就是负载均衡节点啊,这个词我忘了怎么拼了。好,呃。
这个呢就是一个ES的数据的写入的一个完整的流程。

系列 6:P161:ES 中拼写纠错是如何实现的 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看下面一个问题。ES中的拼写纠错是如何来实现的那这是一道来自美团的面试题。那对应的岗位薪资呢在25到30K左右。好,那么下面我们来看一下这个问题如何来回答。呃,首先呢关于这个拼写纠错啊。
也是一个面试题中非常常见的问题。

呃,我们之前呢在。呃,网上呢随便搜了一些面试题啊,我们看到这里边呢,其实就是有关于这个拼写纠错的问题啊。如果面试的时候被问到这个问题啊,或者说被问到像某户查询是如何实现的。
先丢给监考官一个关键词叫负队啊,也就是说这俩是一回事,其实。

好,问到这个问题,先告诉他是用fZ来实现的。那么模糊查询啊,或者说拼写纠错呢,一般来说呢分以下这么几种情况。比如说第一种呢就相当于字符敲错啊,混淆字符混淆字符。第二种呢,像这种字符缺失,少一个字母。
或者说多一个字母,或者说你这种字母颠倒了ACC变成CA了。这种情况呢通常都属于呃拼写纠错啊,或者说叫模糊查询。但是它是有一定的限制的啊,咱们待会儿会说。那下面呢咱们语法就不讨论了。
面试的时候不用去回答这些问题。咱们下面通过一个简单的例子啊,咱们来看一下什么视频研究做。

好,比如说咱们当前使用这种叫副对查询,查询当前一个关键词。咱们查询chinese啊,中国人,其实这里边少一个字母N呢,但是咱们看到这个结果其实还是能出现结果的。好,这里边有一个关键的参数啊。
这其实它是实现我查询的一个关键啊,叫fo list。指的是什么呢?指的是当前容错的补长。何为步长呢?比如说咱们当前的步长是一啊,咱们设置个一,那么允许你出现的字符。错误的这个长度呢也是一。
咱们这儿少了一个字母,咱们再来少一个字母,就发现这个结果。就没有了啊,因为咱们这儿允许的长度是一。我可以把长度设置成2。结果就又出来了。但是。二是允许的最大字母长度。如果生成3。呃,其实设证三。
这个结果和这个。结果和设置成二是一样的,因为咱们把这个字符再少一个字符,你看啊结果就没有了。因为咱们这儿你即便设置成三,我这儿错错三个字符也是不行的啊,最大长度就是20到2之间。如果你设置成0。
那么代表你当前是不允许有错误的啊,一般来说咱们不这样用啊。但是为什么呢?咱们待会儿再去考虑这个问题啊,咱们先来讨论什么是步长。这是也是你面试官,你要跟面试官解释清楚的一个原因啊,解释清楚的一个问题。好。
咱们来看我的笔记里边啊,那关于这个fuliness呢。

好,咱们来看一下啊,取值范围。首先呢你要跟监考官说清楚,取值范围只有0到1啊,只有012这么3个。而且并非越大越好,这是你需要记住的。因为如果数字越大,比如说咱们在英汉词典里。
都是这种第一个单词叫什么abband是吧?咱们随便写一个简单一点的ABOUT。好,那么比如说我们五个字符,你设置两个字符。的冗余长度,或者说我们允许容错两个字符。那么可能ABT通过这三个字符呢。
我能检索到相关性比较高的词汇还是有一些的。如果你设置的这个容错步长,比如说是3,那么我允许任意三个字符错误。那么通过两个字符召回的结果可能非常多,就是召回结果非常多,但是什么呢?相关性比较差。
相关性比较差。也就是说,仅凭剩下两个字符呢,我们返回我们召回的结果,虽然结果多,但是跟你想要的结果的相关性不大。所以就没有意义了,而且这样的性能也会更差。
所以这就是为什么我们的这个长度呢一般设置为最大为2。

默认情况下呢。这个长度呢其实如果你不写这个啊,你不写这个fulness呢,它相当于在forfulness里边设置了一个叫AUTO自动长度。这个自动长度。AUTO。
这个自动长度会根据你当前这个字符的总长度啊,你当前搜索词的总长度动态的去做调整。比如说你的这个搜索词呢,哎我就一共就三个字母,那么肯定你如果设置成两个就没意义了。C开头的。
比如说我C嗯这个A开头的一个单词。那么我容错两个,那么以A开头的字符太多了,我把哪个放在前面啊都不合适。所以一般来说,你像这种比较短的,可能哎我们允许的字符长度就比较短,那这是O two啊。
咱们一般来说也都这么去用。

好,那么咱们来看啊,一般来说呢在计算长度的时候呢,在ES底层呢使用的这个luing,它计算的长度这个算法叫。那个莱文斯坦因这么一个算法,它计算长度以上四种情况呢。好,这三种情况呢,它的步长都是一。
而这种情况呢补长是2。但是咱们ES使用的是一个进阶的算法,叫达木劳莱文斯坦因啊。你只要在面试的时候把这些关键词给它抛出来。首先呢啊我们在。使用拼写纠错的时候,使用的这个叫fsy。查询,也就是模糊查询。
好,其次我们是通过一个叫莱文斯坦因和达莫劳莱文斯坦因这两个计算不长的算法来计算当前容错的这个补长的。把这两个名词抛给面试官。好,MLM斯坦因对于这个你像这种词字符错位。AXE写成AEX这种情况呢。
在莱姆斯坦因里边补长是2,但是在达摩劳莱姆斯坦因里边就是一。好,那这就是拼写纠错的一个,其实内容非常简单啊,也没有什么太多的啊太复杂的东西。主要记住一个可能容易嗯面试官可能会扩展问到你一个问题。
就是延伸一些问题。为什么说我们这个长度呢?最大是2,为什么不能设置34。啊,我们容错更多的字符啊,你针对这个问题,你好好想一想怎么去回答面试官就行了。因为如果设置的更多,长度,这个冗易的长度更多。
我们可能呃返回的结果没有意义。

系列 6:P162:分片是什么 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们接着来看下一个问题,说一下你对ES中分片的理解。这个问题呢稍微有一些开放啊,关于分片的内容呢非常多。那么咱们可以根据对应的岗位薪资的上下浮动来动态调整我们的答案。如果你面试的岗位薪资要求比较高。
那么我们回答的自然也要深一些。相反,如果岗位薪资比较低啊,我们也可以回答的简单一些。好,下面我们来看一下这个问题我们如何来回答。

OK首先说明一点啊,我们在回答此类问题的时候,尤其是内容比较多的问题啊,你不可能像老师一样在给你讲课的时候啊,讲题的时候呢,照本宣科有1个PPT或者有一个大纲在这儿。所以你在脑中呢不用去死记硬背。
老师给你讲的这些东西。而是要把分片就是把知识点的理解记在脑子里,在脑中形成一个大纲。哎,比如说此类问题,我们可以依据首先从概念和用途这个维度啊,它有哪些作用。
以及从这个底层原理上或者说咱们在使用上有哪些技巧,一定要结合自己的理解啊。首先我们从概念维度来解释一下什么是分片啊。分片其实其设计初衷呢就是为了实现分布式。
任何牛逼的框架或者解决方案都不可能依托于单独的某项技术或者个体来实现。贯彻到底呢,其实分片就是为了落实分而置之的思想。O那么什么是分片呢?分片其实就是一种数据的载体啊。
我们之前在解决my circlercle问题的时候,在数据量大的时候,我们可以采取分布分表。而ES中天然是支持分布式的。那么它采用的手段呢?就是分片。一个分片,我们就可以把它理解为一个表拆分成若干部分。
其中的某一部分。N多个呃独立的分片呢组成了一个完整的索引啊,这就是分片。好,你在回答的时候,一定要像老师这样去回答,而不要说去死记官网,或者说你在百度上搜到的一些概念啊,分片是什么呃分为主分片副本。
这样是没有意义的啊,一定要让面试官感觉你对分片有自己的理解,那这才是一个比较好的答案。OK那么当然了,这些简单的概念我们也要去说出来,包含主分片,它的作用是什么?包含副本分片,它的作用是什么?当然了。
这些咱们一笔带过就可以了。好,那么以上是分片啊。那么一个分片呢在ES中呢,其实就是一个loing的实力啊,这一点我们应该记在脑子里。每一个分片呢都可以独立完成啊任何请求,就是咱们对数据的查询请求。
而在ES中呢主分片是可以读可以写的,而副本是只读的。O那么分片的作用呢,就是为了实现高可用啊,我们刚才已经解释过了,通过把分片分布在不同的节点或者网络中呢以实现局部故障,对整体服务产生的影响啊。
那这就是高可用。好,这也是分片的作用之一。好,那么其次呢我们在回答此类问题的时候,一定要强调啊分片的作用呢,其实就是为了实现我们的高可用性啊,提高我们业务的吞吐能力啊。
提高我们的服务的这个吞吐量以及提高我们的并发显应能力啊等等,围绕这几点来回答。好,那么一般的这个问题啊,一般的这个岗位呢,我们如果能把这几点答好就可以了。那么如果是进阶的答案。
我们还要把分片的一些执行策略给它讲出来。好,那么关于这个策略呢,每一个策略呢,咱们。都能单独讲一节课。但是在面试的时候,这种理论层面的东西,我们不可能把每一个知识点都完整的背诵下来。
所以咱们可以把这几个点都提出来,然后简单的说一下自己的理解就可以了。好,那么分片所包含的概念呢呃所包含的这个策略呢有很多,其实这些策略呢都是围绕着数据的安全性以及我们的这个数据的可用性啊,是吗?
我们的服务的可用性。这几点来产生的或者来设计的。

首先,分片的创建策略,以及分片的这种分配策略,延迟分配策略,包括分片的这个均衡策略,还有分片的数量和大小的决策。这些几个点你能说出来几个,至少这个答案呃,咱们在面试官眼里是哎你对分片的理解还挺透的。
你能理解分片有这么多个策略。其实我还没有说完,关于分片的策略,还有share location awareness分片的分配感知策略,以及foralce awareness分片的强制感知策略。当然了。
咱们其实没有必要在面试的时候,把每一点都讲的特别清楚啊,也不太可能,因为你像我现在跟你讲对吧?那么这些策略呢是列在这儿了,我知道每一个策略它都包含,它都是。呃,用来干什么的,或者说咱们怎么去使用它。呃。
以及它的意义在哪。但是如果咱们在面试的时候,尤其是在面试一些高级岗位的时候,涉及到这个知识体系非常庞大。ES1个只是其冰山一角,而ES中都有这么多面试题。那么我们在如此做的这个知识点中呢。
我们不可能把每个知识点记得特别到位。所以你能列举其几点已经代表了你对这个技术的你对当前这个知识的理解的深度,那就可以了。比如说分片的创建策略。那么咱举几个例子啊。
分片的创建策略是指我们在分片的创建的过程中,在创建之前,我们要指定分片的数量分片的大小,以应对将来业务的变化,对我们性能产生的影响,包括分片的这个分配策略。
分片的分配要均要尽可能的把分片的均匀的分配在不同的节点上,以保证我们每个节点它的性能是比较均衡的。分片的再均衡策略呢,是指我们当前节点,呃,有节点加入或者有节点的。开的时候会自动啊。
就是我们的master节点会自动的把。离开的节点。它所丢失的分片分配到其他的这个节点上,以及比如说我们当前有新节点加入的时候,我们动态会计算我们当前集群中所有节点这个算力。好,我如果发现。
比如说我们当前一共有9个分片。而此时新进来一个节点,我们有4个节点,那么此时9个分片就会均匀的分配在4个节点上,当然不可能做到绝对均衡啊。好,那么分片的这个延迟分配策略是为什么呢?
这个延迟分配是什么意思呢?你解释清楚什么叫延迟分配就可以了。比如说我们在面试的时候,延迟分配呢就是分片。比如说我们当前有一个节点丢失。那么当前节点所包含的分片会延迟一分钟去执行再均衡策略。
那么延迟一分钟的原因,就是因为系统并不知道你当前这个节点是暂时的网络断开,还是说已经故障了,所以我要等待一分钟时间啊,那么如果这个节点在这一分钟时间内恢复连接,那么此时我就不需要再分配了。
因为分片的分配也需要消耗我们大量的这个网络资源。O那么我举个例子,比如说。我们把当前我们ES的这个服务看作是我们班级在打扫卫生。好,我们现在集群中有5个人。那么其中一个人啊,突然他不见了。
那么我们的master节点我们可以理解为技律委员或者我们的班长。好,不知道啊我们的班长不知道这个节点到底是上厕所了还是生病回家请假了,对不对?如果是上厕所,那么他马上就会回来啊过几分钟他就回来。
所以此时他的活我不需要再分配给别人。而如果他是生病请假了。那么此时我们master节点就会把他的活分配给其他人。好,这样的话我们的这个每个人干的这个工作量才会比较均衡,还能把这件事给完成。好。
那么这其实就是分片分配这个分片的延迟分配策略的一个意义,对不对?好,在实战环境中的master节点,是不知道突然一个节点的离开,是因为什么原因呢?因为这个网络的断开,是随机的。好,那么这就是分片分配啊。
延迟分配策略的一个意义,以及分片的数量决策和分片的大小决策。那么这个呢是没有针对咱们在回答面试问题的时候呢,这个数量和大小是没有一个绝对的最优值的。在回答这两点的时候呢,主要遵循以下几个点就可以了。
首先,分片的数量,避免分片数量过多,大多数搜索会命中多个分片。而每个分片在单个CPU上现成的这个现程上运行搜索。虽然说咱们分片比较多啊,可以运行呃多个并发这个搜索啊,但是如果跨大量分片进行搜索呢。
会耗尽节点的这个搜索的线程池。那么这个时候呢会造成低吞吐量以及缓慢的搜索速度,就是会降低我们的查阅速度。第二点呢是分片呃其实来说呢是越少越好。每一个分片呢都使用内存和CPU的资源,在大多数情况下呢。
就是一小部分的这个分片要比这个更多数的就是一呃一小组的大分片,比如三个大分片要比5个小分片所消耗的资源更少。所以说记住这两点啊,这是关于分片的数量。那么分片大小的决策一般来说。
合理的分片容量呢在10际到50GB之间。虽然说这个要求呢不是一个刚性要求,但是一般来说呃这个其实官方呢也是经过了测试得到这么一个结果啊,呃实际到50GB之间呢,这个效果是最理想的。
OK根据这个网络的限制啊,呃我们也可以。把分片的这个大小调的再大一些。但是。在所有的生命周期管理中,一般设置50GB单个所引的最大阈值是最好的OK另外一点呢就是关于分片数量和大小的关联,小于20个分片。
就是说我们一GB的平均啊,平均1GB的对内存所能管理的分片大概在20个左右啊,一般是这么一个对应关系。好,能把以上几个点回答清楚。那么我们这个问题就基本及格了。

系列 6:P163:分片副本的作用 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看下一个问题。ES中分片副本的作用是什么?那么这个问题呢,实际上是上一个问题,关于分片作用的延伸问题。ES中的分片可以分为两种,主分片prem shared的可读可写,副本分片。
也就是relic shared是只读的。那么关于副本的作用呢,其实无非就两个啊,我们来看第一个呢其实就是为了容灾啊容灾啊。第二个呢其实就是为了提高我们的并发查询能力。好。
我们可以基于下面这个图来回答这个问题啊。好。


从这个图中呢,我们可以看到啊呃我这儿呢给出了首先一个集群啊,有节点一和节点2,这两个节点组成了一个集群。那么我们创建了一个索引。把它拆成了三个分片,分别是0一和2,并且为每一个分片创建了一个副本。
咱们在不考虑高可用啊,不考虑这个master选举的前提下,那么分片设置为一的时候,那么此时我们就具备了呃索引的一个备份,我们任意一个节点宕机,那么数据可以在另外一个节点上找到一个完整的备份。好。
那么这就是副本的第一个作用啊,为了容灾。但是两节点,我们现在先不考虑master选举,两节点,它其实是不具备master选举能力的。一旦一个节点宕机,其实服务就停了啊。好,那么如果说我们把当前的节点。
有两个节点扩充为三个节点,由看右边这个图,三个节点此时会执行分片的再均衡策略。此时呢会有两个分片被分配到了第三个节点上,此时我们就达成了这个负载均衡。好,那么同样我们的这个分片啊会被均匀的分摊。
每一个节点包含两个不重复的呃不重复的分片,并且每啊这个每两个节点之间的分片都是不完全相同的。好,那这样呢任意一个节点宕机,我们都能在另外两个节点找到完整数据啊,什么叫完整数据?
只要你能找到012这三个分片,那么数据就是完整的。哪怕主分片丢失。那么这个时间也是短暂的啊,我们会从对应的副本啊,把它提升为主分片啊,其实就达到了我们这个数据完整性。好。
那么三节点同样也是最小规模的高可用集高可用集群。因为比如说我们当前好,假如说这个节点二呢,它是一个主节点。节点二宕机了之后呢,我们是可以在另外两个节点中选出一个新的主节点的。
所以三节点也是我们最小规模的高可用集群。好,那么这个你可以在面试的时候也可以可以也可以说出来啊。好,那么如果我们在此基础。之上呢再扩充一个副本,也就是说为每一个主分片分配两个副本。好。
我们就可以把集群呢升级为好,我们现在屏幕上看到的这个样子啊,那么每一个主分片呢,它都包含了两个副本。那么此时呢数据的冗余备份呢,其实也就是两份。好,那么其实比如说我们索引啊只有一T的数据。
那么每一个副本也就是说每一个分片的副本都有两个。那么此时也就相当于我们做了两个备份分别分别啊分别就是把这个分片分配在了不同的节点上。那么此时每一个节点上都能找到012这三个不同的分片。好。
那么012012012。那么此时我们节点允许任意一个节点丢失。而且可以保证我们数据的完整性。当然了,这样呢我们的这个数据的吞吐量,也就是相对于上一个集群。其实是没有提升的。
而只是我们把数据的冗余增加了一份。那么我们当前集取呢仍然是仅允许有一台节点当机,也就是出现故障啊,因为我们如果第二个节点出现故障,那么剩一个节点是不满足我们最小这个选举主节点的一个要求,也就是两票。
那关于这个呢,咱们在后边讲master选举这个面试题的时候啊,同样会给大家介绍好,以上呢基本上就是我们副本的作用啊。

系列 6:P164:如何理解索引 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们继续来看下一个问题,谈一谈你对ES中所引的理解。那这是一道来自阿里的面试题,对应的岗位薪资呢在25到30K左右。这个问题呢看似非常简单,其实是暗藏杀机啊。
这个问题是非常容易让面试官看出你是否真的对ES有比较深层次的了解的一个问题。好,那么下面这个问题我们该如何来回答呢?索引我们一般也称之为index啊,在ES中呢,索引可以同时表达三种不同的概念。啊。
所以换句话说呢,我们可以对索引呢有三种不同的理解。关于这一点呢,我待会儿呢也会在本节课的3。3这个小节呢给大家详细的介绍啊,作为一个扩展知识。OO啊,那么我们应该怎么样正确的去理解索引这个概念呢?呃。
我不知道大家有没有金庸老先生的粉丝啊,金庸老先生呢有一个作品叫设呃,叫那什么呢?叫天龙八部。呃啊叫倚天屠龙记。在倚天屠龙记里呢,张三丰曾经对他的这个徒儿啊,应该是徒孙吧。呃,说过这样一句话。
就是在他学习太极拳的时候,那么张三丰对张无忌说,你要想学成太极拳,你就要把你之前学过的招式和套路全通通给忘掉。好,我们在学习ES的时候啊,我知道大家呢在学习ES嗯之前呢,应该都学习过my circle。
好,咱们在学习ES的时候呢,可以借助my circlecle的一些理念一些概念。但是我要告诉你的是,你一定要把一些概念和数据库和my circlecle的这些概念的绑定呢,你给忘掉,你不要理解。
就是他们的概念在两个数据库之间呢,是有可能是完全不一样的。好,我们接下来要说到这个索引,其实就是这样的。所以你要把一些固有的概念先给忘掉。

我举个例子啊,比如说我们现在打开百度。

我们搜索所引的。所引的种类。

好,我们来看这个吧。好,那当前这个博客呢,我们可以看到索引的种类它跟我们列出的以下几种。主件索引唯一索引普通索引权索引覆盖索引组合索引等等。那么这些索引呢其实本质上属于一种单独的数据结构。
它的目的是帮助我们去快速的更高效的去检索我们的原数据,也就是我们的业务数据。好,而在ES中呢,我们主要表达的含义呢并不是这样的。我们在ES中索引的概念呢,它其实可以等价理解为mycicle中的表。啊。
但是它们并不是完呃并不是一种东西啊,只是我们可以通过my circlecle这个表的概念来类比理解为呃我们索引在ES中的这个概念。好,我们暂且可以这样去理解啊。记住啊,我们只是这样去类比。
而不是说索引就是表,因为它们是完全不同的数据结构。好好,那么现在我们的认知呢就把index呢当成表。就是tablele。就可以了。当然了,这个索引的概念呢,我们也会在后面不断的学习。
你不断的使用过程中呢呃慢慢的慢慢的去更加深入的了解啊它这个概念。那么在今后ES的学习中呢,我也给大家提一点建议啊,尤其是对我们新手朋友。婴儿在学习一门语言的时候呢,一开始呢它是基于比如说苹果。
咱们学习母语的时候嘛,苹果它会和一些物品去关联。他会用自己的这个意识去理解这么一个词儿,他到底是个什么意思。而往往我们在学习另一种语言的时候,比如说apple。我们会借助第一种语言啊。
这个苹果它翻译成apple。那这样我们要记忆的数据量呢就要翻倍,明白吗?所以我们要学习呃后面这个ES的时候呢,我们就以这种刚开始学习第一门语言的这种形式,你抛弃第一门语言,咱们通常来说。
可能对于大大多数java程序员来说,可能myscle或者oracle呢,是我们学习的第一种数据库。好,你现在先把它抛之脑后,把所有的概念都给忘掉。那么我们接下来学习ES呢会变得更加轻松。
就是回归到了我们学习,就是我们处于婴儿学习新语言的那么一种状态啊,从零开始而不要去借助一些咱们现有的固有认知。好,因为这些固有认知呢,会影响你对新事物的理解。啊,这是我给大家的一个建议啊。好。
那么索引的概念呢给大家介绍完了。那索引的组成部分呢,首先我们刚才说了啊,在借助一些my circle的概念去理解啊,我我可以这样去给大家讲,因为我已经很熟练了,对吧?那么咱们怎么去理解呢?来看啊。
我打开咱们local host的,我这儿的服务就已经启动好了,local host5601。😊,5601。好,我们现在启动的这个程序呢叫kibanana啊。
它是我们e search官方呢给我们提供了一个客户端工具。这里边的功能相当相当强大。当然了,我们目前只会用到其中一个功能。好,当我们访问了kibanana的首页之后呢,它会给我们这么一个界面。
我们点击左上角三条杠,三条杠呢滚动到最下方有一个d toolss,就是开发者工具。我们在这里边呢把所有的代码先删除啊,我这里把字体呢调到咱们一个合适的大小23。浏览器复位。好。
那现在啊我们这个界面呢呃是我们接下来课程呢用到最多的一个工具。当然了我们除此之外呢,浏览器呢也给我们呃一些好用的插件。这个之前我们提到过你像head呀,像这个 search tools啊。
像这个咱们对这种对国人比较友好的插件叫elasticE啊,那这些工具呢也非常方便的能让我们提供一些节点啊索引啊,以及一些数据的查询,甚至可以帮助我们去管理快照。
还有一些像这种帮我们创建模拟数据这样的这样的功能啊。当然了还是啊我们用到最多的还是我们这个这个ke中的 tools。好,这个原由很多啊,首先这个d toolss呢是能给我们智能提示的啊。
其次呢能帮助我们去格式化端代码代码纠错等等啊,这种这个ke banner呢你在使用的过程中,你会发现它会对给我们带来很多好。


处包括一些快捷键啊,我们使用起来非常方便,但它也有一个缺点,它的缺点就是比较重。啊,他要占占用你比较多的这个系统资源啊,所以一些简单的任务我们可以借助咱们一些插件或者工具啊。但是如果我们要系统的学习。
我们还是要依赖于d toolss。而且这个东西本身啊这个提班呢本身也是我们要学习的一个工具,也是要我们学习的一个技术。🤧好,那么话不多说啊,索引它包含哪几个组成部分呢?首先我们课件里给我们展示了啊。
它一共有3个。我们在创建索引的时候呢,通常使用一个叫put。因为ES它本身是一个基于rest风格的。啊,这么一个开发语言啊,或者是数据库。我们在写代码的时候呢,经常使用的就是put post。Get。
啊。get以及dele。所以啊我们使用put呢。哎,使用put呢它具体都能执行哪些操作呢?我现在呢先不用给大家介绍,因为我们后边课呢会呃详细的给大家去介绍。那么put我们先尝试创建一个索引。
比如叫product。好,我这里边呢。我先。看一下这个proda这个索引是否存在啊。Product。执行一下查询啊,首先这个所以已经存在了,那咱们就先不用去put了。好,我们执行get就是查询当前。
后边呢这个就是索引的名字。注意啊,索引在命名的时候有一个规范。我这加一个注释。好,第一个。字母全部小写。不要有大写字母。第二个,如果是多个单词,不要用。驼峰。或者帕斯卡。而是用下划线命名。
比如说test。index这是我们的命名规范。OK那我们现在查询productd索引之后呢,右侧给我们响应的这个上下文对象呢。好,我们把它折叠起来,可以看啊,可以看到它一共包含了三个部分啊。
其中productd的是索引的名称。而下面三个呢分别是索引的别名,以及索引的ming和索引的sing。那这三个呢分别是三节不同的课啊,是三个不同的知识点,尤其是这个ming。
我们会有很多的内容要在里面啊。ming展开之后呢,它又包含了一些字段的类型,字段的长度。还有像分子器等等等等啊,这里边的知识很多很多。所以我们在目前呢先不给大家详细的讲解。
我们只需要记住索引的组成部分一共有三个就可以了。那么它们分别发挥什么作用呢?首先别名呢,也就是锁引别名啊,那么它的主要作用呢是为了保护和封装索引,那么它具体的含义作用呢?我这写了一篇文章。
你可以点进去看一下。这里边内容比较多啊,我就不详细给大家讲了。因为我们有专门的课程安排,详细的去讲索引呢别名的使用,以及它的作用,以及在它的这个使用场景啊。包括后面呢我们要讲到这个数据流啊。
🤧以及这个ILM啊,我们用这还有这种rollover indexdex呢,都要用到这个index。好,现在我们不理解没有关系。

好,同样我给以给大家举个例子啊,我们现在呢9200啊,打开local host。我当前的服务呢是在9200端口号端口号上运行的。访问通过head插件的访问啊我们。

尝试访问。嗯。9200。🤧好,可以看到有一些索引呢,它下边有一些彩色的标签。其实这些标签呢就是别名。好,那么它现在到底有啥用呢?咱们现在也不用关心啊,没关系的,咱们后边会讲O那我们继续啊。
除了索引别名之外呢,它还有第二个叫setting settinging里边呢,其实就是索引的设置它会设置一些我们索引的属性,比如说索引的分片数量啊,索引的副本数量啊等等。当然能设置的东西很多。
对于我们目前而言,我们只需要记住索引的分片和副本的数量是在ss里设置了就可以了啊,我们后面的这个分片也会做一个单独的课程啊,在我们本章内容的第七小节给大家去讲好,那么第三个也是最重要的啊。
尤其是前期对我们来说是最重要的ming及映射映射的概念是什么呢?好,同样我们可以借助my circlercle中的表结构来理解。当然啊我们同样是作为一个类比。好。
那么表结构在my circlercle表中发挥的作用和ming在ES中所引发挥的作用是相似的,注意是相似的,它不完全一样。因为ming它和ES和这个my circlercle中的表结构呢有很多不同点。
啊,包括这个字段啊属性啊,它里边划定的这个范围也是不一样的。好,关于这一点呢,我们会在下一节啊,不是下一节了,我们来看一下章节的安排啊。第五章啊,当然照儿这个章节号这个课程大纲呢,我后续呢会做调整。
也大概就是下一章或者下下下下一章的事儿。会给大家去详细的讲解啊呃大家也不用去关心啊,也不用太在意啊。到目前为止,截止到本节课,我们理解的层面到目前为止就可以了,就不用再去深究了。好,那么我们最后呢。
给大家做讲一下扩展知识啊。什么是索引啊?我一开始说它有三种不同的理解。首先第一种呢。好,首先第一种它可以表示原文件的数据,也就是我们刚才讲的这个第一种,它指的是table。啊,我们类比理解为table。
这是第一种理解。好,我们就不再去赘述了。第二种理解呢就是它可以表示索引文件。所引文件呢我们在ES中呢有两种。第一第一种常见呢叫倒牌索引。第二种呢叫正牌缩引。好。
那么这两种索引呢分别是用来解决全文检索以及聚合排序用的这两种索引呢。他们分别也有一个呃其他名字啊,也有的人把它叫做呃反向索引,一个叫正向索引啊,这两这两个概念呢。
尤其是倒排索引是ES中最最最最最最重要的概念之一啊,甚至我们可以把质疑去掉,在面试的时候,倒排索引的这个被问到的概率呢,几乎是百分之百啊,所以说它的重要性不言而喻。因为ES的核心功能就是全文检索。
没关系啊,我现在是扩展一下全文检索这个概念。大家不理解,没关系。全文检索它的呃支撑全文检索的核心就是倒排索引,而倒排索引的底层最核心的数据结构是FST。好,我只给大家延伸那么多啊。
讲到这儿呢呃大家去理解它表示一个索引呃索引文件就可以了。那么索引文件呢,它是不会影响原始文件的,也就是相当于我们刚才在浏览器里边看到的这个啊。索引咱们再重新来索引。
咱们刚才不是在百度上去搜索了索引的一个分类吗?索引分类。啊,就看第一个吧。好,那么索引有主件索引,有唯一索引,有组合索引。那么普通索引啊,那么ES中的这个第二个理解啊,就是索引概念的第二种理解。
那么就可以类似于咱们类比理解为这些索引啊,只不过ES中的这个索引呢,它的数据结构和mycil中这些索引呢是完全不一样的。好,这是第二种理解。还有第三种理解就比较。抽象了,怎么说呢?它不是一个名词。
而是一个动词。也就是说我们在ES中呢,经常你会听到一些老呃就是有经验的人,他会你往ES索引一条数据。此时索引比如说索引。索引一条数据index a do。此时。
index表达的意思是向某个索引中添加一条数据。比如说像test indexdex。啊,中去index一条数据,其实指的就是像test indexex中添加一条数据。好,它是一个动词。好。
那么以上呢是我们在ES中会遇到的三种不同的对于索引概念的理解。那重要性或者我们按照常用的程度呢。ES就是表示数据文件,它是第一个也是最基本的。第二个呢表示索引文件表示倒牌索引或者正牌索引。
它是第二种理解。第三种呢啊其实这个呢就不强求了,咱们理解记不记得住都可以啊。他主要是表示这个创建数据,因为有人这样去说,也有人说你去put一条数据。有人说你往里边写一条数据啊,都可以。好。
那作为一个扩展知识,你可以在面试的时候啊,呃跟面试官去聊一聊这个问题。就如果面试官啊问到呃你对ES有什么理解啊,呃,这个所以你怎么去理解啊,你就可以把它向你擅长的这些知识领域里去引导。OK啊。
那么我们本节课呢就给大家讲到这里啊,如果你也理解,你也觉得老师的视频讲的可以啊,你也喜欢老师的视频,也欢迎你的一键三连啊。你的支持呢也是对我很大的鼓励和帮助啊,谢谢。😊。

系列 6:P165:Master选举 - 马士兵学堂 - BV1RY4y1Q7DL
好,我们接着来看下面一个问题,说一说关于ma选举的选举过程。那ma选举呢也是ES中呢面试频率比较高的一个问题啊。那么这是一道来自百世呃百度的问题。呃,对应的岗位薪资呢在35K到40K左右。
master选举呢,我们可以从以下几个角度来回答啊。首先呢是何时发生选举啊,也就是选举的出发条件。那么第二点呢是谁参与选举?那换句话说呢,就是参与选举的不同的几个节点角色分别有哪些,分别是什么意思?
那么最后呢就是我们的选举过程啊,那么选举过程呢相对来说比较复杂。那么待咱们待会儿呃详细来撸。

那么回答这个问题啊,咱们就从以下几个角度来回答就可以了。OK我们来先看第一个。那么什么时候触发选举呢?那选举的必要条件呢有两个啊,我们先来看。呃,下面一段话,那么这段话呢是ES中源码啊。
有有这么一段描述。那there are two fault detection processes running啊,这句话告诉我们呢,其实在ES的服务进程中呢,一直啊有两个错误检查进程啊,一直在跑。
那么这两个错误检查机制啊,那这两个错误检查的dection呢,它是用来检查我们当前节点是否存活的。那么其中第一个the first is by the masterster。
那就告诉我们第一个dection呢是由master节点来执行的。那么它的作用呢是通过pin的方式,你看pin all the other node在集群中呢发现其他节点是否存活。
那么这是第一个它的名字呢叫做n fault detection。啊,简称node FD。那么它的作用呢就是检查普通的节点啊,集群中的其他节点是否存活的。
那么另一个啊那其实就是检查master节点是否存活了。那么第二个呢,它是通过其他的普通节点像master节点呃,master节点发送聘请求来检查master节点是否还存活的。
那么它的名字呢叫master for detection呃,简称呢master fD记住啊,那么带master的不是由master来执行的,带ns的不是由ns来执行的,就是带啥的,那么是用来检查谁的。
带master的FD是用来检查master的ok记住这两个detection啊,一定要记住,那么。在此基础之上呢,那么我们来看一下触发选举的条件呢有两个啊必要条件。
第一个呢是当master FD节点发现master节点失联的时候,那其实就是普通节点。我们可以把它理解一个班级。那么班级里边有一个班长。那么当呃我们的普通同学啊。
普通的学员发现呃普通的学生发现master节点,就是我们的班长失联的时候,那么此时会触发选举,这是第一个条件。第二个条件呢是n FD。也就是说当我们的active masterster。
我们当前活跃的主节点啊,也就是班长。那么他如果发现集群中的活跃的候选节点不满足法定票数,此时它会主动放弃master节点的身份,也就是放弃班长的身份。好,那么这个法定票数具体是多少。
我们会在下一个问题嗯,讲这个脑列的问题,脑列的时候啊,给大家详细的去说。那么咱们在回答选举的时候呢,你只需要回答。那么当前如果master节点发现当前候选啊集群中的候选节点呢,他不满足法定票数的时候。
他会主动放弃master的身份,那么这个法定票数呢,就是我们当前候选节点小于法定票数。那么这个法定票数呢一般是2分之N加1。啊,比如说当前呢有5个候选节点,那么2分之N加1呢就是3啊。
最终结果呢就是2分之5加上一等于3啊,要取整O。好,那么这是法定票数的问题,这两个是出发条件啊。那么选举的时候有哪些角色会参与选举呢?其实选举的时候无非就是一个候选节点,一个。呃,选举节点啊。
咱们严格来说呢,其实一个叫投票节点,一个叫被投票节点。其实在ES中呢,咱们只要配置了master这个角色默认情况下呢,它就是一个选举节点啊,它同时又是一个投票节点。那么在ES中呢。
这种节点呢称之为masterible node,就是它是具备选举资格的节点。它同时又能给别人投票啊,这是第一个我们需要认清的一个角色,叫masterible。active master呢顾名思义啊。
就是指的当前集群中已经存活的它活跃的主节点。那一般情况下呢,一个集群中只有一个我们选举的就是它啊,我们所说的选举就是active master,它产生问题的时候。
我们要重新选举出一个active mastersterok从哪儿选呢?就是从master enable这些节点里边去选ok。第三个叫detected master neible,就是专用的主节点。
一般来说呢。小规模集群呢呃我们一般不配置detection,就是de呃这个专用的主节点啊。那么这种情况一般发生在规模比较大的集群中。好,那这个呢其实无所谓啊,这个如果要讲的多呢,那你其实没必要去去讲。
因为现在我们讲选举的话,你只要知道有master就可以了。voting only呢这个就比较重要了。么voting only呢一般指的是仅投票节点,就是阉割了他的被选举权。好,默认情况下呢。
ma它是可以给别人投票,也可以让别人给他投票的。但是如果我们在候选节点上配置了voting only,那他就只能给别人投票。好,这以上四个角色呢?适和我们选举啊,就是在选举发生的时候,相关的几个角色。
我们要知道谁参与选举。只有masterable啊,并且不能是voting only。那么只有具备了这两个前提条件,他才能参与选举。🤧好。😊,这是必要条件啊。在面试的时候呢,咱们也可以去提。
那下面呢我们来说一下选举的发生过程啊。好,我们来可以参考下面的这张图啊呃放大一些啊。

好,咱们从上至下来啊,那这个图呢比较详细啊,是通过源码逆向回来的。🎼好,那么pin and wait呢就是我们选举的入口。那么当前我刚才不是说有两个FD嘛,一个叫masterFD,一个叫nose FD。
那么不管是master FD还是noteFD,他们都会去执行一个叫pin and response啊。稍等啊。我们换一个颜色。
不管是master呢还是n FD都会去执行一个叫pin and wait的方法。那么通过这个方法呢,获取到的是响应当前节点pin请求的所有节点。所以但是它只是响应当前节点的节点。
而不包括执行pin and wait方法本身的这个节点。那么最终呢会将所有响应啊当前节点的节点呢添加到一个叫f pink response的列表里。那么这个里边收集到的就是当前活动的节点列表。
那么下一步呢就是local node啊,通过loc note方法呢获取当前执行pin and wait的这个节点,并且添加到f pin response这个方法里。
那么当前呢就是一个完整的呃呃活动节点的列表,咱们接着往下看啊,接着往下走。

🤧好,那么下一步呢是通过一个叫masterele啊,n and这个master。那么这么一个参数呢进行呃过滤,过滤掉的是无效的投标节点。那这个其实跟选举呢呃在选举过程中不是一个重要的环节啊。好。
咱们只需要知道有这么一个参数,它是过滤的。在面试的时候呢,如果你回答啊回答这个也行,不回答这个也行,那毕竟不是重点。那么最终呢对经过筛选的节点呢会放到一个叫pin。





response的这么一个节点里。呃,这么一个列表里,它是存储的生成的是活动节点呃活动节点列表啊。刚才那个前面加了一个for,现在这个是没有for,经过过滤的就没有那个前面那个FULL了啊。好。
刚才是有这个的。好,那么它其实就是说我们的这个选举的节点呢,就是从当前的这个列表里边进行的。只不过这个pin response里边有可能包含了已经存在的active master。
所以咱们下边呢就要分两种情况。好,如果我们当前这个节点啊,注意看。


如果当前啊我们在便利这个pin response的时候,因为这个pin response存放的是所有活动的节点。那么如果当前这个活动的节点是主节点,并且不是local node。那么在此种情况下啊。
其实我们是不需要选举的。因为它已经是主节点了,所以我们其实不需要选举。而且正常情况下呃,如果把呃把这个节点如果是的话啊,它会放到一个叫act master s这么一个列表里。那么正常情况下。
team master s,它应该只有一个,因为一个集群中只允许有一个act master,如果发生了多个,那么就脑列了啊,那么就代表有问题了。所以说正常情况下就有一个,那么这里边允许存放多个呢。
是考虑到了脑列的情况。好,那么这种情况下是往呃下边这个分支呢是不需要选举的。因为我们集群中呢是有存活的主节点的。好,如果这个节表。

中啊,如果当前act master是一个空列表,那么代表当前集群中没有存活的主机点,那么意味着要发生选举,对吧?好,那么下边这个是不发生选举的一个分支。那么往右走呢是需要发生选举的一个分支。好。
这是第一种情况。那么第二种情况呢,就是当前活动节点是候选节点。好,那么此种情况呢。


好,要把它添加到一个叫master candidates啊这么一个列表里。好,最终呢要在选举之前呢呃我们要进行一次判断,判断当前这个列表节点的数量是否满足法定票数。

啊,通过一个方法叫has enough has enough candidates这么一个方法来判断当前的节点数量是否满足最小法定票数,跟刚才的逻辑是一样的。就是是否小于2分之N加一啊。
2分之N加一呢是我们人为配置的一个这个值啊,目的是为了避免脑列。咱们再回答面试问题的时候,咱们只需要回答是否满足法定票数就可以了。O好,那么如果满足了,那么选举的过程呢就是以下几个步骤。
首先呢是调用注意啊,这个方法呢确实就只叫elect master,前面没有S啊,它的方法名称叫elect master service,它的方法名称就叫做elect master。
通过调用这个方法来选这个选举过程其实就发生这在这个方法里边啊,那么选举的。





啊,基本逻辑呢就是我们要首先啊是选举排序后的第一个master candidates,就是masterable node。那么选举呢。


主要是两个啊主要是依托于下面两个条件。第一个,先按照集群的状态信息进行排序,最新的版本号排在最前面,然后再按照ID进行排序,ID最小的排在前面啊,那么集群状态越新的就排在最前面。
那么也就是说我们集群版本啊,有一个参数叫clastster states version越大,那么优先级越高,那么最终选举出来的这个优先级也就越高。
这是为了保证新的master拥有最新的集群状态即me data啊,避免commit的时候,me信息啊变更丢失。那么如果版本状态相同,那么我们就比比较它的ID就是节点ID节点ID越小排在最前面。
那么最终选举出来那个节点呢就是最新的临时master啊。OK那么以上呢就是这个选举过程啊,咱们其实只要把这几点给答出来就可以了。呃,答出来之后呢,选举出来是临时master啊。
选举出来临时master还要将版本呃,这个集群的状态信息分发到每一个节点啊。那么然后节点状态,就是其他的节点收到这个最新的状态信息之后呢,要加入到最新的集群里。





这么就是一个完整的过程。那么下面呢其实回不回答都可以啊。以上呢上面呢是主要选举过程。好,那么以上呢是我们关于master选举这个问题的答案。


系列 6:P166:脑裂问题 - 马士兵学堂 - BV1RY4y1Q7DL
OK我们继续来看下面一个问题,脑列是什么?那如何解决脑列问题呢?呃,这个问题一般是和master选举这个问题呢一起来问的啊。就是如果你问到master选举这个问题。
一般面试官呢可能会在这个基础上问问你什么是脑列。那么什么是脑列呢?我们来看一下。

好,脑裂这个情况呢一般啊就发生在选举,或者说我们当前网络发生故障的时候,我们来看下面这个图片啊,我举个例子。


好,那么假如说我们当前集群中呢有两个节点,那么这个节点呢一主一从,左边的是master,右边的是slaver啊,假如说由于某些原因呢,这个master sver呢它的连接丢失了。哎。
我们当前这个节点呢master连接不上啊,联系不上slaverlaver联系不上master。那么此时就产生了那种情况。那么它两个节点之间呢并不知道啊彼此之间并不知道发生了什么问题,发生了什么情况。
有可能是网络中断,对不对?那么此时slaver呢,他就要想哎master到底是不是节点挂了呀,那么我要不要进行master选举啊,把自己选举成master呀,那么这种情况啊。
如果我们在没有采取有效措施的前提之下呢,这种情况是会发生的啊,所以master呢他会啊这个slaver呢他会把自己选举为master啊,就是升级为master。那么此时假如说网络恢复了。哎。
这俩老哥那见面了,那网络又恢复了,也发生很很很eo是吧?这个一脸懵逼啊,那这俩哥们到底谁是master呀,对吧?一个集群中咱们只允许有一个master,那么此时就产生了脑列,那么这就是脑列问题。
说到底呢脑列问题呢,其实就是一个集群中发生了无主或者啊注意无主。或者是多主。啊,这种情况呢我们应该尽尽量避免啊避免这个问题的手段啊有效措施呢就是咱们配置我们当前集群中的法定票数啊。
我画横线的这个参数就是用来配置法定票数的咱们。哦,把这线画直一点。这个参数就是用来配置法定票数的。那么法定票数咱们应该配置为哪个值的?一般我们配置为2分之N。
然后加上一这个N指的是master enableable节点的数量。比如说我们当前集群中有5个master in。那么此时2分之5加1啊,这注意这个2分之5要取整加一呢就是3好,其实呢就是投票数过半。
那么这么做的目的是什么呢?好,以上面这个情况为例,2分之2加一就是2。那么当我们master啊,当我们这两个节点断开的时候,那么master由于不满足法定票数啊,比如说我们将我们把这个图画到左边了。好。
假如说slaver啊因为和master断开了,那么它就要产生master选举。那么此时一看我的法定票数是两票啊,也就是说我选举自己成为master的前提条件呢是我得到两票。那么显然目前我因为这个集群呃。
因为我当前的网络断开之后呢,slaver这一边呢,它只有一个节点。所以不满足法定票数2,所以他就没有办法发生选举。那么也就是说这样我们就避免了脑列啊,就避免了产生多个master这种风险。好。
我们接着往下看啊,其他这种节点比较多的情况。好,假如说我们集群中有4个节点。


好,不管你的网络怎么去断啊。竖着断横着断。啊,或者是横着断啊,或者说我们。一段3。好,这个节点丢了。那么其实我们当前节点2分之N加1啊,假如说有4个节点,2分之N加1,那么2加2加1。
那么就是其实最终法定票数就是3。好,那你发现老师你不是说当我们集群中啊配置了法定票数是三的时候就可以避免脑列嘛。此时假如说它是master,那么它断开了,那么其他1233个节点。
那么这个不是满足了法定票数等于三这种情况了吗?其实啊你说的没错,那么所以说一般在出现这种情况下,就是master enable节点为偶数的时候,一般我们会。

啊,不是我们会啊,是这个ES,它会阉割掉其中一个节点的投票啊,就是选举资格,不是选举资格了,就是master enable这个资格,让它变成一个普通节点所以其实你配置为偶数,那么ES会阉割掉一个节点。
让它变成奇数。那么此时不管你发生了何种情况啊,比如说网络怎么断啊,这样断也好。这样段也好或者这样段也好。那么你集群中能满足法定票数的肯定只有一个网络分区。比如说我们有5个,那么你可以分成二和3。
你可以分成四和一。那么法定票数呢是三票,你不管怎么分啊,这种情况也好,这种情况肯定能保证仅仅有一个分区内满足法定票数,也就是说此时就不会呃产生多组的情况,比如说我们有7个节点,那么法定票数就是4。
因为过半的只能有一个嘛,你不管这个7怎么去拆分啊,六和一五和。重新来一下啊,比如说七可以分成6和15和呃5和24和33和4就一样了,对吧?你不管怎么分,满足法定票数4,那么只能有其中一个啊,六和一。
你可以分成呃,比如说五和2可以分成五和一和14和3可以分成四和二和一。你不管怎么去分满足法定票数的这个分区,只能有一个啊,就避免了脑列,明白了吧?OK所以说呃当我们呃在配置脑列的时候呢。
咱们只需要配置这个法定票数让它过半就可以了。这个N呢呃是我们当前啊当前的这个。


master enable的数量啊,比如说我们当前有5个master enable,那么我们配置这个参数为3就可以了啊,以上呢就是什么是脑列啊,关于什么是脑列问题的解答和如何避免脑列问题的解决方案。

系列 6:P167:@ComponentScan注解是干什么的? - 马士兵学堂 - BV1RY4y1Q7DL
它是来自于美团的一道面试题啊,然后呢是秋招的时候聊到的,然后说是什么呢?说是componment scanner这样的一个注解它到底是干嘛的这道面试题主要考察的是你对于spring源码的一个理解啊。
包括其实在spring boot当中,这个注解也有在出现。在哪里呢?其实这道题是在中级加开发工程师的时候会面到并不是说大家所谓的源码全是高级题目啊,有一些简单的内容其实在终级的时候就会考到啊。
对应的新资呢是15到20K。那么呃也相当于咱们美团或者阿里的一个P5的一个级别。而这个注解在哪里呢?其实我们可以去看到啊。
在我们的一个spring boot它的源码当中有一个注解叫做spring boot application这样的一个注解。而这个注解呢,我们可以点进去啊,点进去之后。
我们就会发现有这样的一系列的这样的一个注解。而其中就由咱们的一个compment scanner这样的一个注解。

而这个注解其实很多同学还是比较熟悉的啊,这个注解它无非就是指定咱们的一个扫描路径啊,被compment scanner所修饰的java类,如果你没有在它其中明确的指定我要去扫描。
比如说咱们的点马士斌这样的一个包。那么它去扫描的实际上是什么路径呢?它默认的扫描路径是当前的这样的一个java类所在路径,以及可能我还有其子路径,这都是被扫描的范围啊。而当前这个注解里面。
你可以看到有很多信息啊,这些信息其实都是你去定义的一些属性信息啊,一些属性信息。而如果说你想要比如说我单独的去扫描什么包,对吧?它并不在当前的一个路径下。那么这个时候呢。
你可以去比如说加上compment scanner。比如。我要去扫描什么呢?扫描咱们的com点demo这样的一个路径。那么这就可以了啊。实际上我们可以用这样的方式非常简单明了的。
然后呢去进行一个就是说书写啊。OK那么这是我们的complement scanner,而它可以用来定义定义什么东西呢?就是你到底要扫描,比如说哪个包啊,哪个类这样的一个。当然啊这里是重复了啊。
这里是重复了。OK那么这个时候同时如果你要扫描多个包,其实你可以使用逗号来进行一个区分啊。所以呢这是我们componment scanner的一个基本使用。所以这是在spring项目。
或者说在spring boot项目当中去定义我们的componment scanner这样的一个注解啊。OK。

系列 6:P168:@EnableAutoConfiguration注解是干什么的? - 马士兵学堂 - BV1RY4y1Q7DL
题呢是来自于美团的一道就是春招的题目啊,说是 to configuration解是干什么的。呃这道题目主要考察的是你对于 boot源码的一个理解啊。那么这道题呢会在面试终级开发工程师的时候会面到。

对应的薪资呢是15到20K。那么我们可以直接来看一下咱们的一个源码。而源码当中,其实我们会看到这样的一个spring boot application这样的一个注解。
它存在于spring boot项目的启动器当中。而此时我们可以直接点进去点进去了之后,我就发现了n able audio configuration这样的一个注解啊,而这个注解是干什么用的呢?
其实很多同学他会有疑问啊。他说老师这个注解我没见过,它是干嘛的。

实际上我们其实可以在非常多的这样子的一个spring的使用当中,我们可以看到enable开开头的这样的一个注解。什么注解呢?比如说大家经常看到的叫做enable catch。或者说还有一个注解啊。
我相信大家应该是不陌生的,叫做NAableNA。嗯 able schedule。C6的是SCHEDULED。🤧OK那么这两个注解呢其实也是以N开头的对吧?那么这两个注解什么意思呢?一个是开启缓存。
一个是开启定时任务,对吧?那么我们很显然就能够去得知啊,我们的N是干嘛的呢?它是开启某种功能的,开启什么功能呢?它是用来开启咱们的一个什么au to自动的意思。自动的一些配置。
实际上呢它就是开启自动装配的这样的一个核心注解啊,那么开启自动装配,其实它是非常重要的面试点之一啊,我们可以去看一下这个注解。N configuration点进去。

点进去之后呢,最上面的四个注解其实大家都知道啊,这四个注解是什么注解呢?这四个解注解其实是我们的一个原注解啊。
首先第一个注解它代表的是当前的我们的这样的一个注解用在什么地方然后呢可能的值在这样的一个枚举值pa直接O比如说我们的方法级别字段级别,包括我们的上下文级别loc本地参数级别等等啊,O其次呢。
第二个注解是用来干嘛的呢?第二个注解是在什么级别表保存该注解的信息,这个可选的值呢是在这个枚举当中,比如说我运行时保存对吧?在类编译时保存或者在源码编译时保存啊,O三个级别。
而再往下呢doment它是可以去干嘛呢?将其抽取成文档。而第四个注解呢是表示了这个注解允许子类继成副类中的注解,表示可传递性以及可继承性。
再往下就会有两个au to configuration package这样的一个注解,以及import这样的一个注解。很明显,import注解它是用来导入某一类东西的。
包括我们的out configuration package,它是用来干嘛的,听名字都知道自动的配置装配我们的包,对吧?那么点进去之后呢,我发现上面四个原注解,对吧?
其实它也是用来导入某一些类的这样的一个注解啊,说白了,其实我们的自动装配,就是为了导入某一些类,而这个import注解,其实呢又什么就衍生到了我们下一道的面试题啊,就是import到底有哪几种用法呢?
我们接下来看下一道面试题。


系列 6:P169:bootstrap.yml的意义 - 马士兵学堂 - BV1RY4y1Q7DL
是来自于阿里巴巴的一道7月份面试题啊,说是点mail它的意义是什么?因为我们都知道啊,在咱们的ring boot当中其实是有默认的配置文件的。
而默认配置文件是plication点或者点那么这道题主要考的是们配置文件的一个理解。而这道题呢在面试中高级 java开发工程的一个岗位当中会遇到然后呢对应的新资是15到25。
实际上呢给大家去一这个话题我们ring当中他默认支持的这样的一个属性文件其实有4种种呢点点叉其实我们ring当中可能有些同学用的比较少,但他确实是支持的包括我们的两种文件。
这个才是我们ring中默认支持的一个属性文件。而我们为什么还会有。




but strap点压mail或者but strap点pro文件呢,这是因为啊在我们的spring cloud的一个环境当中,其实呢它是作为spring boot启动之前的一个副文件。

所以这是我们的一个副容器副文件,它会优先启动先与我们的一个obplication点叉mail或者obplication点pros去进行启动。
而这个容器它可以在spring boot启动容器之前完成一些加载初始化的操作。比如说我要加载配置中心当中的信息。紧接着我再把配置中心的信息给加载进来啊,这是我们 drop点mail的含义,对吧?
它可以优先去进行这样的一个加载啊。OK这是我们这道题。




系列 6:P17:什么时候轻量级锁升级为重量级锁 - 马士兵学堂 - BV1RY4y1Q7DL
下面呢我们要聊整个升级的过程,这个时候你给我们到底是什么样的呢,有同学说老师这东西会有人问,没错,这个升级过程呢它并不会问的特别细,但是他基本上会问到你所有的概念,偏向锁是个什么东东,轻量级所有什么东。
什么情况下,自旋锁就是这种轻量级锁,自旋锁也叫自旋锁。

能够升级成重量级这件事情什么时候执行,好好听我说。

我们先了解概念,然后再了解它什么时候升级,一般来说我们new出一个对象来的时候。

首先优先上的这把锁叫做自旋锁啊,sorry,优先上把锁叫偏向锁啊,偏向锁啊,主要看看你们有没有有没有在认真听讲,最近我好像水逆各方面事儿都不顺,脑子总是晕晕的,我们先来理解啊,什么叫偏向所所谓上锁。
再理解一下,就是我们锁定这个锁,然后进去里面干事,ok这就是上锁的一个概念哈,所谓的上锁,上锁是一个什么概念,最基本的那叫偏向锁,偏向锁的意思就偏向第一个进去干事儿的县城,叫偏向他。
偏向锁的意思是这么来实现的,我们先来看它的具体实现,刚开始我开始扭出这个对象来的时候,他并没有上锁,我要给这个对象上锁的时候,优先上的第一个线程来的时候,优先给他上的是偏向锁。
偏向锁的意思是就是把自己的名字往上一贴,就可以啪叽往上一贴,诶,什么意思呢,比方说养乐多嗯,我看这个养乐多的厕所生意甚好,对啊,养乐多来了,想持有这把锁的话,他并不会去跟其他线程竞争,注意它没有所竞争。
这个过程,这是它效率高的原因,他只是把养乐多这三个字吧唧往厕所门上一贴,养乐多啪叽往上一贴,这把锁归我了,养了多进去干事儿,就是它其实偏向锁,不是一把锁,只是做了一个记录,啪叽往上一扔就可以了,ok。
这就是偏向的概念,有同学可能会说老师能专业点。

什么叫偏就往上一贴,好专业一点叫做看这图。

偏向所指的是当前线程,指针被记录在了mark word里面,这个线程来了,养的都来了,把自己这个线程的i d号啪叽往上一贴,贴上去贴成功了,这把锁归我好。

这个叫偏向锁的概念,我再强调一遍,偏向锁,严格来讲不是一把锁,它就是一个标志,这所归我了,有同学可能就会奇怪说,老师为什么会设计这么个东西啊,偏向锁它不是一把锁,就贴了个标志,为什么会有这么一个东西。
偏向锁,我们首先说第一点,它能够提高效率的点在于他不需要所竞争,只需要第一个线程来就给他直接上的偏向,所没有竞争,这个过程没有竞争的过程就少了同步,所以它的效率就会提升,这是第一点,第二点。
为什么要设计偏向锁,这个为什么为什么相对深入一些,为什么要设计偏向锁呢,设计偏向锁的原因在于,同学们,你们想想看,作为大多数的人来说,大多数的时间里头。
即便是你调用了带synchronized的这些方法,也往往只有一个线程在运行它,我再说一遍,这也是根据oracle的一个呃,这个这个这个这个工业级的一个调查吗,就说大多数人在调用同步方法的时候。
调用synchronized方法的时候,70%以上的情形,时间上都是只有一个线程在运行,比如说大家都知道那个vector这个类,hash table这个类,比如说像那个string buffer这个类。
大家都知道这些个类里面都有一些方法,它就是这些方法你就自带了synchronized,那么当你调这些方法的时候,往往其实大多数的时候只有一个线程在运行,那么同学们你们想想看,这百分之七八十的这个时间。
只有一个线程在运行,上了锁的这些方法,我真的有必要去参与竞争吗,我没有必要,如果我不设计这个偏向锁,就会发生一种什么情况,我只要看到synchronized,我就要去竞争,那这个效率显然就变低了。

这个理论来能get到的,老师扣个一,就没必要竞争了是吧,我只有一个人,多数情况下只有我一个人,那我干嘛要竞争,我就直接往上一贴就可以了,开局往上一贴都可以,这只归我了,当然如果这时候来了第二个人呢。
我第二个人是不是不能够说我也往上一贴啊,这是我们俩进去一块的同事,你坐半边,我坐半边,这肯定是不行的,好听我说,这个时候如果第二声来了怎么办,所升级升级为什么升级为轻量级,这个轻量级叫自旋锁,叫自旋锁。
ok这个自旋锁的意思就是大家伙一块抢,转着圈的抢,这什么意思呢,当然这里面有个小小的细节,比如说刚开始是养乐多,然后接下来呢养乐多是吧,哎他占有这把偏向锁啊,然后后来又来了一个张瑞。
后来了一个来了一个叫我看还有谁,腾讯嗯,后来又来了叫藤君的这哥俩来了,说哥们儿你不能独占,我也要干事,k我要抢,我要抢这把锁,好抢的时候怎么办,怎么抢,首先进行锁升级。
就是把这个养乐这仨字啪叽给我撕下来,先把它撕下来,撕下来之后,我们哥仨来竞争,当然这个时候竞争优先的还是养乐多持有啊,这个是一个小细节,我们先忽略它,大家记住学任何东西的时候,应该先学脉络和梗概。
再去抠里面的细节,所以我一般我会先给你介绍清楚,这些最基本的概念之后,我们再来聊这些概念里面的一些小小的细节,再聊,ok这个时候就已经不再是偏向锁了,这时候就已经变成自旋锁了,那自旋锁是一个竞争过程。
是一把竞争锁,怎么竞争啊,就是我们两个,你两个都在里边干事的时候,我张睿和唐军两个人提着裤子在旁边转圈,转一圈,我就问一下哥们儿,你张你那个养乐多,你出来了没有啊,你出来了没有啊,你出来了没有啊。
好你一旦出来了之后,我张睿和唐军看看我们哥俩谁能抢到,所谓的强调就是通过一个cs操作,想办法把自己的线程id往上贴,就这意思,好嘞,再来回顾一下这个概念,这个概念就是自旋锁的概念。
就是哎哥俩或者哥仨或者哥几个,随便的大家伙抢这个,抢着把所有操作用一个自旋的操作,我不需要通过操作系统来帮我调度,用一个自旋操作,接下来谁抢到了这把锁就算谁了,谁就进去干事去,ok这个是自选的概念。
就是看看谁能够把我自己的这个id号给贴上去,谁贴上去就算谁的,hello,同学们来能get到这点,同学来扣个一,可重入锁跟自旋锁两个概念,不是这个意思,这里面我相信大家会有好多好多的疑问,别着急。
我先把概念给你讲完,咱们再来聊聊这个疑问,那现在问题就在于好,这是自旋锁,我知道了,那自旋锁什么时候会升级成重量级锁呢,什么时候成重量级呢,自选组在某一些特定的状态下会生成重量级。
你首先要理解什么叫重量级,什么叫自选,这里头有好多好多的面试题,我们先了解重量级和自选的一个区别,其实我刚才已经讲过了,自旋是发生在用户空间的,他不需要经过操作系统对我线程的调度,那有同学可能会说。
老师这个操作系统线程的调度,它主要体现在哪些方面呢,所有同学认真听,一般来讲,只要你调用了什么weight方法,调用什么notify好,这一类的时候,它就已经进入到重量级状态了。
重量级状态是一个什么状态呢,这把锁,附着着一个队列,这个队列的专业叫法叫weight set,不管它叫什么,总而言之,这里面的线程都得给我进去排队,他不用抢,你给我排队,排好了,等着我操作系统调度。
你到你了,你给我出来,唐军,你给我出来到你了,养乐多,你给我出来到你了,ok这种操作一般是叫一个等待队列,我不知道大家发现区别了没有,等待队列,区别就在于一个线程过来的时候,如果是自旋锁的状态。
它会拎着裤子转圈,它不会进入等待队列,这叫盲等待,跟那不停的转圈转圈转圈,刀也没有刀,也没有刀,没有刀,没有抢,大家伙不排队进去抢好,第二个是进入等待队列,等着我背,等着我叫你。
它的最重要的区别在于自旋所消耗cpu资源,而重量,你所这部分线程在你等待的时候,不需要消耗cpu资源,再说一遍,自旋锁和重量级所最重要的区别,自旋锁在等待的时候消耗cpu。
而重量级所在等待的时候不消耗cpu,所以有一道面试题是这么问的。

看这道面试题,大家是不是能答得出来。

看这里自选组一定比重量级锁的效率高吗,往往有现在有好多人就这么问吗,他他就老老有一种这种说法,说我用j u c的新锁,就一定要比snronized的效率高,no不一定。
凡是说一定的百分之百的这一类的问题,他的回答的一定是不一定不会是百分百,没有绝对的东西,唯一绝对的事情就是没有绝对的东西,自旋锁,你同学们,你们呢大腿想一想,如果只有两三个人在这儿等着上厕所。
然后又赶上每个人都不是很便秘,执行的时间非常短,那我转两圈我就能进去干事了,转两圈,我另外一个人进去干事了,哎挺好very good,很好很好,我就能抢到,抢到时间片了,哎这个挺好的,效率很高。
可是同学们,你们想一下,假如有一个人问养乐多,特别便秘,养乐多没喝,今天结果便秘执行的时间非常长,然后在里边转圈,永远永远执行不完,甚至有阻塞操作,然后呢,旁边有1万个县城在旁边等着。
1万个人拎着裤子在旁边转圈,哈哈整个的cpu的完全消耗在转圈上了,完全消耗在线能切换上了,切换过来之后,我发现我靠还是不行,还没那么多锁,所以这个效率显然很低很低,咱们在这种状态下,你应该进入重量级所。
好这道题是不是解释清楚,好那同学们接下来我们来想想看啊,有一个当然细节上的东西,这种题呢现在问的越来越少了,就是这种细节呢你听过就知道了,没听过就不知道,所以这个就没啥意思,体现不出水平来。
有时候他问原理是能体现出水平,你能你能够了解底层的原理的实现,像这种时候呢就能知道你的理论水平,但是像有一些特别细节的,你比如说自选所什么时候升重量级,四选组啥时候升中了,你组什么时候啊。
像这种的实现呢就特别无聊,我就告诉你,直接告诉你结论就行了,在这里面呢它中间有一个优化过程,看这里。

就是我的自选组也要称量,你所什么时候射中了女所呢。

听我说这个呢。

如果这么体贴的人,我当然给你记录下来了,原来的1。6之前,jdk一点六之前叫有线程超过十次,自选转圈转了十次都轮不上他,你懂吗,就大家伙竞争太激烈了,有有哥们儿转圈转了十次都轮不上呢。
那说明好多好多线程在竞争了好,这个时候麻烦进入重量级或者自旋的线程数,超过cpu合适的一半,如果有八核,有四个线程在这等着哎,进入重量级,当然这些细节叫j v m的调优。
jm调优你可以参考的参数有700多个,所以为什么这vm调优比较值钱,那是另外另外一门课,我们先不去管它,不过很幸运的是,目前这种参数不需要你调整了,因为1。6之后加入了自适应自旋。
叫adaptive self spinning,adjective,自适用的self spinning,自适应自旋,adaptive self spinning,我可以动态调整jm自己来控制jvm。
来决定有多少个线程跟他转了多少圈,我会升级成重量级锁,这个事不需要你去操作了。

ok这是自旋锁,什么时候升重量级锁,这个过程不知道大家get到了没,来get到的,给老师扣个一好。

这几个概念我相信我解释清楚,我们一会儿再来看这些细节,new出来的时候,一个普通对象,然后或者匿名偏向一会我们讲,然后优先会上偏向偏向左,第一个线程上偏向锁,接下来如果有轻度竞争的话,上轻量级。
如果有重度竞争,就直接干成重量级锁,轻量级和重量级的区别,自旋锁清重量级所区别,刚才我好好的已经讲完了,面试的时候你应该能说得出来了。

锁升级是通过什么实践的,陈雅兄大哥,你如果这个过程的话。

其实我笔记里给你写了。

在这个过程特别琐碎和琐碎,和那个那个那个那个那个复杂。

我还是那句话,因为大多数的同学呢他的基础不具备。

所以呢呃如果你你你自己水平比较高。

我建议你读什么呢,读这个方法叫interpreter,run time monitor enter方法,这个呢是那个hospital里面的模板类的实现,模板解释器的一个实现啊。
interpret runtime monitor enter方法,这里面有一个详细的锁升级的过程,这个锁升级过程呢基本上体现在两个方法里面,一个方法叫fast enter。
这个方法呢是快速的自旋的这样一个实现,还有一个方法叫slow enter,slow enter,是重量级的底层的操作系统级别的一个实现,所以呃像呃这类内容,你可以去读这个里面呢解释的非常的清楚。
什么情况下他会有自选,什么情况下会有偏向,是这么一个过程,如果我想详细讲的话,你看啊,if如果是说有自旋的情况,看这里,use best locking,这叫偏向锁吗,biased locking。
best叫偏向的意思,如果使用了偏向锁,你应该进入fenter,如果没使用偏向锁,进入进入slow enter等等,去读这个过程,这个过程在这我就不详细解释了。

好大家看这里。

呃还能跟上吗,能跟上的,给老师扣个一来。

系列 6:P170:Import注解的三种用法 - 马士兵学堂 - BV1RY4y1Q7DL
下来呢给大家讲解一下来自于腾讯的一道面试题啊,说是呃咱们inport注解的一个三种用法,可以给我简单聊一聊吗?呃,这道题其实考察的是你对于spring boot的一个源码的理解。
因为如果你对于spring boot有一定的了解,你就会发现在spring boot的原码当中,其实也有用到inport注解的两种方式。

那么这个时候呢,我们就开始正式来进行一个学习。首先咱们的一个inport的注解呢。它在哪里出现的呢?给大家看一下啊,它是在咱们的ableau configuration注解。
也就是说我从这个什么我从这个启动器对吧?走进来之后我就会发现nable configuration注解,再点进去就会有这样的一个import注解啊,而这个import注解。
大家可以看到里面是一个au configuration input select,这样的一个类,那么很很明显就是我的一个import注解,它去就是说导入不同的类是会有不同的一个区分的。
首先最简单的方式是什么呢?最简单的方式就是相当于比如说我想要去注入某一个类啊,那么这个时候我直接就import注解。然后比如说这是我们的一个java并,我直接想注入catch,对吧?
那么catch点class,或者说我想注入person person点 class。OK或者说咱们还需要去注入多个personus,好吧。电脑大小写没开吗?Useer。OK user点class。
那么通过这样的方式了之后呢,我就不需要再用病注解去进行一个注入。那么这个时候我可以把这个病注解给稍微的注掉啊,我可以把它给注掉。那么这个时候我们直接去运行。很明显大家看到的结果对不对?
这是我们去使用inport注解的第一种方式啊,这种方式叫做静态注入。

这种方式呢相对来说灵活性会比较差一些。所以呢一般来说是不会推荐这样的一个方式的。包括如果我们要注入的对象很多,比如说我要注入十几个这样的对象,那么这个时候我是不是后面会给你很长的一挂。
所以这样会有局限性,所以我们的inport注解,还有第二种使用方式。第二种使用方式是怎么样子呢?第二种使用方式,首先我们要去创建这样的一个java配置类啊,而创建了java配置类之后呢。
我们需要去创建一个自己写的类,而我们在自己写的类当中会去实现inport select这样的一个接口。此时它会让我们去实现一个select import的一个方法。而在这个方法当中,我们需要去干嘛呢?
去将自己的一个需要加载类的名字给返回。其实此时我们在jafi当中去导入当前我自己去写的这样的一个类,比如说my import select,此时我们就会去发现一件事情啊。

事情呢就是我们此时其实会干嘛呢?会注入的是当前这个类的它的一个类型的返回值啊。OK而我当前返回的是我们的名字的权限定名,对吧?所以它在这里就显示了我们的权限定名啊。而通过这样的方式。
我们可以很简单的在我们的select的 input当中去添加进入一些,比如说我们自定义的一些方法,对吧?比如说添加一个判断逻辑ifOK那么除此之外呢,这是我们的第二种方式啊,第二种方式。
那么我们写一下啊。

第二种方式是添加了呃呃实现了我们的。

什么嗯,看一下import select接口。

并且呃实现了。Select import方法。ok。那么我们的返回值。

就是。

select import的方法的返回类型。OK这第二种方式啊。那么第三种方式呢,实际上是我们需要去干嘛呢?我们需要去实现import definition啊,这样的一个就是说接口。
那么这个import definition啊,它很明显是一个注册器,对吧?所以说我们需要去实现的方法是re definition,它会有一个注册器的存在,而这个注册器是用来干什么呢?注册器。
我可以在里面去做任何的一些操作,就相当于它跟第二种方法的区别是什么?它跟第二种方法的区别,就是当我如果去实现的方法,它可以去实现这样的一个注册器的话,那么我可以手动的去干嘛手动的去进行一个注册操作。
所以它就相当于你去银行取钱,这个是自动取款机,而这个呢是手动的方式啊,手动的方。




所以这就是他们两个之间的一个区别。所以这里是实现了。Iport bin definition re接口。

并且实现了什么方法呢?实现了咱们的一个region定 definitionfin方法。

O。那么这个时候我们可以。自行封装并 definitionfin。同样也可以达到我们的一个效果啊,这是我们的一个inport注解的一个三种方法啊,三种使用方法。O写的完全一点,三种使用方法。
那么在这三种使用方法的情况下面,很明显咱们的源码当中会使用到这三种方法,对吧?那么这个时候通过它不同的一个体现,我可以把灵活度去进行灵活的一个调整,包括我们的一个使用权限,有注册器的跟没注册器的。
我都能够去进行一个实现,对吧?所以它相对来说会比较灵灵活一些啊,OK而它呢inport注解,它实际不是业务开发所需要使用到的一个注解。而是你在写组件或者选源码当中,你会去使用到了这样的一个注解啊OK。

系列 6:P171:RequestMapping 和 GetMapping 的不同之处在哪里? - 马士兵学堂 - BV1RY4y1Q7DL
这道题呢是来自于阿里的一套6月份的面试题啊,说是request mapping和get mapping它的不同之处在哪里呢?这道题主要考察的是什么呢?是考察的在就是说你对于注解的一个了解啊。
对于注解的一个了解,而这道题呢在面试高级加开发工程师的时候会问到对应的薪资呢大概是在25到30K之间。然后呢,这道题我们来看一下。
首先第一个re mapping跟get mapping它的不同之处在哪里呢?首先我们知道啊request mapping它是加在类上的,所以它是具有类属性的。你加上request mapping之后。
其实它是笼统的去进行一个描述,它可以有get post put或者说其他的注释当中具有的一个请求方法。而get mapping呢它是在你的一个方法上面去进行一个修饰的。
而get mapping实际上它只是去标注你当前的请求,我精确到了get方法。所以呢它仅仅只是request。

的一个衍生,目的是为了提高你的一个什么项目的清晰度。也就是说,当你看到get mapping的时候,你就知道哦,这是一个get方法。你看到post mapping同理啊,你看到post mapping。
你就应该知道哦,这是一个post的方法okK。

系列 6:P172:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? - 马士兵学堂 - BV1RY4y1Q7DL
是来自于阿里的一道面试题啊。然后呢首先第一个它它题目是什么呢?是spring boot它的核心注解是哪个?然后呢,主要由哪几个注解去组成。而这道题主要考察的是什么呢?
主要考察的是你对于spring boot源码的一个理解啊。对应的一个就是薪资范围是15K到20K的一个区间。然后岗位呢是终极java开发工程师。
那么各位同学首先我们要考虑清楚它有哪几个就是它的核心注解是哪哪几个,我们来看一下啊,它的核心注解实际上是我们的spring boot application注解,这也是它启动器上面唯一一个注解啊。
O同时它是spring boot的核心注解。而这个注解呢,其实它一共包含了7个注解。但这7个注解当中有4个注解,是原注解。所以意味着它的核心注解,只有3个。那么这三个核心注解。
首先是spring boot configurationration。实际上我们听名字也能够去讲到spring boot。configuration实际上它肯定是封装了configuration注解的。
而configuration是实现当前内为配置类的这样的一个注解。也就是说实现了配置文件的一个功能。还有第二个注解呢是enable auto configurationration注解。
它打开了自动装配的这样的一个功能。同时呢它也可以去干嘛关闭某个自动配置的一个选项。同时请各位注意啊,它里面核心的起作用的注解叫import注解啊,O比如我要关闭某个数据源。
那么我就spring boot application,我直接去排除掉我们的da source configuration。最后呢是一个compcompment scanner这样的一个注解。
它是扫描注解啊。如果说我们没有做任何的配置,那么它会扫描当前类以及其子类,但是如果当我配置了之后,它就会去扫描配置相关的。比如说我在这里我直接加个括号com点码士兵。
那么这个时候它就会去扫描com点码士兵下面的一个东西啊。


那么这是我们的spring boot的一个核心注解。
系列 6:P173:Spring Boot 可以兼容老 Spring 项目吗,如何做? - 马士兵学堂 - BV1RY4y1Q7DL
听呢是来自于阿里巴巴的一套面试题啊。而这个面试题呢,它说的是spring boot,可以兼容老的spring项目吗?其实这个题是考察你什么点呢?它是考察你有没有做过一个新老项目的一个切换。
或者说有没有去做过一个新老项目去兼容我们新技术的这样的一个事情啊,那么。这道题呢对应的是中级 ja开发工程师。也就是说其实它是在业务层面的。而这道题呢对应的薪资是15到20K。也就是说其实你到这个薪资。
你就应该会做这样的一件事情了啊。那么呃在这里啊其实这道题它是很简单,你只要把它的关键核心点说出来就可以了。首先第一个spring boot可以兼容老的spring mVC或者spring的项目吗?
是可以的,对吧?你要回答可以,那么需要怎么样呢?你可以用import resource注解来导入老的一个spring的一个项目的配置文件。这样的话我们就可以新老项目兼容,并且呢你也可以1。1。
1点的去替换你的一个老的项目。这样的话,它兼容性的问题就不会就是说出现,同时呢包括有一些我们的一个新老项目或者新老版本的一个切换。大家可以就是说去使用一些比如说蓝绿部署啊,灰度发布啊。
类似于这样的一些策略。其实它都是可以做的啊,它都是可以做的。





没有说哪个项目升级了之后完全跟老的项目不兼容。这样的项目一般来说是不会长久的啊。比如说你发个新版本,老版本的东西全部用不了了,这肯定是就是说不行的对吧?

系列 6:P174:Spring Boot 如何定义多套不同环境配置? - 马士兵学堂 - BV1RY4y1Q7DL
来自于一个阿里比较基础的题目啊,是spring boot如何定义多套不同环境的一个配置呢?这道题目主要考察的是什么?主要考察的是对于各位程序员,你真正的一个开发经验。
包括你如何去定义不同的环境的一个配置。这个一般是什么呢?这个一般是由高工去完成的。但是呢呃对照出工啊,或者说对照中级工程师,我们最起码看着别人,对吧?没见过没见过没没吃过猪肉,还没见过猪跑过嘛,对吧?
所以呢这个东西也是我们需要去掌握的,它对应的岗位呢是中级java开发工程师对应的薪资呢是15到20K。那么接下来呢我们就去看一下啊,首先第一个首先我们是知道的啊,咱们的环境我们一般情况下。
比如说他一定是基于pro的一个配置文件,或者说基于mail的一个配置文件。而此时呢就会有一个问题,什么问题呢?我是需要开发出多套的一个环境的配置。让他用以适应比如说。

像我们的开发环境,developer测试环境test以及我们的生产环境productduct,或者说像有一些公司比较有条件的,可能还会有UAT的一个环境。
那么首先我就要去给对应的这样的一个环境的配置文件,去加上它的一个后缀啊,加上了后缀之后呢,接下来第二步,我需要去干嘛呢?
需要在我们的applicationpro文件当中去指定当前有个属性叫做spring点pre点active一个激活的标识位,我要把它对应的一个文件给写进去。
比如说develop我就把developer给写进去product,我就把product写进去。这个时候我们读取的就是对应环境的一个配置文件啊。
也就是说你只需要去改到application点pro去加一个属性就O了。而如果你需要基于压mail的配置,那只需要干嘛呢?一个application点压mail就不需要plication点pro。
所以呢一般情况下像我们的sring boot是推荐mail的一个方式的,而不是推荐我们的pro的这样的一个方式啊O这是我们的这道题。


系列 6:P175:Spring Boot 需要独立的容器运行吗? - 马士兵学堂 - BV1RY4y1Q7DL
是来自于阿里巴巴的一道面试题啊,是阿里巴巴秋招的一道面试题说sring boot需要独立的容器来运行吗?而面这个面试题其实考察的是什么呢?是你对于sring boot内嵌容器的一个理解啊。
对应的岗位是中级java开发工程师薪资是15到20K这样的一个范畴啊,那么这道题呢,首先它关注的是什么东西呢?首先关注的是你明不明白就是说sring boot它是有内嵌容器的。
那么呢首先我们可以来看一下,我们是不需要独立的容器去进行运行的。首先第一个它内置了tca等等相关的一些容器。可以让你比如说在我们的一个编译器当中就去进行一个代码的运行。而tca呢可以让你直接打成架包。
然后呢使用我们内嵌的tca去进行运行。实际上内嵌的ca啊,它的本质跟我们的就是它的之前用外嵌的ca一样啊。






他也是通过一个s对象调用serv对象的一个star方法来去启动我们tca的区别是什么呢?我初始化呃,我们的一个服务的过程当中,我不需要像以前对吧?使用容器的时候去初始化我们的serv点叉文件了。
我各种get就能直接去完成我的初始化。这是我们spring boot内嵌容器比较核心的一点啊,O。





系列 6:P176:Spring Boot 有哪几种读取配置的方式 - 马士兵学堂 - BV1RY4y1Q7DL
下面这道题呢是来自于阿里的一道面试题啊。然后呢这道面试题叫做spring boot有哪几种读取配置的方式呢?那么这道题呢对应的是终极java开发工程师的一个岗位,新资呢是15到20K。这道题并不难啊。
它主要考核的是什么呢?是你对于spring boot配置的一个理解啊,并且一般情况下,我们要去干嘛呢?要去把每个配置在哪几种情况下使用,把它给描出来。
首先spring boot默认的配置文件有两种格式啊,obplication点pro以及obplication点mail两种格式查找的顺序呢是优先proice其次是mail啊。
那么这个时候呢我们第一种方式是pro source。而这个注解呢是用于指定资源的一个读取的位置它不仅能读pro也能读叉mail,并且我们能通过mail的一个解析器配合自定义的pro factory啊。
pro呃呃proty source。

factorory实现解析压mail文件。OK这第一种方式啊,它是用于指定资源的一个解析的。第二个呢叫做valuevalue注解应该大家用的比较多啊,这种方式呢适用于对象。
我比如说我某个某个对象参数比较少,我可以直接在对象的属性上使用values,然后呢以doner括号的形式传入配置文件中对应的属性值,同时呢我还要声明当前类为配置类。ok。


第三种呢叫做environment注解。 environmentvironment实际上它是thringcur包中的一个读取配置文件的类。而我这个类,如果我一旦使用ult word注入类。
或者说我使用resource啊去注入类就可以使得它的get这样的一个方法来获取某个配置项的值,这是我们的一个呃叫做环境的一个注解啊,第四种呢是configuration properties。
而使用这种方式呢去读取配置文件的话,一般比如说这种是对象参数比较少,而这种呢就是对象参数偏多的情况下面,我们会推荐使用configuration properties。
它不需要你在每个字段上我都加上values这样的一个注解,而是我只需要去加上configuration properties来注解声明当前类为配置读取类就可以了啊。
比如说类似于我preitq就表示我当前读取前缀为raitq的所有的这样的一个属性啊,一般。






情况下就是这四种就OK了啊。所以你只要聊出来这四种,并且把这四种每一种的应用场景给聊出来,基本上就没问题了。这是sring boot有哪几种读取配置的一个方式的这样的一个面试题。

系列 6:P177:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个? - 马士兵学堂 - BV1RY4y1Q7DL
来自于艾9月份的一道面试题啊,spring boot支持哪些日志框架推荐和默认的日志框架到底是哪一个呢?而这道题呢主要考察的是你对于日志框架的一个理解啊。
那么呃我们这道题呢是针对于中级java开发工程师的这样的一个岗位,对应的薪资呢是15到20K这样的一个区间,所以我们来看一下。
首先第一个spring boot它是支持java YouTube当中的一个log的。就相当于比如说你平时在那当中写就是说把日志打log,实际上用的就是这个log啊。
同时它还支持log for j two这样的一个框架以及log back作为我们的日志框架。如果你使用star作为启动器的话,那spring boot将默认使用log back作为默认的日志框架。
这所以如果当你需要引入到这样的一些日志框架的时候,你需要把这个log back得给排除掉,不然的话会冲突的啊。那么这是。






我们这道题。
系列 6:P178:Spring Boot、Spring MVC 和 Spring 有什么区别? - 马士兵学堂 - BV1RY4y1Q7DL
这是一道来自于阿里的一个9月份的面试题啊。然后呢这道面试题嗯题目是spring bootring mVC跟spring有什么区别?
这道题呢所对应的一个岗位是中高级java开发工程师对应的薪资呢是15到25K而这个区别,其实很多同学啊它也会有一个疑问。他说老师spring boot跟ring mVC到底有怎样的一个区别。
所以我们来看一看啊,首先我们来聊spring它最重要的一个特征是什么呢?是依赖注入,包括所有的thring model不是依赖注入,就是IOC的一个控制反转。
所以其实我们都知道spring的特性ICLPDI对吧?这是它的三大特性啊,当我们恰当的使用DI或者IOC的时候,其实我们可以开发松耦合的一个应用,松耦合的单元测试可以很容易的去进行一个进行,对吧?
而MVC呢它则是另外一种方式,它可以通过一些工具像什么。dispatch或者说model and view或者view resolve这样的一些概念。然后呢来提供一种分离式的开发,来开发我们的we应用。
使得开发外应用呢会变得非常的简单。而spring跟spring mVC它有一个问题啊,什么问题呢?就是我所有的一个并或者说我所有的一些配置,它都会需要有大量的一些参数。
比如说我要提供它的属性n and tape,包括我要提供当前的一个值是什么,对吧?我才能去进行。那么这个时候呢,我们spring boot,它就干的一件事情,什么事情呢?
它通过了一个自动配置的方式来解决这个问题,我把你预先要加载的内容,我先加到我们的内存当中去。


那么这是为了更快的去构建应用,就相当于什么呢?就相当于。

反正我每个病是不是我都要去进行一个A操作B操作C操作,那我干嘛不直接在内存当中把我这些操作给干了呢?对吧?所以这是它更快能够更快的构建应用的一个原因。
包括也会有一个非常就是说好的名词啊来形容它叫做约定优于配置,或者约定大于配置,我提前帮你干了,是高过于你自己配置的,是这个意是这个意思啊,所以spring boot提供了一些非功能性的特征。
包括像什么readies啊MQ啊,我们都可以通过spring boot的一个候选配置condition来进行一个集成啊,O这是spring boot跟spring mVC还有spring的一个区别。




系列 6:P179:SpringBoot 中的监视器是什么呢 - 马士兵学堂 - BV1RY4y1Q7DL
这是一道来自于阿里6月份的一道面试题啊,说是spring boot中它的一个监视器是什么呢?OK这道题主要考察的是你对于spring boot的它的一个监听器,它的监视器的一个就是理解啊。
这道面试题在面试高级java开发工程师的时候会问到。然后呢对应的薪资区间是25K到40K这样的一个区间。那么我们来看一下,首先spring boot当中监听器它是监视器,它是什么呢?
而我们的监视器是spring boot。

然后呢它是spring启动框架当中重要的一个功能之一,因为它是可以去完成你全程的一个监视的啊。spring boot的监视器可以帮你访问到生产环境中正在运行的应用程序的当前状态。
也就是说可以帮你实时监听。而且有几个指标必须在生产环境中进行检查和监控的情况下,你就可以使用到我们的一个呃我们的这样的一个监视器啊。而且如果有一些外部应用。
可能正在使用这些服务的一个呃像相关人员触发警报信息,啥意思啊?就是假设我有一些第三方的一个程序。而这个第三方的程序很可能就是实现了我们的一个thring boot的监视器来实现的监听我们的应用程序。
所以说这个时候如果你没有开放这样的一个接口,它是没有办法监控的啊,并且监视器的一个模块公开了一组可以作为HTTPURL访问的res的端点来检查当前每个节点的一个状态。啥意思呢?












就是其实我对外还是做了一个实现。虽然说我没有说出一个第三方的诚新的组件,但是我是对外做了一套URL的。所以你只需要比如说访问我这套URL就可以实时的来检查我当前spring boot应用的一个状态。

系列 6:P18:偏向锁 - 马士兵学堂 - BV1RY4y1Q7DL
下面我来解释偏向锁这个东西啊,轻度竞争就是来两个线程就叫轻度竞争,重度竞争就是刚才我所说的那个超过jvm,自己控制,就是那个adaptive programming,好看这里,那么这个偏向所有同学说。
老师我没有观察到偏向锁呀,你看刚才这个时间对比我们刚才那个小程序,这小程序我一上锁,直接上的就是轻量级锁,我没有看到偏向锁的状态啊,原因是什么,原因是偏向锁的启动有一个启动时延,这是啥意思呢。
就是当我们看到这张图的时候,这张图这张图啊,如果一个普通的对象,在你偏向锁没有启动的时候,会直接进入自旋锁,他不会说中间有个偏向锁过程,那什么时候才能看到这个偏向锁呢,看这里啊。
这个偏向锁呢呃它默认是有一个启动的时延,启动食盐时间延长有啥意思呢,就是我这个jm启动之后,过多少秒钟之后,偏向锁机制才会启动,这个是如果你想观察到偏要素的机制非常简单。
默认的这个值是四秒以后启动偏向锁,所以如果说你想观察到偏向座,你让他上来先睡五秒钟,你在new object的时候再new再给上锁的时候,你就观察到这把偏向锁了,试验一下好吧,预热对考一下。
这里面隐藏了一个比较深的面试题,嗯看这里对比,看到了吗,这是我们刚刚new了一个对普通对象的时候,偏向锁一旦启动之后,new出来的普通对象就是101,还记得吗,我们偏左没启动的时候是001对吧。
然后偏向组的状态101,这是101啊,那有同学会说我你有一个普通对象没加锁,为什么也是101呢,ok这种状态叫匿名现象,偏向锁已启动,只要偏向锁一旦启动之后,你new出来的对象那都叫做匿名偏向。
就是匿名偏向的意思是我还没有偏向谁,但是我已经是偏向锁状态了,所以刚才有同学说,问我,那个详细的说底层偏要素到底怎么实现的呀,其实很简单,上来一看你是一个匿名偏向状态,那我就直接给你上偏向锁。
我就不会给你上轻量级所,就这么实现了一个简单的判断而已,有这么难想象吗,好了,任何对象都是匿名的,对一旦启动偏锁机制之后,当你new出来的普通对象默认就是匿名偏向状态,前面老师,你卡了都卡了吗。
刚才没听到,what,其他人呢,我还在吗,am i still here,没看没卡啊,ok刷新一下刷新就好啊,卡了的话刷新就好,ok,好那现在问题就来了,这里面有两个隐藏问题。
第一个问题是他为什么要延时,当然延时你是可以通过参数来控制的啊,各位大哥不要太看重这玩意儿,因为这个参数你可能记不住,没有关系,你知道去哪查就可以,百度1搜也能搜得出来。
听我说这个延时呢是通过这个参数来进行控制,叫vlotus jdelay,读一下biased偏向的locking锁,start up,启动delay,延时偏向锁启动延时默认是四秒,你可以给它改成零。
那么在这种情况下呃,整个dvm虚拟机一启动就会启,动前要做the best locking jdelay,bias the locking start of the belk,这个值呢你能去控制它。
它默认是有个四秒延迟,第一个问题是为什么要有这四秒延迟,第二个问题是,偏向锁的效率是不是一定比自旋锁效率高,我刚才说过,像这种一定还是什么各种乱七八糟的问题,我跟你说,回答的答案一定是不一定。
唯一一定的事情就是不一定打开偏向锁,效率一定是否会提升,偏向锁为什么要延迟这四秒,本质上是一个概念,下面听我讲,第一点打开偏向锁,效率是不是一定会提升,肯定是不一定,关键的点在于为什么y,刷新啊。
卡了卡了之后啊,各位小同学,你们卡了之后刷新一下好吗,刷新就好了,ok现在可以了吗,我可以继续了吗,可以继续给老师扣一,今天要讲速度比较慢,主要原因有一些那个小伙伴基础稍弱一些,这也很正常啊。
我不可能照顾到每个人的速度来这听课的,有可能是大学水平,我照顾的是初中高中的水平好吧,所以各位自己对应什么水平,不要要求老师只对你一个人讲,这个肯定是不合适的啊,大家看这里打开片子的效率一定会提升。
为什么,肯定是不一定,为什么,原因是什么,原因在于同学们,你们想想看,偏向所的最底层的机制叫做没有竞争,没有定妆,我上来二话不说就把自己往上贴,那我想问他一句,假如我明确知道。
我非常明确的知道一定会有竞争,好多县城一定会参与竞争,那我这个时候还有必要启动偏向锁吗,我启动了偏向锁,是不是得有所撤销的这个过程啊,我得把偏向锁那个那个那个人名想的多,给他撕下来。
这个过程他不需要消耗资源吗,肯定也需要我明确知道一定会有竞争,我干嘛还要启动这把偏向锁,我显然就没有这个必要了,所以在jvm启动的时候延迟四秒,原因是什么,原因是jvm的启动过程一定会有所竞争。
为什么最简单的jvm启动会有启动,好多好多好多线程,如果你用jdk观察过的话,你启动任何一个虚拟机,只执行一个main线程,它里面都有十好几个线程在里面运行着,所以最简单的好多线程都要往空间里头分配对。
象,分配对象的时候要不要锁竞争这个竞,竞争这个位置啊,分配到哪个位置上了,轮到我了吗等等,所以jvm启动过程一定会有所竞争,因此我就没有必要启动这把偏向锁,等jm启动完之后,我再启动线下锁就可以了。
现在其实有的最新的java的jsr,他们已经在探讨,要不要把这个偏向所给它取消掉,好像效率上没有显著提升,那四秒就启动完了,四秒只是一个可以设置的值,你如果你们家机器超级牛叉,你完全可以一秒钟。
你机器超级不牛叉,你写4万秒有有关系吗,所以这东西你还用问吗,你说问这么初级的问题,好意思吗,好了,呃这个刚才能get到这点,同学老师扣个一来,祭司饿了是吧,持有那把锁啊,这不是有一把锁吗。
没想到讲这个东西能把你讲饿了,这个品味有点重啊,好开个玩笑啊,嗯那第二个第二个第二个问题是,就是这个为什么要启动这四名,其实就很简单了啊,就搞定了,呃当然我看刚才有同学问一些特别详细的问题。
就是老师他里面记录的不是线程id,而是lock record索记录啊,没错老师这个锁的重录又是一个什么概念,到底是怎么实现的,这里面呢其实笔记里面全有,但是呢到讲到现在为止。
觉得最基本的概念已经给大家解释清楚,如果每一个细节都要扣到的话,没有四个小时肯定是不行的,不可能的好吧,有一些东西呢我就放在嗯整个的这个笔记里面,然后你自己拿去钻研好吧,呃当然我们vip课程里头讲的。
实际上是非常非常详细的啊,节目相锁撤销啊,然后那个从天降啊,基本上都给大家讲到呃,像那个锁重入啊,呃sychronized的最底层一个实现呀,都给大家讲到啊,所消除啊,所所降级啊,所粗化。
所所细化超线程到底是什么等等,当然我觉得我们的课程呢这么说,如果我们课程在整个培训界,我们我们要说自己排第二的话,估计应该没有人没有人敢说排第一,一个是老师比较牛逼,我给你介绍过了,大厂的老师。
在咱们这全有ba提高的老师,你随便去哪个培训机构问问没有,这第一个第二一个呢,其实课程我今天不太想给大家详细介绍,我们的那个那个课程,如果有时间,明天我可以介绍一下嗯,最主要的一个看疗效还是这句话啊。
现在我们7月份已经开始了,一个叫金九银十的涨薪养成计划,9月份10月份马上就到来,我们课程有一个很重要的点,就是大概两三个月就让你涨薪,像这种东西呢,这是我们自己自己自己内部的一个简历指导群。
这是昨天晚上刚刚有小伙伴告诉我的,说课程牛不牛,我觉得值不值的呢,主要看疗效好吧,这是昨天小伙伴刚刚跟我说的,我就觉得特别高兴,每天都会收到这样的消息,就觉得她美美的开开,开开心心的给大家提供的服务啊。
觉得是很值当的,得到工作吧,一直没告诉我对,有好多小伙伴找到工作之后就懒得跟我们说了,就是他拿把药拿走,然后自己自己自己有了疗效了,然后接下来呢就不会跟我们说说,这药药挺好的,但其实到现在为止。
基本上我们听完我们课程的听一个呃,按照我们的按照我们的学习学习学习路线,听完我们课程的涨薪这件事就超级简单,进大厂相对难,但有我也能给你指出一条路线来,所以课程最重要的解决的点在于第一个涨薪。
第二个保持竞争力,保持竞争力的意思就是你可能好长时间在那里,温水煮青蛙,没有参与过什么面试啊,没有参与过什么这种跳槽啊等等,没有参与过,你不知道现在的跳槽,跳槽面试都已经到什么深度了啊。
或者你到一定年龄,你自己呢感觉也不需要什么进步了,其实这件事是很危险的,这个疫情完了之后呢,有好多那种降维打击的,原来一线的好多呃人被裁员了,回到二线去打,你原来那个那个那个那个呃。
像是那个在大厂里头工作的很好的哈,回到小厂去打你,所以你自己不进步,你这个竞争力肯定会慢慢的会弱化呃,第三一个叫进大厂这件事,我们百分百保障,就是听完我们课,涨薪这件事非常轻松,保持竞争力完全没问题。
进大厂相对难,这是一个技术活儿,不仅仅需要那个你的技术水平到了,而且还需要我们各种各样的比较好的一个服务,呃,这件事呢,原来也是有好多好多人呢,已经取到这个疗效了啊,也就是刚才那个什么状态。
有好多好多事呢,好多好多人已经已经有这个疗效了,大家感兴趣的话,可以看看我们的就业的案例,六这是那个面,六六点过了4。3。5,两个14,就是刚才那小伙,刚刚那小伙儿啊,嗯当然还有一些其他的。
只听这班郭建成收获两个offer啊,我就不一一给大家展现了,如果大家伙有这个需求,那今天技术的内容我就讲了,我就讲到这里,那么我看同学们有没有什么一些相关的问题呢。
不管技术问题还是其他问题都可以找老师问啊,先聊聊天好吧,剩下一点点时间,今天十点,明天我们依然是八点开始,明天我们讲什么内容,先说一下,今天讲的内容大家感觉还有收获吗,怎么这么低,才14k。
你说的很对啊,第一他4月8号报名时间很短,时间很短。

就是每个人不同情况不一样,嗯你说的对。

你看啊,我们是0408,是这小伙做的做的做的简历的面试辅导,所以8号报的名,然后大概是不到6月份,注意啊,那个值钱薪资,看之前薪资,你看了他之前薪资,还觉得14k那个什么吗,还觉得14k低吗,啊。
进大厂的话,需要你全系列的努力才可以,就是技术底层外加算法,如果你是社招生,还要加项目架构,明天我们接着说,明天讲什么好吧,有点用呢,是留是有两天的时间啊,明天我们讲什么,明天我们讲这些内容。
我们高新养成计划的第二天主要讲这些内容,这是一道最近刚刚在阿里这边面试的时候,一道面试题,这道题呢需要通过线程池来实现,明天我们主要讲这些内容啊,相持牵扯内容太多,我可能明天会稍微略讲一下。
我们主要讲的内容呢,是另外一个各种底层的东西,现在主要问太多,而且只要你答出来薪水就蛮高,只要你答出来薪水就蛮高,这个东西值得给大家,你值得拥有嗯,tr你是vip学院,直接问林老师,因为你们记录的话。
那要看你存在哪里,是存redis存储系统,问一下林老师啊,直接问就可以,为什么a q i n c s加volatile,去看源码就知道了,他的那个stay那个值是volatile的。
他对于队列的管理是cs的,所以它叫做cs加volatile,丁程云,今天给面过了,阿里的外包可以进吗,你是不是在微信上问过我了,阿里的外包没有更好的选择,当然可以进啊,老师偏向锁可重入锁有什么区别。
偏向锁是锁的一种类型,可重入锁是锁的一种机制,这是两个不同的概念,你相当于在拿什么做比较呢,拿那个馒头和桌子在对比,这俩这俩是一个概念吗,不是一个概念,可重入锁的意思是可以锁定两次。
比如说我synchronized的这个对象,里边又掉了synchronized的同一个对象,这叫做可重入,能get到吗,嗯今天的笔记明晚会发对,今天笔记明晚会发,明晚八点就在这儿,依然是这个直播间。
依然给大家聊底层的东西,高并发底层的东西,成员35这个坎儿怎么看,有一个小伙伴是我们心灵老师的一个朋友,他是38岁了,在那个唯品会38岁转的行,哈哈记住啊,让自己变得更强。
你才能够在这个世界上有一定的生存空间,所以只要你在网上持续的混响,就让自己变得越来越强,有的是你的生存空间啊,丁程语音可以再说一遍吗,没听清为什么qs是cs加volatile大哥。
我那本书上写的很清楚了,我课程里vip课也讲的很清楚,教你读源码,你去读一遍源码,别问了,去读,因为a q s里面state那个值是volatile的,要保持线程可见性。
第二因为他管理的一个队列是拿什么来管的,是拿cas进行的尾插入头插入,锁不就是一个状态,再加一个队列吗,这个队列拿什么管的,cs往尾巴上插这个state的值,volatile,要保持线程可见性。
还是还是用完还用说吗,with a menu,老师你你怎么这么厉害,那怎么办,因为老师天天在做专业啊,专业啊,你不学习,主要你不厉害吗,我我要给你讲一课,我你知道我参考多少东西,我旁边都是书啊。
来给你装个叉,我我我我给我我给你讲一课,比如说jbm的课,这本书j v m g y g c,实战jvm虚拟机,hosport的实战,cdc设定实现,这把虚拟机精讲,java故障性能故障诊断性能优化。
深入理解这个虚拟机,哎呦还掉了一本淡化,这这把性能优化好不好,还有一些我都故意拿了,就是你会发现老师讲的东西是从头贯穿到尾,从底层一直给你贯穿到怎么应用,原因是我要给你讲一个东西。
我真的要参考的东西太多了啊,所以你听我课就不用去看那些书了,爽不爽,说了,加了钱对视老师能开个书单吗,我讲一课,基本上市面上的书都会买下来,j o l啥意思。
jo l l叫做java object layout,但是java高并发的时候还可以领吗,vip有,看书太慢了对,因为书里面讲了很多很多,不具备参考价值的东西,他为了凑数,这些书都会看吗,对呀。
五阳厅哈,武阳厅啊,你那个是不是中奖了,这个来键盘,就这个,好像好像奖品是五羊厅了啊,没想到你还在啊,书哪里领,知道班主任对对,class上锁锁信息保存在哪,class也是一个普通对象啊。
大哥你这个class就是个普通对象,你说它保存在哪啊,class c等于比方说t一点class,这不就是一个普通的class类的对象吗,他就是个普通对象,它是不是也有四部分啊。
mark word collect point等等,他说不要了,重新抽啊,武阳亭是这样的吗,挺好啊,一直很膜拜王老师,你可以继续马老师领域模型怎么看,d d d现在呃偏理论居多,落地的其实比较少。
大致了解就可以了,祭祖帮忙推荐一本,就是那本,很经典的那个那个那个那个计算机组成原理,深入理解计算机系统嗯,老师所有教你吗,可以认为没有,但其实是有的,有线索那个呃,比如说他进入到一个gc的状态之后。
如果证明只有一个只只有一一,只有什么线程在访问它呢,只有些那个gc的线程在访问,他,这个时候可以进行锁降级,可是你想想看,只有gc线程访问它了,它都已经要回收了,你降级还有个屁用啊。
有这样几个class类信息存放什么来,你拿大腿想一想,class类信息应该应当存放什么,你告诉我一下,gc后面会讲了,公开课没有了,vip课我们有讲,其实你对涨薪有需求,对你这就是学生。
这课就涨薪水就这么简单,那为啥叫unsafe,unsafe呢,主要的原因是java里面访问一个对象,分配内存,这些都是save操作,就是安全操作,你不需要去干嘛,不需要去释放他的歌。
如果你直接用unsafe这个类,他能够干一些什么事呢,干java干不了的事,c加加能干的事,直接访问内存,直接开辟一块内存,但是这个时候你都需要手工回收,所以它叫unsafe,我说清楚了吗。
我只知道你好牛逼,我啥也听不懂,你只要知道前半截就行,觉得什么是一线,什么算是二线,你说的是一线城市还是二线城市,还是一线厂的二线厂子,请教一下,偏向锁状态还是扣的存档存在lock record里面。
细节的是这么来实现的,每生成每每对这个对象加一次锁,就在县城站里面生成一个lock record的对象,这个locker record对象,会把前面的这个状态保存下来,再把后面的状态给它覆盖进去。
每生成一次,每加一次锁就生成一个lock record,所以锁重入是在这实现的,老师可以解释一下,对外内存概念比较模糊,jvm管理的内存叫堆内存,j w m虚拟机管的jim的操作系统层面。
它就是一个非常普通的应用程序,这个应用程序所分配的内存叫堆内存,由于一些效率上的需求,他需要去访问一些堆外内存,这个不不是jvm管,是由谁来管,是由操作系统直接管理,但是jvm可以去操纵它。
这个叫堆外内存,什么情况下需要这种的,这个需要讲的,什么情况下需要对外内存,好听我说比如说说一个最简单的操作系统级别,接收到了闲呃,这个网卡传回来的数据,他会把这个数据存到一个buffer里。
存到一块内存里,缓冲区这个数据如果你jvm想用的话,原来的模型是需要传递,或者叫拷贝到jvm的堆内存里面,你才可以用,现在不需要了,为什么,因为jvm可以直接访问这个对外内存。
这叫做zero copy shei和ni o,它的底层实现这块讲的最牛逼的人叫周志磊,周老师是我在清华的小师弟,也是我们这儿的老师,好这块就要用到对外内存,对外内存的回收是另外一个概念。
堆外内存的回收叫做虚指针,虚引用啊,强软弱虚四种引用这块是另外一个概念啊,这个这个这只能再说了,引用计数法,这跟引用技术没有半毛钱关系啊,刚才cs中比较的时候是ok的,set的时候如果把线程值改变了。
这次up我已经说完了lock吗,你管你管他哪段呢,你lock完了之后,只有一个cpu能访问底层的一个锁定了,lock,compared exchange,偏向组可以关了吗,问的很好啊。
渡前的你拿大腿想一想,也可以把它关掉,这个关闭叫use best locking。

好吧,看这里你们的问题细节问题还是比较多。

说明你们认真思考了。

valleg。

右边下一个,java version。

这里呢是那个呃,就能跳出来这个java虚拟机的版本号。

这个version呢它叫做一个标准参数,这边有好多好多的参数,java cox x,print print打印flags,final conversation。

这啥意思,他就会把参数全部都给你打印出来。

这个大家自己去看啊,这参数大概700多个参数,这就是你jvm调优的时候需要大致了解的。


就是你涨薪水50万以上年薪,告诉你这些东西就需要你了解了。

当然也没那么难,因为我讲的时候,一般会把那个常见的垃圾回收器。

每种参数是慢慢就是最主要的,应该设哪些参数,每个参数应该怎么设。

会告诉大家呃,作为blocking来说,你自己去找就行了。

有一个参数叫use the best locking,ut u use the best lockett。

看了使不使用偏向组。

默认值是true,这是默认值。

你当然可以把它设成false啊,我就不用了吗,ret logo怎么把人数据是六六内存可见性,大哥,你底层有一个东西,cs cs底层叫lock指令,你去查一下那个x86 的,他的操作手册。
lock指令什么概念,lock指令就能保证线程可见性,它进行了一个线程与内存的同步,这个就已经保证了,你好像最近直播比较火,需要哪些支持才可以面试上,那你得看你那个你面试的是哪个职位啊。
欧阳厅虽然你中了奖了,但是你也未必能够面上直播的东西,直播间你要看你在写server,还在写服务端,还是在写那个管理端,还是在写直播的服务器,就完全不一样哇,感谢老师回答啊,不客气了,两位小天天啊。
我不知道有没有同学有没有领到,有没有没有领到那个预习资料的,如果没有领到预习资料的。

或者等12x40分钟了还没进,也不太清楚啊,但是咱们这都是直被调,因为他们自身就在群里啊。

这1年期间干了百分百,干了50%的涨薪,八家公司五个offer,牛逼不牛逼,感谢我们的,其实作为老师来讲,我觉得有的人呢嗯做培训呢主要是为了盈利嘛,这个盈利的话呢就会使用另外一种讲法。
还有呢不会给他给他请更牛逼老师,因为牛逼老师比较贵,我们愿意给大家请教牛逼的老师,阿里出来的曹老师,从那个阿里和美团出来的黄老师呃,一线的讲讲算法讲的比较牛逼的,左传云,左老师。
最近的阿里的p7 程老师,那个给要给大家讲kim就是java里面的线程的实现,是那个京东的孙老师,那个讲的是那个activity的时间,和那个具体的shield的呃,京东的落地落地呃。
就这些经验呢可以说你很多时候花钱买不来的,你知道吗,百度上的信你都可以百度到,但是人家在京东这种平台上,它到底是怎么落地实现的,这种东西你是花钱买不来的啊,我们想做一门好课,就这么简单。
而好课评价一门课好不好,最关键的点在哪里,在效果,在疗效,从现在我们的效果看相当牛逼,来就让你掌心,你不来,我就我就让你的竞争对手掌心哈哈,colin,有课程,对不起,没有没有calling啊。
老师你这么做是为了啥,为了一个爽感,听到学生们说我涨薪水了,我就觉得特别爽,而且适合测试学的课程,是在p8 这个课程里面专门讲了测试开发,但是并没有,目前并没有专门的测试提高课,主要这个需求太少了嗯。
什么水平,农地法人民教育教书大厂背景一线一线大厂,并且你得在一线大城市做一线开发的do,课时1500~2000课时,课时数比较高,这课程比较特殊啊,我大家问的话,我就稍微解释两句,就这课程比较特殊。
我们课时数非常长,因为只有特殊特别长,才能给你讲的特别深,呃然后呢呃课时课时的东西,课内东西比较多,主要分四大块,主要分四大块,这四大块呢分别是敲2年前,大家稍微敲敲敲敲俩字儿吧,聊俩字的话。
感觉不是很容易受精,融课程比较复杂,就内容太多了,呃我们有那个课程的那个体系图,作为课程来说,我们主要分四大块,第一块叫底层,这块主要是用来面试用的,什么叫底层呢,比方说的操作系统组成原理。
然后再加上什么呢,多线程设计模式,那个呃j a m g m调优,然后mysql的优化分库分表,所以优化c q语句的调优性能调优,redis the keeper到分布式nt的原理,源码解读。
就各种源码对,凡是你看到的那个这这些东西,基本上全都给你讲的源码,这是底层,这个主要这个主要是为了应付面试的同学们,第二块,第二块也是很大的一块,第二块是什么呢,叫算法,算法就是从基础数据结构。
基础算法,大厂刷题,力扣热点局,这块呢应届生想进大厂,不好意思,你得必须得给我掌握这块东西,作为社招生来说,这个权重还不算还不算特别高,第三块呢叫做大数据,这个就是大数据的全系列,这个你你你你。
2万多内克全系列啊,在这全要从那个最基本的a d f s啊,那个呃呃呃h base,然后那个have,然后到flink到killing呃,到实时的计算,到那个推荐系统,就是牵扯到ai这块好。
还有最后一个要架构,互联网三高的设计实现,所以目前课程有四大块构成,跳槽涨薪最快的,把这块儿拿下,把架构的一部分落地实现拿下,就可以了,互联网三高哪三高来同学们说一下,跟我说一下互联网三高说啥。
没一个说对的,咿呀累死我了,说啥啊,高并发错了,高并发高性能高,可用错了,我去高扩展高性能高,可用对了,这不哭,死神死神说对了,high,availability呃,availability,高可用。
高性能,那么高性能呢包括两项hi,through proach,怎么读来着,叫做高并发好吧,高并发,through through through,so so so put,少了。
这copy怎么还有还有第二项叫什么low latency,低延迟,所以高平时你们所说的这个高并发呀,只是高性能的其中之一啊,高吞吐低延迟,yes,互联网三高的设计,实现,互联网三高设计实践。
是在我们的p8 架构师课程里,这块这块主要是一个落地实现啊,就是p8 架构师这个课就是讲的高可用,高并发,低延迟,可扩展多级缓存,分布式微服务网格就是service。
就是那个那个那个service mesh和surface,这块呢最主要的点是在这啊,最主要的点是一个落地实现,就是我们是亲手有,有一个团队来帮你实现一个落地淘宝,就这个淘宝的这种分布式到底是怎么实现的。
怎么支撑那个双11的这种特别流量的,大大流量的并发,怎么支持高可用,而且这东西呢是呃从那个最基本的开始搭呃,搭那个分布式提升中心,搭配置中心打索尼群到事务集群缓存网关。
注册中心监控m q e分布式任务调度,tiny的麦秀的集群,就是这些集群不像是很多那个就是咋说呢,就不像是很多问题,成为了赚钱的那种那种那种培训啊,就是全是理论的,这些全是实践。
因为很多人听完理论之后听着一时爽,但是实际怎么做,还是不知道这个实践是啥意思,这些服务器我们真的会买下来,我目前大概有60万左右的服务器,大概几十台吧,然后最后大业务节点的话。
差不多大概100~200个节点,就这东西你是在企业里头,你学不着的,好吧,value讲的百分之多少,没有百分之多少的概念,每一个节点都在不断的自动升级,我们是一个大学的选课体系,入学之后呢。
老师会根据现成的,根据你的你的你的需求,你比方说你是想跳槽跳槽涨薪,我帮你设计条路线,你是想全系列的提升,我帮你设计一下路线啊,这么是这么来做的,不适合原来一个概念啊,张睿行行行,这次我报名,我跟你说。
你早报名早提心就这么简单,晚报名没折扣,这这这广告了啊,今天主要聊技术,不聊广告,7月份是最适合金九银十,抓紧时间跳槽涨薪的月份,错过了再等1年,等着金三银四了,就得再等半年,嗯老师看我一眼,回我一句。
我就报名了,你的名字都没有,怎么回啊,他无名之辈,无名之辈,我是谁,年纪大了,醒梦呃,如果你要提,让自己的变得更更强,有竞争力学就行了,无名鼠辈,零基础转行架构,ai算法落地落地。
还有零基础转行架构是有的,就是你得从我们零基础的课开始学,那个你有点时间比较长啊,你要做好心理准备,一般的情况下,仨月我就能让你涨薪水,涨个5000,很正常一件事情,像你刚才看到的好多案例。
就是两三个月就直接那个薪水就翻了倍了,或者怎么样了,自考的专科学历能进大厂吗,可以进这几个大厂,可以进京东,滴滴顺风好像是可以的,什么马蜂窝,携程啊这一类的吧,他不是很在乎学历的啊,阿里这些是可以进的。
有一些大厂你进不去,百度华为,腾讯快手这些你进不去啊,晚上授课对pgp要学多久,短期跳槽涨薪3~6个月,长期全系列提升,就所有东西要全学下来,1年,老师包含前端课程吗,前端入门的是包含在里面的。
前端入门,工作10年的这种就还有机会吗,什么什么机会进大厂吗,有机会你得去拼,但是机会明显比那个35年的要少很多嗯,安卓转这个系统,后台可以,那当然可以,java后端开发课程学起来要多久,这块是吧。
你看你原来的基础啊,因为这是一个提高课,就是我要求你原来有s s m基础,如果没这个基础的话,你得去学我们零基础课程,零基础,零基础课,这个就看你个人的一个对咋说呢,就是你个人的一个基础和那个学习的。
每天的时间的投入,课程多少钱,12000多块钱吧,12000多块钱啊,如果你们就是想找一份初级的工作,原来是零基础的,我不建议你报这个,我们现在12000多块钱的课呃,有一个六七千块钱的课。
那个课适合你,你就先先先怎么说,先拿到一个最基本的一个最基本,最基本的,那个那个那个那个这种这种这种工作啊,这个主要是为了给大家涨薪用的好吧,工作1年可以报名吗,感觉讲的好深大哥,你工作1年是最适合的。
你要不要涨薪水啊,1万多,1年赚多少钱,12000,包括全部对,12000,包括这所有的,其实我们课程不贵,你不要算这个钱,因为俩月就让你涨回来了,12000多块钱,包括啥四个全有,然后那个。
全线升级七八个项目那个嗯,大概每个课15块钱,你这么给你算计,你就知道了吧,就是别人家人家确实便宜点五六千块钱,但是人家给你300个课时都算多的,知道吗,我们给你的是1500~2000个科室。
每个课时我们得五块钱啊,便宜真要为了赚钱就给你来回的循环播,其中一个就可以了,大多数的课只是我们这其中的一部分,算法基本也没有,有的话讲的也特别浅,大数据就更没有了,架构师就给蒙题了。
大多数p p t架构师,放心报啊,报名课程放心报,这个课,这里没坑,就是别人你可能别别地报,我们可是有点坑之类的啊,这个在这没坑啊,放心在这没有坑,报名就提心,我公司现在没需求做怎么办,啥叫没需求做。
我没搞懂什么叫没需求做,有导播课程,零基础到p8 ,有问就可以,刚刚有点java基础的在职人员,2~3个月涨薪要求不高,三个月涨薪就行,三个月涨薪,你每天投入,你每天就业余时间投入的话。
最简单的就是6+1就够了,有c加口没有c加,目前会被将来会被谁抢够了,关键是还有一个语言抢他,rus的go语言抢起来还没那么没那么迅猛,rus的我感觉啊c加将来危险,你懂吗,没需求做,太闲了,学习啊。
大哥你很快就被裁掉了,课程目前落到多少了,我再跟你说一遍,没有多少这个概念,我们的课程是每一个单独的都在升级,比如说我2019年讲过一版多线程高并发,我今年就要升级,而且要或一倍。
基本上就是每一个课程在升级的歌,没有多少这个概念啊,怎么个6。1设计模式,多线程jvm,mysql优化,redis dukeeper 6项加我们三级里头的spring cloud。
全系列全系列一就加这个一就可以了,就spring cloud的全系列,就这这这篇这篇,就微博全家桶,spring cloud,奶奶飞,spring cloud,基本上spring cloud。
阿里巴巴spring cloud,高级持续集成,就这块儿,只要只要把这块内容讲完就可以,呃内容太多了啊,给你念完就没完了,你去你去拿这个拿去拿这个图去吧,其他机构培训和大数据还用来这里培训吗。
想提升的来,不想提升的就算了,有没有二线城市涨薪案例,二线城市涨薪的态度直接跟你说一个,说一条结论一点不夸张,我们课程大概学70%,我不信你不需要你学完,二线城市整全全top top top 10了吧。
这种职位平套随便挑,三四线的基本就到top 5的top一的这种吧,这种岗位你就你就可以随便挑了啊,二线涨薪太多了。

举举举例,举不过来了,好多好多二线的,你再去看就行了,你像那个拿下阿里顺丰,那个刚才那个是双大厂的,那那是大专生啊,您10万的,这不是成都的吗,成都严格来讲不能算二线,只学spring cloud。
成都1818k。

系列 6:P180:SpringBoot打成的jar和普通jar有什么区别 - 马士兵学堂 - BV1RY4y1Q7DL
来自于阿里巴巴的一到9月份的面试题啊,说是spring boot打成的架包跟普通的价格架包有什么区别呢?这个题啊其实很多同学都是一脸懵逼啊,说老师这东西呢有什么区别?
这道题主要考察的是你对于spring boot的一个理解啊。这道题在面试高级java开发工程师的过程当中会遇到可能很多同学在面试的时候遇到这道题都是一脸懵逼。
而这道题对应的薪资呢是25K到40K的这样的一个区间范畴啊,我们来看一下,首先第一个spring boot项目最终打包成的价,它是一个可以执行的价。因为它内嵌了而这个架包可以直接通过java杠架。
比如说某某架包的一个命令来运行。而这种价它是不可以作为普通的架包被其他项目依赖的啊,即使依赖了你也无没有办法去使用其中的类。因为它没有办法去加入到当前的IC容器当中。
所以ring的架是无法被其他项目依赖的,它跟主要它跟普通的架。

结构也不一样,普通的价解解压后直接就是包名,对吧?包里面就是我们的代码,而spring boot打包成了可执行的价。它解压了之后呢,是在boat杠 info杠 classes目录下才是我们的代码。
因此呢它是无法被直接引用的。O如果非要引用呢,我们需要就是说在po文件当中增加一个配置。然后将spring boot项目打包成为两个价,一个是可执行的,一个是可以引用的两种方式啊。
O包括其实我们的公共star,其实就是可引用的这样的一个价。O。


系列 6:P181:SpringBoot的run方法做了什么事情 - 马士兵学堂 - BV1RY4y1Q7DL
它是来自于阿里的一道春招的面试题啊,说是什么呢?说是spring boot的run方法做了什么样的一件事情。而这道面试题主要考察的是你对于spring boot源码的一个理解啊。
呃这道面试题呢会在初中级开发工程师的一个面试中,但是呢有的时候也会在高级开发工程师的时候面到,其实呢他考察的是你对于spring源码的一个理解。其实很多同学啊他就会有问题。
他说老师为什么考察的是spring源码的一个理解呢,我们可以直接来看源码啊,首先我们能够去看到咱们在咱们的一个spring boot的一个工程体系当中,它是有这样的一个方法的。
而在 main方法里面做了什么样的一个事情呢?是用spring点run方法调用了一个叫做run方法的。那么这个run方法我们怎么去看呢?首先我们可以去看一下啊,这个run方法它的返回值是fi对不对?
那么这个时候呢其实我们能够。

首先我们把返馈值给打出来啊。可能有些同学对于这个对象不是太熟,但是由于java它是多态的对吧?所以我们书写的时候,其实我们可以直接把这个返回值书写成application context。
OK其实到这里啊,很多同学看到这个代码就会有点眼熟了啊。那么在spring的一个什么在spring加载配置文件的过程当中,或者说在spring IOC初始化的过程当中。
其实它的返回值也是application context。其实此时啊我们可以大胆的去猜测。OK猜测什么呢?猜测我们的run方法是不是也做了。一个类似于。IOC初始化的操作。O那么这个时候我们怎么去看呢?
首先我们点进去我们的一个ro方法,结果我们发现了一段就是说呃代码,而这个代码呢它重新它又调用了我们的一个什么调用了我们的一个方法继续点点完了之后呢,他发现又调用了我们法继续点对吧?
点完了之后到这里我们看到了一段比较长的一个代码。那么首先呢我们可以看到这里是一个就是说秒表计时器啊,而这个秒表计器我们再往下呢就是对吧?创建我们的一个什么这样的一个对象啊。
O而实际上这里面会有很多东西去干嘛呢?呃去干扰你的一个视角啊,就跟我们去做java的时候去封装对象一样,它也会有很多的手动的填充实体类的一个操作。实际上这个呢就相当于我们的手动填充实体类。
它其实对于我们看源码没有帮助的,那么我们继续再往下这是我们的方法返回对象的一个初始化,对吧?设置系统的。的一个属性对不对?然后呢,再往下他在这个位置起了一个监听。当然这个监听他肯定是去看某一类的事情的。
但是这个不是我们关注的重点。然后我们继续往下看,这个是什么?如果英文学的比较好的同学,他就应该知道参数对吧?environment环境环境的配置,然后呢被忽略的并 infer,然后呢再往下图,对吧?
然后呢再继续往下,其实我们才真正意义上的看到哎,我在这里才correect application context去干嘛去真正的去初始化了咱们的这样子的一个,或者说给我们的一个返回对象给赋了值,对不对?
contex赋值。然后呢,在这里set set了什么东西呢?在这里我们去set了咱们的一个obplication star up,对吧?然后呢再继续往下prepare context准备工作。
而在这里呢refresh context我们可以点进去看一下啊,点进去了之后,我们就会发现这里有个refresh方法,再点再点。直到我们比如说继续往下点obabstract啊。
obstract application context。其实我们会发现这一段代码在哪里?见过这就是我们spring源码当中核心的refresh的1个13个模板方法啊。所以大家会发现。
其实我们用了模板模式在这个位置,所以它run方法实际上啊它就是对于这样的一段代码进行了1个IOC初始化的操作。所以我们可以去确定我们的run方法其实就是做了1个IOC初始化的一个操作。
OK那么这是对于ro方法的一个讲解啊。

系列 6:P182:SpringBoot的优点 - 马士兵学堂 - BV1RY4y1Q7DL
这道题呢是来自于阿里巴巴的一套8月份的面试题,说是spring boot有哪些优点呢?这道题主要考察的是什么呢?这道题主要考察的是对于spring boot的一个基础的理解啊。
然后呢这道题会在就是面试中高级ja开发工程师的时候会去问到大致是P5的一个岗位新对应的薪资是15到25K。那么我们来看一下这道题目啊。
首先呢我们可以看到spring boot它是一个优点非常多的一个上层框架啊,比如它可以独立运行。也就是说它不用依赖于任何的一个容器,它内嵌了很多的容器像什么阶梯啊。
而且它不需要在打包成外包部署到容器中spring boot只要打成一个可执行的架包就能独立运行。原因是因为它内带了一个所有的依赖包都在一个架包当中,并且第二点它可以简化开发。为什么能简化开发呢。
说白了就是把你需要做的事情提前给做了。



它可以直接的去干嘛,自动依赖其他组件,减少了一个meveeven的一个配置。OK第三个它可以自动配置。

ring boot能够去根据什么当前内路径下的类架包来自动的配置并。比如说我添加一个start,我就能拥有web的功能,而无需其他的配置,这个也是它的一个核心的点啊,叫自动装配。
第四个呢它可以无代码生成和叉mail的配置。它的无代码生成,也就是说没必没有必要要叉的一个配置文件,就能完成所有的配置工作。这一切都是借助于条件重起来完成的。这是4。0的一个核心功能之一啊。
包括它还有一系列的应用监控,它可以提供一系列的一个端点,通过呃监控来进行服务的一个检查以及健康监查。O这就是我们ring boot的一个优点啊。



系列 6:P183:SpringBoot如何解决跨域问题 - 马士兵学堂 - BV1RY4y1Q7DL
下面这道题呢是来自于阿里巴巴的一道7月份的面试题。而这道面试题呢主要讲的是什么呢?spring boot如何解决跨域的问题。而这道题呢考察的其实有两个点。第一个点是对于ring boot的一个理解。
其次呢是说的是跨域到底怎么解决跨域其实是我们java领域一个经典的问题。而这道题呢会在考察中高级java开发工程师的时候会遇到对应的薪资范围呢是15到25K这样的一个区间范围啊。
然后呢首先我们来看一下这道题跨域呢其实我们可以通过三种手段来解决。第一种呢是通过前端跨域通过层。然后呢,森它确实能够去解决。但阶层是通过回调钩子来解决的。所以呢它只能发送ge请求。
而无法发送其他类型的请求。所以呢在大家去构建微服务的时候,在re phone风格的应用当中,好像就解决起来没那么的简。

因为像我们正常情况下发请求,可能发的都是pos的请求,对吧?所以呢它就显得可能没那么好用,所以呢我们推荐在后端使用quis这个框架来进行一个跨域的解决qui指的是 resource啊来解决跨域问题。
而这种解决方案呢,它不是说spring boot单单独有的啊,在传传统的SSM当中,你本身就可以通过我们的跨域来解决问题。只不过我们之前可能会在叉mail当中去配置qui。
而现在呢我们可以直接通过web mV configurationfiration接口来重写m方法来解决跨域的问题。而这里呢给大家去构建了一个案例啊,包括其实我们可以在网关直接进行跨域。
因为我们只要统一了入口,而网关实际上也不会有所谓的一个跨域问题的存在啊,所以呢这是我们的一个解决方案,包括大家可以看见我们可以添加get。

post post delete,包括options这样的一个方式去进行一个解决啊OK。所以大家直接把这段代码copy上去就OK了啊。

系列 6:P185:SpringBoot中如何实现定时任务 - 马士兵学堂 - BV1RY4y1Q7DL
呢是来自于阿里的一道3月份的面试题啊,说是spring boot中如何去实现定时任务。这道题主要是考的你的对于定时任务的一个理解啊。这道题在面试高级java开发工程师的时候会遇到。
然后呢对应的性式是25K到40K之间。那么我们来看一下这道题目啊,首先第一个呢我们来看一下定时任务其实它是一个常见的需求啊。
而spring boot当中对于定时任务的支持主要来自于spring的一个框架。比如说spring当中,其实我们可以用两种方式来进行一个实现定时任务。当然首先第一种呢就是咱们最常规的sule注解。
而我们可以通过在s注解上去,比如说添加me表达式来进行。第二种方式呢则是使用第三方的框架啊,包括一系列基于去衍生的第三方定时任务调度的框架。像 job job等等等等啊。
而使用spring的一个的注解呢主要通过。

我通过在方法上去加添加schedule注解来进行实现。而使用quis呢,你需要去定义它的触发器,它的呃调度器以及它的任务啊。所以呢一般情况下单s注解呢,它实现在单体架构下。
而我们的quis或者说相关的一脉相承的框架啊,像叉叉 job啊 job在分布式情况下可能会用的比较多一些啊,OK这是对于我们的一个就是说是spring boot去实现定时任务的一个讲解啊。


系列 6:P186:SpringBoot自动装配的核心配置文件有哪些? - 马士兵学堂 - BV1RY4y1Q7DL
这道题呢是来自于阿里的一道8月份面试题啊,说是什么呢?说是spring boot自动装配的核心配置文件有哪一些呢?而这道题主要考察的是什么呢?考察的是你在面试java开发工程师的一个高工的过程当中。
你对于源码的一个理解。而它对应的薪资是25K到40K一般情况下就是你在面P6比较高级的P6或者说呃第PP7会面到啊,那么呢这道题我们可以来看一下。
首先第一个呃我们可以去翻翻看一下我们的一个spring boot的一个源码。我在前面曾经给大家介绍过,就是咱们spring boot它的run方法是干了一件什么事情啊。
是做了一个类似于IOC的一个初始化的操作。实际上呢他做了IOC初始化的操作。那它怎么去将我们的代码自动去进行扫描呢?这个功能会不会是我们这个注解实现的呢?sring boot application样。
的一个注解。所以我们点进去啊,点进去之后,我们会发现这里面有很多的这样的一个内容,对吧?那么这个内容它到底是干了什么样的一个事情呢?首先我们把不注解给写出来啊。

我们把度解给写出来。O那么这么多的注解,我们来看一下,首先前面四个是什么注解呢?前面四个是原注解啊,原注解。那么除了原注解之外呢,我们下面会有一个注解。而这个注解呢。
我们在上面介绍过comp这个注解它是被comp被comp scanner所修饰的java类呢,如果假设你是没有去指定你的扫描路径的情况下面,它呢默认情况下是扫描当前java类以及其子类路径啊。
ok这都是被扫描的范围。而这里面呢是被排除的对吧?过滤的相关的一些内容,就是它的所谓的属性啊而除此之外呢,我前面也曾经讲过,就是这两个注解啊,ring boot以及able这两个注解一个是干嘛呢?
一个是spring boot它的一个配置注解啊另外一个呢是able自动装配的这样的一个注解,我们可以直接点。

自动装配的一个注解。我们会发现这里有一个inport注解。而前面我也说了,inport注解的三个用法啊。
那么在au to configuration importport select这样的一个轮序器当中,我们可以直接找到它的一个方法叫做select import啊。找到它的select input方法。
找到了之后呢,我们会发现,首先我们会去判断标识位是否开启了enable is unableable对吧?那么在判断了之后,我会直接进到一个方法叫做get out to entry啊,直接进点进去之后。
我们会发现在这里有一个get configuration被后选的加配置类。点进去之后,我会发现啊,这里它会有一段注释啊,怎么注释呢?
他说我会根据mat in spring点factorory下面的一个内容去判定当前的类是否加入候选范围。那么此时我们可以去看一下当前的这样的一个配置文件啊,在哪里呢?在这个位置啊。
OK大家可以看这个配置文件啊,这个配置文件当中,它会有这样的一个叫做什么被 enable configuration这样的一个权类限定名所干嘛作为key的这样的一个下面是value的内容啊。
这样的一个内容呢,它会整体的去展示在咱们的一个什么展示在咱们的内存当中啊。所以呢我们可以打到断点去看一下,看一下咱们内存当中是不是真的是有这样的一个内容的啊。O打个断点。点进去在这里断点一下。
然后呢重新启动啊。呃,稍微把它放小一点点啊,不然应该是有些同学看不清的啊,把这个稍微设置小一点。好,这么大差不多啊,设置成这么大,刚好所有人都看得清。好嘞。第bu个。嘿。😊,第bug还挺慢的啊。
OK那么大家可以看到啊,当前我内存中是没有任何的信息的。好,第一步我注入了一些属性,对吧?第二步好,我把一些configuration的配置就注入进来了。大家看这133个。
就是它默认情况下会去注入这样的一个配置,这是第一个配置文件啊,各位往下看看看看。好,往下直接133个变成了24个,这里就不得不提我们第二个比较关键比较核心的一个配置文件了啊。而这个配置文件是什么呢?
这个配置文件就是咱们的一个比较核心的这样的一个配置文件,它会去过滤掉咱们的一个内容啊,过滤掉咱们的一个内容。那么这个时候呢我们可以就是说去干嘛呢?去看一下它到底过滤掉的是什么样的一个内容啊。
O大家可以看到这里是个循环。其实我们会在循环当中去匹配咱们的一个候选信息啊,而此时这里有一个this点 configuration,就是自动的配置咱们的原数据啊,核心数据点进去我发现它是一个属性。
而此时这个属性呢,它会在它的构造器当中通过load的方法进行初始化,对吧?那么这个时候呢我们可以直接点进去看它在干嘛?而这个load呢实际。上午会发现一个pass。
而这个pass就是咱们第二个比较关键比较核心的配置文件,它的一个什么它的一个。

配置啊,所以我在这里写一下,首先这是第二个配置文件,它的作用是过滤啊,它的作用是过滤。然后呢,第一个配置文件呢,它的作用是候选啊,O呃,也返回一下返回一下。

好嘞,找到第一个配置文件,get。然后呢,在这里这个配置文件。

它的作用是候选。这就是我们两个spring boot自动装配的时候比较核心的一个配置文件啊OK。

系列 6:P187:SpringBoot自动装配的流程是怎样的? - 马士兵学堂 - BV1RY4y1Q7DL
同样是来自阿里的一道8月份面试题啊,说是spring boot的自动装配的流程是怎样的。而这道题主要考察的是什么呢?考察的是你对于sring boot的一个启动的一个源码流程的一个理解啊。
而这道面试题呢,在面试高级 ja开发工程师的时候会问到对应的薪资呢是25K到40K区间啊,然后接下来我们就来讲解一下我们的面试题。首先第一个我们要去梳理一下咱们的一个流程啊。而咱们的流程怎么去梳理呢?
比如一般来说啊,像我们这样的一个面试题,它会有几种问法。比如spring boot配置文件的加载顺序,或者说sring boot它加载的流程是怎样的。那么首先呢咱们的就是咱们写一写啊。
因为这个面试题还是有一些话术的啊。比如说咱们的sring boot,它肯定是执行了什么闷方法中的。run方法。OK而我们的。让方法。中会做IOC的初始化。对吧我首先要在梦方法当中去完成IOC的初始化。
那么我们的spring boot。显然不会进行配置文件的。初始化。那它会进行什么初始化呢?它会进行注解初始化。okK那么显然对吧?这个时候我们会将会将什么东西啊,会将java配置类的什么类对象。
传递进去。那么这个时候呢,其实就是咱们的一个configuration注解啊。OK传递进去了之后呢,我们会走到走到哪呢?走到咱们的一个。Spring。Bot。Obplication。注解。接下来。
很显然,对吧?我们要去干嘛起作用的。是我们的。怎么注解起作用的,看一下啊。

稍等,我这里断点先给放掉取消掉,然后走到这里来。起作用的是enable auto configuration注解了。

OK起作用的是我们这个注解。好,那么。接下来。接下来这个注解。会去干嘛加载我们的。spring点 factoryy。跟。
spring杠auto configurationration杠med data点proice这两个。配置文件。进行候选以及筛选的工作。加载进内存之后呢。加了进去内存之后,实际上。我们。会在。
咱们的一个什么凹 to。Configuration。Autto configuration import select。또。加载。
我是在这个就是说auto configuration当中去加载spring点factorory以及spring。how to configuration meta date点pro这两个配置文件。
我们会在返回的时候加载。进入。容器。这就是自动装配的流程。好,搞定啊,这就是我们自动装配的一个流程啊。OK大家只要面试的时候,把这段话背下来,基本上就没有什么大大问题了啊。

系列 6:P188:介绍几个常用的starter - 马士兵学堂 - BV1RY4y1Q7DL
道题呢是来自于阿里巴巴的一道8月份的面试题啊,说是介绍几个常用的start。我们都知道啊star其实是我们spring boot开放的一个功能啊。
它可以集成第三方的一个star来完成我们项目的一个集成啊。这道题主要考察的是你对于spring boot的一个star的一个理解啊。而这道面试题呢在面试中高级 java开发工程师的时候会问到。
对应的薪资呢是15到25K的这样的一个区间。然后呢我们来看一下,我在这里其实列举了5个这样子的一个star啊,常用的star。那么首先第一个呢是spring boot start web。
它提供的是we开发所需要的一个slet以及gSP的支持,包括我们内嵌的一个。第二个呢是spring boot的一个spring很很明显啊,它提供的是J8加上net的一个支持。第三个是read。
第四个呢是my集成我们的一个start所需要引的这样的一个公共的。


第五个呢是我们的一个solo所需要引用的一个start。很明显啊,除此之外,还会有比如说像你要引入MQq引入ES等等等等相关的一些。而这个首先第一个啊,我想告诉大家的是这里面埋藏了两个点。
第一个它你看你有没有用过这些组件,比如说你说你项目当中用的reies又用的MQ那么MQ的star你应该是知道的。第二个有没有真正的去理解star这个东西,它到底是干什么的。
OK所以面试的时候注意这两个点就OK了啊,介绍几个常用的star这道题完成。



系列 6:P189:你如何理解 Spring Boot 配置加载顺序? - 马士兵学堂 - BV1RY4y1Q7DL
啊是来自于阿里巴巴的一道11月份的面试题啊,说是你如何理解spring boot当中的一个配置的加载顺序啊。这个面试题其实考察的是什么呢?
考察的是你对于spring boot当中的一些配置文件加载顺序的一个理解,先加载什么后加载什么,包括你对于spring boot启动流程的一个理解啊。而这道面试题呢会在面试高级java开发工程师的时候。
面到啊,对应的薪资是25到40K。很多同学其实对于spring boot的一个配置加载顺序是有一定的了解的。但是可能说的不是那么的详细。所以呢我们接下来就来看一下这道面试题啊。
首先它一共是分为17个步骤啊,比如说开发的工具。

全局配置参数,这是我们优先级最高的啊优先级最高的。如果当你配置了全局参数的时候,你一定是优先去加载。其次呢就是单元测试上面的testpro source注解指定的参数。
这个的优先级呢仅次于我们全局的配置参数啊,然后才是spring boot test注解指定的参数,包括我们再往下就是我们的命令行op上面的一个参数,再接着往下来呢。
就是命令行当中的一个spring applicationsonson啊,son啊,不好意思个son去了son当中去指定的一个数据。后呢这个优先级优 call后一点。
然后再是sfi初始化的参数以及s初始化的参数,包括我们的NDI啊包括我们的java的系统参数,操作系统的环境变量参数ment这个时候才加进来啊,然后再是 value source。


以及后面就是我们的一个配置文件,mail中的ymail中的几个配置文件啊,包括我们的一个configuration配置文件上的一个参数,最后才是我们的一个默认参数啊。数字越小优先级越高。
而默认参数优先级是最低的数字小的会覆盖数字大的。也就是说越往上它会往下去覆盖参数。如果你要去配置的话,我建议啊优先配置全局参数,它会把你其他的参数全部的给覆盖掉。
O这是我们spring boot配置加载的一个顺序。




系列 6:P19:CPU内存行和缓存一致性协议 - 马士兵学堂 - BV1RY4y1Q7DL
其实这个核心呢,我主要是来讲给大家讲的是什么呢,讲的是一个volatile,这关键字呢很多同学可能都知道它有两个作用,第一个呢叫线程可见,第二个呢叫禁止重排,关于线程可见呢这件事情特别简单。
有没有同学需要我讲一讲线程可见性的,有需要的话给老师扣个一来。

其实是用不着的感觉啊,就比较简单的一个东西,如果你些人可见都不太知道的话,那我觉得你你你,你你你这个基础就稍微有点弱了,找一下啊,上周讲过对公开课不能天天讲,那个新的小伙要想听新的,要想涨薪水。

欢迎你报名我们的vip。

嗯这是一个最简单的线程可见性呃。

避免有同学不太知道的,所以呢跟大家伙简单聊一下。

线程可见性的意思呢,就是一旦这个线程里面改了一个值,另外一个线程立马得知道,来我们来看读一下这个小程序,非常简单的小程序啊,快速过一遍,这个小程序呢我有一个主线程main线程。
然后在我的主线程里面开启了一个分支线程,这个线程我new了一个thread,这thread while running,只要这个running设为true,它会不停地执行,一直不断的执行。
什么时候我们这个线程结束了,他才会打印一个end,模拟了一个server的一个操作好了,同学们,下面我问大家一句话,就是当我的主线程睡了一秒钟之后,把这个running设为false,那么我问你。
如果我在这里不写volatile的话,它会停止吗,这就是线程可见性的意思,它会停止吗,不会跑一下,给大家打一点基础啊,好你就在这等着吧,十秒100秒啊,它都不会停止,他不会停,原因是什么呢。
原因非常简单,推荐你们想想看,这是那个值,刚开始呢它为true,作为java里面的线程模型,java memory model,java的内存模型,java memory model,什么意思呢。
它会每一个线程把这个值读到自己的线程,处理的缓存里头,所以这里头有一个缓存的概念,现成的本地内存读到自己的线程,本地内存这块之后呢,他就直接把这个处拿来读,这个时候有另外一个线程改了这个值。
但是请大家注意,这个线程只会在缓存里读,他不会去内存里更新,所以虽然这里的值已经改成false,可是每次他读的依然是一个缓存的值,这样的话呢这个值在两个线程之间就不可见了,我改了之后之后,你看不见。
那我怎么来保证我这边改完了之后,你另外那边呢立马就能看见呢,怎么办呢,加volatile,所以这是volatile的第一个作用,叫线程可见性,跑一下,好马上结束了是吧,把这个比较简单啊来呃。
可以继续同学老师扣个一,我们继续,今天呢我跟大家聊清楚volatile这件事,但是要聊透这件事,尤其是聊透面试中所遇到的各种各样的问题,需要你了解的东西还是比较多的,我们从底层一点点开始讲呃。
首先我们从cpu内存这方面开始讲起。

这个呢需要牵扯到一点点,计算机的组成原理的知识,这个知识呢也比较简单,大家看这里,呃这个图呢是一个计算机的,现代计算机的组成的最核心的一个图,作为cpu来说,它所用到的数据data,它所用到的指令。
ok这些全都要从内存里头给读过来,内存是用来存储这些的,好,cpu的速度特别快,它的速度大概和内存比100比一,这个速度特别快,我读一个东西就得等内存给我返回回来,所以为了提高效率。
cpu和内存中间加了一系列的缓存,缓存这个概念我相信不需要解释了,应该大家伙应该多少都接触过,就是我找一些存储量稍微少一点的,比内存少的,但是速度特别快的,把常用的数据给放到这里,每次我读的时候。
我就不需要去内存里头读,我只需要多本地缓存就可以了,这个缓存根据工业界的实践,目前作为关键时间上来说,缓存一共有三层,如果大家想了解这一点,深入理解计算机系统,就是这个图。
这三级缓存我们分别称之为l one,l two和l three,虽然现在还没有人问,这三级缓存分别位于什么位置的问题,但我还是想讲给你听,因为这个还是挺普遍的一个小知识。
好大家看这里所谓的l one位于什么位置,l2 位于什么位置,l three位于什么位置,看这个图大家就明白,这是我们有两颗cpu两颗,这是第一颗,这是第二颗,我们假设每一颗cpu里面有两个核。
这是第一个和,这是第二个和第三个和第四个核,l l一这集缓存位于核的内部,就是在这盒里面,l2 这就缓存也位于这个核的内部,l3 是两核共享,但是它位于一颗cpu里面,ok这边也一样。
所以当我们从内存里头读一个值的时候,它是怎么读的呢,我们想象一下这个过程,现在我的计算单元要求去计算一个值,要从内存里读这个值过来,他会优先的去l one里找有没有这个值。
如果没有继续去l2 里找有没有,如果没有继续去l three d,如果还没有从内存里头读过来读的时候,首先给它缓存在l3 里面,再缓存在l2 里面,再缓存在l一里面,然后读到寄存器里开始做计算。
好这个大体的流程能够能够理解,同学老师扣一两个l3 ,连起来会好一点,然而并不是,为什么要增加这么多级缓存,以前有同学问过,我说,老师为什么是三级,而不是四级,为什么不是五级,不是六级,不是一级。
不是二级,这个事儿你别问问也没有答案,因为这都是工业界的实践摸索出来的,他并没有一些理论上的这种证明,到现在为止啊,大多数的缓存,因为现在硬件也在不断的发展,一般来说如果从l u单元。
从计算单元访问寄存器的时候,是要小于1纳秒的,访问l one的时候,大概是一个纳秒,访问l two的时候,大概是三个纳秒,访问l three的时候大概是15个纳秒,而访问值去直接访问内存的时候。
好这个时间就要80纳秒,所以他们两个之间的比例大概是一个,100比一的关系,为了提高效率,所以我们要加缓存,这里头呢其实包含着一个朴素的最基本的原理,一个叫时间局部性,一个叫空间局部性。
这块原理性的这种东西呢,你大概听一听,大概理解就是什么意思啊,就是纯理论的东西,什么叫时间局部性,什么叫空间局部性,一般来说我每次访问到这个值的时候,很可能很快的又会访问到这个值。
比如说作为一个循环变量来说,for int i等于零,i等于一,然后i小于多少,你看啊,每一次循环都会访问到同一个变量,所以这是时间局部性,所以由于时间局部性的存在,我是不是把它存在一个最快的位置。
最快能访问到的位置,这个是最合适的,所以这是中间要加缓存,还有一个叫空间局部性,空间局部性的概念,就是说当我访问到这块空间的时候,大家的数据都是挨着盘的存储的,我访问到这个数据之后。
很可能跑到下一个作为一个数组里面,你们自己想一下,我访问这个循环的时候,马上要返回第二个,第三个,第四个,第四个,第五个k,当然这种理论性的东西,如果你能够面试官讲出来,最好讲不出来也没关系,总而言之。
为了提高效率,中间加加缓存,好吧,呃这几个概念呢还算是比较简单,正是由于缓存的存在,所以呢就诞生了各种各样的小小的问题,首先优先的第一个问题是我缓存读过来的时候,按怎么读,第二个问题是我这缓存大家伙。
有一个数据存在了不同的cpu里面,那改了之后该怎么通知,认真听认真听啊,我们先讲第一个概念,先讲第一个概念好看,这里首先我们要读一个值的时候,读一个值过来,这个值读到缓存里之后。
他是不是会只读这一个值过来,然而并不是什么意思呢,就是你们想想看啊,咳咳咳,就跟那个昨天我举过那个集装箱的例子,虽然说有时候你只需要一双鞋,这双鞋呢我还是要装在整个集装箱里,一块的把它运过来。
这个效率会非常高,而且根据这种空间局部性原理,就是我访问到这个值之后,很快就会访问周边这个值,所以我干脆还不如一次性的把这个值分成一块,一块的全体读进来,虽然这个值很可能只占了四个字节。
但是我一次性的一读很可能读好多个字节,读出完整的一块放到我的缓存里,因为还是那句话,根据空间局限原理,我访问到这个值之后,很可能下一次我要访问这个值,假如这个值正好位于缓存,我的效率就提升了。
所以第一个概念叫做缓存,是按照一块儿一块儿来的,好,能get到这一点,同学给老师扣个一,这个概念没问题吧,缓存是按照一块一块来的,那好这一块的大小是多少,听我说,首先作为缓存来讲,从内存里读一块值过来。
放到我的缓存里,它有一个专业名词叫缓存行,叫catch line,缓存行,好,作为缓存行来说,一行目前是多少呢,64个字节,请你给我把这个数给我背过,目前用的最多的不是64k64 个字节,每次讲到这儿。
总有同学问我说,老师为什么不是128,为什么不是32,这个东西是一个工业实践摸索出来的结果,64个字节是现在大多数绝大多数机器用的,一个缓存行的大小,这个呀其实呃非常非常的简单。
也我原来给大家稍微的解释,解释这个理论性的东西啊,就是如果你的缓存行特别大,你们拿大腿想一下,你一行特别大,你恨不得把整个内存1/2全部拿过来,缓存好,那是挺好,但是呢你读过来的效率就会越低。
读取一块儿的时间就会特别慢,如果你的缓存方特别小呢,小力度的,虽然说你的读取的效率很高,但是你局部性空间的效率就比较低,什么意思,因为我找周边的这找不着啊,我得去别另外另外一块还得还得读进来。
所以最终取了一个折中指,目前最多的就是64个字节,记住这一点,还有同学说64个字节呃,这个缓存行这个东西真的存在吗,我告诉你真的存在,我们先讲这个缓存行的呃,刚才我讲了一个这个概念。
就是缓存行是一块一块来的诶,然后呢他目前是64个字节,我们先讲,我们再讲第二个概念,假如现在有这么一个问题啊,听我说,假如现在有这么一个问题,比如说我们这一行数据里边有一个x。
里边有1y这行数据它会读到我们的缓存里,同时它会缓存在不同的cpu上面,cpu盒上面,ok这是cpu一的cpu 2这个x值,我这边呢哎我这第一个第第第第一个cpu,我要读取x的值,我要修改x的值。
那接下来呢我会把整个一根据我们刚才的理论,我会把整个这一行读到l3 ,读到l two,读到l one,读到这里面,与此同时,另外一颗cpu cpu 2我要用到y这个值,但是根据我们刚才理论。
他会把一整块全读进来吗,所以他会把同样的一块数据缓存在自己的l one,l图里面,那这时候就会产生一个小小的问题,假如我这块数据里面的x改了,我要不要通知另外一块数据,说哥们儿,你这个x已经被我改过了。
o大家听明白这意思了吗,这个呢就叫做缓存,要保持一致性,就说我这有一个缓存,我改了之后,我我要通过一种什么机制来通知另外的cpu,同样的一块的缓存,这块呢叫一致性,解决这个一致性的问题啊。
在硬件层面上出了好多好多好多的协议,硬件层面的协议好,这硬件层面协议呢,大家伙我估计啊,绝大多数人都会听说过这个名词叫m e s i,来听说过这个名词给老师扣个一,几个cpu其实几个跟几个没关系啊。
m e s i,因为网上很大多数的文章,凡是讲到volatile都会顺带着聊msi,搞得那个volatile跟msi好像有关系似的,我今天虽然要讲给你听m e s i,但是我先告诉你结论。
volatile跟m e s i没有半毛钱关系,再说一遍,volatile跟msi没有半毛钱关系,那这个m e s是什么意思呢,它就是一个硬件层面的多颗cpu之间,缓存保持一致的这样一种协议的实现。
并且这个协议的实现只是x86 ,这种架构上只是英特尔的cpu上是这种协议,叫m e s i,如果非要详细解释这个msi的话,其实呢它就是缓存行的四种状态,m e s i就是缓存行的四种状态。
分别的状态叫做modified被修改了,exclusive独占,share共享,invalid失效,举个最简单的例子,这有个缓存行,这有个缓存行位于不同的cpu里面,我改了这个值。
我要通知另外一颗cpu里面说,我这已经是modified被改了,所以你这边应该是一个invalid,失效了,你下次要用到我这个值的时候,你自己决定要不要去内存里头重新给我读一遍。
这是当内存里面的一个缓存一致性的协议,的一个实现,这我再说一遍,这个实现m e s i只是x86 的这种架构的cpu,其实别的cpu的它的实现往往叫m i,m o s synfifly dragon。
以及最新的还有一个新的协议,忘了他具体的名字了,一个改进版的缓存一致性协议好,所有的这些全叫缓存一致性,这是在硬件层面保持缓存一致性的,跟volatile没有关系,再说一遍,tf是重点来干货。
今天没有干货,全都不是重点,你抽完奖了,是不是可以撤了,拜拜啊,慢走不送,不要给我带节奏,带节奏,我就会也不能怎么着,你开个玩笑好,我讲到现在为止,大体能是不是能理解什么是缓存,什么是缓存一致性。
什么是缓存一致性协议来能get到这几个概念,同学老师扣个一,一脸懵逼,不会吧,我讲的已经很是不是已经很通俗了,还要怎么再简单吗,已经很清通俗了啊,就是一堆那个需要缓存的东西加进来嘛。
当然呃这个你又没有编程基础,确实稍微难一点点,但是这个就是你和计算机系的专业的区别,就在于这话不多说了,下面我们就来聊一个,有同学说老师这缓存行这东西真的存在吗,真的存在。

老师你能证明吗,完全可以,我给你看一个特别好玩的程序,大家看这里。

下面给大家看的程序比较好玩啊。

呃我们先读程序,一会儿看结果啊,啊看这个小程序,这个小程序呢有这么一个long类型的count,这个count呢是1亿次,接着就循环次数啊,这个循环次数是一个亿1亿次的循环,我有一个类,这个类呢叫t。
它有一个成员变量叫x是long类型的,接下来呢我有一个t类型的数组,只有两个t的对象存在,那么我们拿大腿想一下,仔细听,既然是一个数组,那这个arr 0指向了一个new t,哎。
他一定是new出来的这个对象,2v一又指向一个new t,它一定是new出来的另外一个对象,每一个t里面都有一个x,每个t里面都有一个x好,这俩哥们儿在数组的排列上是挨在一起的,是排在一起的。
所以这是x1 ,这是x2 ,我干了这么一件事儿,我起了两个线程,第一个线程t一不停的修改array,零点x就是改的x1 ,第二个线程不停的修改,2v一的x修改了多少次,修改了一个一次1亿次,好。
就是这么一个简单的小程序,单小程序做这个实验用来干嘛呢,好听我们看它最终执行完的一个时间,跑一下。

系列 6:P190:如何实现SpringBoot 应用程序的安全性 - 马士兵学堂 - BV1RY4y1Q7DL
这道题呢是来自于阿里巴巴的一道9月份的面试题啊,说是咱们如何去实现spring boot应用程序的一个安全性呢?这道题主要考察的是你对于spring boot的一个源码的理解啊。
这道面试题在面试高级加工程师的时候会去进行一个碰到啊,然后呢对应的薪资是25K到40K这样的一个区间,实际上呢很多熟悉,就是说咱们spring boot的一个小伙伴会知道啊。
就是咱们的一个spring boot它应用程序的安全性,实际上是需要去依赖一些组件的,比如说像我们的spring security。所以呢如果你需要去干嘛呢?去实现咱们spring boot安全性。
我们需要去使用到spring boot杠star杠 security的这样的一个依赖,并且加了依赖,还不行,我们还需要添加一些安全的配置。
而我们配置类必须扩展we security configurationfiration adapt这样的一个方法,并覆盖其原生的这样的一个方法啊。

所以呢这是我们去实现sring boot应用程序的安全性的提中的一个操作之一啊OK。

系列 6:P191:如何在 Spring Boot 启动的时候运行一些特定的代码? - 马士兵学堂 - BV1RY4y1Q7DL
来自于阿里巴巴的一道9月份的面试题啊,说是如何在spring boot启动的时候运行一些特定的代码。这个时候可能有些同学他就会比较懵逼了。他说老师。
我为什么要在spring boot启动的时候运行一些特定的代码呢?实际上啊我们这道题考察的是什么呢?它考察的是你在比如说写到一些源码,或者说中间键的时候,有没有自己的一个理解啊,O这道题主要考察的这个。
比如说我去自定义咱们的一个什么定时任务调度,那么这个时候呢我们就需要把定时调度的这样的一个触发器啊或者调度器的类去干嘛加入到spring周期当中去,那么这个时候毕竟必定我要就要把它加入IOC容器,对吧?
那么这是一些写中间键的时候,可能会遇到的一些问题啊,那么这个题呢是对应的是高级java开发工程师。对应的心思呢是25到40K这样的一个呃区间啊,那么怎么去弄呢?实际上很简单啊,就当你去实现接口。
比如说plication running。

或者说当你去实现commona lean wrong这样两个接口的时候,这两个接口实现方式是一样的啊,并且他们都只提供了一个run方法。
并且我在课上啊在定时任务调度的课上是帮你们去实现了common嗯 lean wrong啊这样的一个接口啊,实现这些接口呢就可以把这个类加入IOC容器当中啊简单高效啊。
O这就是这道题如何在spring boot启动的时候运行一些特定代码。你的一个回答啊。

系列 6:P192:如何重新加载Spring Boot上的更改,而无需重新启动服务器? - 马士兵学堂 - BV1RY4y1Q7DL
来自于阿里巴巴的一道12月份的面试题啊,在年末前招的说是呢如何重新加载spring boot上的一些功能,而无需更改。无需重新启动我们的服务器。说白了就是热部署。
那么这道题主要考察的是你对于spring boot的一些使用上的细节啊,这道面试题呢在面试高级 java开发工程师的时候会问到对应的新词是25乘以到30K啊。
那么呢我们来看一下这道题它到底是怎么去进行解析的。首先第一个我们应该清楚的知道啊spring boot它是有两种方式可以去进行热部署的。第一种呢是你用呃develop这样的一个工具来进行实现啊。
我们可以通过这样的一个依赖关系。然后呢,你直接通过嵌入式的开发,将tom重新进行启动。因为实际上它是属于一种是么内嵌式容器啊,在spring boot当中,而spring boot它有一个开发工具叫做。

develop tools这样的一个模块,它有助于提高开发者的一个生产力。而java其实遇到的一个主要问题,就是将文件的更改自动部署到服务器,并且自动重启。而我们可以通过这样的一个方式啊。
就是无需重启服务器,每次都可以去进行一个热部署。但是呢在springring1。0的版本当中是没有这样的功能的。所以呢我们的一个什么。模块它是完全满足开发人员的需求的。但是呢在生产环境当中,一般禁用。
因为java它的特性就不支持我们的热部署啊。同时呢它还提供了我们的1个HQ的一个数据库,方便我们更好的去测试我们的一个应用程序,大家可以直接依到这个依依赖这个就是说或者说直接加入这个依赖就okK了。
ORG点spring free walk点boot。然后呢。d这样的一个依赖。然后scope呢就填运行时就OK了。然后呢,如果你想自动装载页面的话呢,可以通过fi loud直接进行。
而我下面呢也贴了截图啊,就是如何去使用我们的five loudok这是页面自动装载的啊。


系列 6:P193:什么是 Spring Boot Starter ? - 马士兵学堂 - BV1RY4y1Q7DL
题呢是来自于阿里9月份的一道面试题啊,说是什么呢?什么是spring boot的一个star解释一下这道面试题主要考察的是你对于spring boot的一个基础理解啊。
而这道面试题在面试中高级java开发工程师的时候会问到啊,对应的薪资是15到25K这样的一个区间。那么首先我们可以来看一下啊,spring boot start,它是什么呢?
其实它是我们spring boot的一个启动器啊。而启动器,它的定义是一套方便依赖的一套方便的依赖描述服务。O也就是说其实它的本质是一个依赖描述服。而且它可以放在自己的程序中。
你可以一站式的获取你所需要的一个spring和相关的一些技术。而不需要依赖描述服通过视例代码的搜索以及复制粘贴的负载。啥意思呢?就是说我可以通过引入这个依赖的描述服,或者说呃说简单一点。
我可以通过加这个依赖,去一站式的搞定你引入一个组件所需要的所有东西,而不需要比如说像以前一样加配置加注解这样的一个方式。所以呢我现在只需要去引入这样的一个依赖就O了。
比如啊你想使用spGPA去访问数据库。那么这个时候你只需要项目包含spring boot杠star杠d杠GPA这样的一个依赖,你就可以完美的进行,它所有的工作都会在这个依赖项自动装配进行一个注入。
知道吧?所以这就是为什么需要sring boot start的一个原因。



O。😊。

系列 6:P194:什么是SpringBoot - 马士兵学堂 - BV1RY4y1Q7DL
来自于阿里巴巴的一道就是说年底啊,就是阿里巴巴招聘的一道面试题,也说是就是咱们的一个spring boot到底是什么。其实呢这道题呢是针对于咱们应届生的一道题目啊。
这道题主要考察的是你对于spring boot的一个理解,包括甚至如果可以的话,你能聊一聊spring cloud,这是最好的。呃,这道题呢在面试初中级java开发工程师的时候会面到啊。
当然呃对于高级的这样的一个java工程师,它肯定开头不是说什么是spring boot。

它是会让你去聊一聊你对于spring boot的一个理解。包括spring boot什么是它的一个自动装配呀,包括spring boot它的一个就是说特性也不能聊出来啊。
那么接下来呢我们就来看一下这道面试题它的一个解析。那么我们来看一下spring boot它是有我们的一个spring的一个开发团队提供的一个基于spring的一个全新框架。那么意味着什么呢?
意味着我们spring的一些特性。比如说IOCIOP它都是继承下来的。而它的一个目的是为了干嘛呢?它是为了去简化我们spring应用的一个初始搭建以及开发的过程。并且这个框架使用了特定的方式来进行配置。
什么叫特定的方式呢?这个就是我们spring的一个核心啊,就是自动装配。并且由于咱们原先用MVC的时候,实际上我们会用到各种各样的一个配置吧,对吧?比较繁琐,包括我们依赖的一个。
构建包括我们依赖的一个拉取,对吧?而此时我们的一个spring boot,他的开发团队就想到了一个问题,我们为什么不把就是我们spring当中繁琐的配置预先去在框架当中去进行加载呢。
这个也是我们spring boot非常重要的一个特性,叫做约定大于配置,或者说叫做约定优于配置一个意思啊,一个意思。所以这道题你只要聊到约定大于配置或者约定优于配置,基本上就OK了。
就相当于本来你要干的事情,既然每个人他都要这样干,那我干脆比如说我去先帮你把这样的一个工作去做了,让你的开发人员不不需要再去定义什么样板化的这样的一个配置。比如说d source的一个加入啊等等等等。
这样的一些东西,对吧?我先帮你把事情做了,这就是我们spring boot,他所去干的这样的一件事情啊,OK那么这是我们的第一道题,什么是spring boot。

系列 6:P195:我们如何连接一个像 MySQL 或者Orcale 一样的外部数据库? - 马士兵学堂 - BV1RY4y1Q7DL
那是来自于阿里的一道比较简单的校招题啊。他说呃我们如何连接一个像mysical或者说orac一样的外部数据库呢?OK而这道题考察的是什么?考察的是你的一个应用的一个操作能力啊。
那么实际上呢我们去连接一个外部的数据库一定会有相关的依赖配置。然后呢,我去使用它的时候,一定会有相关的注解。所有的第三方组件都是这三个步骤啊,但是我们去聊的时候呢,肯定他不能这样去聊啊。
而这这道题目是对应的终极java开发工程师,薪资范围是15到20K的这样的一个范畴啊。首先我们以myscle为例来考虑这个问题啊,第一步我要干嘛?我要去加依赖,对吧?
所以我们要把mycyclcle连接器的依赖添加这个文件,比如说mycle杠connection杠java,对吧?而此时其实我们是要去干嘛移除掉HQ的一个依赖下,或者说把它作为测试的范围的。
比如说我去加一个test,为什么要移除它呢?



因为如果我连上了HQ的话,那么我HQ跟q肯定就冲突了,对吧?第三步安装你的q的数据库,第四步配置你q数据库的连接,而配置的话。
实际上就是通过我们的plication点pro这样的一个配置文件去进行配置啊。比如说我们当前将我们的DL自动的DL设置为然后呢,它的地址是怎样的3306杠t账号密码。此时其实加了依赖加了配置。
如果你只仅仅只是想连接上数据库到这里其实就差不多了,而使用的话,我们还要需要去使用到一些注解。然后呢比如说从数据库获取到一些数据所有的组件所有的中间件都是依赖配置注解这三步啊O。





所以呢这道题是我们的一个操作题。

系列 6:P196:运行SpringBoot项目的方式 - 马士兵学堂 - BV1RY4y1Q7DL
也是来自于阿里的一道11月份的一道面试题啊,说是运行spring boot项目的一个方式有哪些呢?而这道题主要考察的是各位对于spring boot的一个基础的一个问题啊。然后呢。
这道面试题在面试中高级java开发工程师的时候会问到啊,主要对应的薪资呢是15到25K之间。因为阿里其实社招啊,这这次也在P5左右的一个级别。
所以呢呃会强行的把一些就是说呃比较简单的问题放在中高级的一个工程师的一个面试题当中啊,当然。平时的时候我们也会去问到,而运行spring boot项目的几种方式呢。
首先第一个我们可以直接打包呃clean instore,然后呢用打包的命令,然后呢把它放到比如说类似于ca呀及bo啊 j这样的容器当中去运行。同时呢我们也可以用gra,类似于这样的一个构建的工具。
然后呢,通过这样的插件去进行一个当前的直接运行。同时呢我们还可以比如说直接通过它的起启动器,然后呢通过启动器的方法的run方法去进行IOC的一个初始化啊。
所以呢这三种方式都可以让我们正确的去运行spring boot的一个项目啊,大家只要把一23聊出来,基本上跟面试官去聊出来这样的一个方式。然后呢大概去说一下每种方式大概是怎么样的一个流程。
比如说打包的一个命令有哪些,比如说怎么去用me或者gra的插件去运行。比如说me方法它去运行。






然后呢,需要的就是IOC的一个初始化让方法的IOC初始化,把这个聊出来,基本上就不会扣分啊OK。

系列 6:P197:kafka中,可以不用zookeeper么? - 马士兵学堂 - BV1RY4y1Q7DL
我们再来看一下来自美团的一道面试题,在卡夫卡中可以不使用做ke吗?知道面试题了啊还是比较简单,所以它对应的薪资是25K,然后呢,依然是高级开发。我们知道在卡普卡里面,它的早期版本是必须强依赖于做ke的。
所以回答这个问题的话呢,你可以站在不同的版本。😊,啊,你可以说老的版本它是必须要使用做ke的。然后新的版本呢,这个地方它有一个分界线啊,就是版本在2。8还是2。8以下,还是2。8以上。😊。
如果你的版本它是大于等于2。8,就是比如说是三或者3点几的版本,它是可以不使用做keeper了。啊,这个地方呢请注意它可以不使用,不意味着完全费气。所以我们可以看到你在去安装这种卡不卡的时候。😊。
作为卡夫卡的话呢,它的安装,你像新版本里面,我们把它下下来,对不对?一般情况下面呢,你的GDK环境当然是java吧卡夫卡里面它会自带一个 keep。如果说你要处于稳定性考虑。
你也可以去自己去使用一个 keep啊。另外的话呢你也可以建立一个 keep的集群。那么在卡夫卡里面它有两种方式啊。第一种就是卡夫卡 keep。你可以是先启动一个 keep。
然后的话呢再启动我们的这个卡夫卡。第二种方式的话呢,你可以通过它的一个组件叫做 k的这样一个组件。😊。



就是首先这个组件它是怎么玩的呢?就是首先你会去因为是一个分布式就是是个分布式协议啊。所以的话它需要去生成一个集群I里面有一个啊叫做的个执行文件。
然后呢你可以生成一个样的集群生成完之后的话呢你要去格式化存储。就是这个的里面呢,本质上面就是把这些东西保存在我们的本机的目录上面啊,所以呢这个地方也通过然杠 storage这个命令。
然后呢把对应的I然后配置到你的这个然后除此之外的话,我们就可以按照我们的方式进行启动了。你只要去指定对应的生成的个配置文件。那么它在这个地方启动的时候,它就不依赖于了。O所以大家可以看到回答这道面试题。
它的核心是什么?你必须要把你的技术更新。😊。


很多时候很多小伙伴可能以前用过卡不卡,他就觉得卡不卡一定要使用做ke。但是你会发现其实新版本里面它已经完全可以去抛弃做ke了啊,他慢慢的去做ke化。以这道面试题呢,他其实考核的是你的技术的更新啊。
你可能在简历里面经常会写着我是一个技术控,我喜欢研究技术啊,你用卡不卡,那这个时候卡不卡很早之前他就已经废弃了做ke,对不对?这个技术如果你不了解的话,那么你在面试的时候啊。
你自己写的这一些什么技术控啊,我喜欢研究技术啊,这些东西你就不成立了啊,因为你不关心技术,你可能用的技术还是三年前几年前的这个版本,对不对?然后一直没有更新,也没有去关注过这个技术它的一个发展。😊。
所以我们去面试的时候啊,除了这个技术的本身之外,我也希望大家可以去关注一下一些技术的更新。比如说你关心spring的话,可以经常看一下spring官网,比如说spring里面呢最近出了6。
然后spring boot出了3,然后这些新版本它的特性是什么,对不对?然后这个新版本在未来它的定位是什么?包括卡夫卡,它也出了比较新的版本,这个新版本它的定位是什么?然后这个新版本。😊。
对于我们未来的这个运用,或者是我们的应用场景有什么帮助啊,你要站在多个维度去分析这个问题。

系列 6:P198:说一说Kafka你熟悉的参数? - 马士兵学堂 - BV1RY4y1Q7DL
我们再来看一下这样的一道面试题,说一说卡夫卡你熟悉的参数。这道面试题的话呢,它是考核的一个知识面。就是如果你使用卡夫卡的话,你应该要知道它一些比较常见的参数。所以这道面试题呢它是来自于阿里巴巴啊。
他希望考核你对卡夫卡的一个熟悉程度。你在工作当中你用到卡夫卡。但是的话呢,如果你不熟悉参数,那说明啊你可能没有研究的那么全面啊,所以这道面试题的话呢,它考核的是一个知识的广度。
我们来看一下卡夫卡有那些常见的参数呢?😊。

大家可以看一下,其实卡夫卡的参数的话呢,从整体上面来说,我们要分成几个部分啊,主要的话呢是放到我们的bro,就是我们的这个主机上面的配置啊。一般情况下面这个配置文件的话,会放到卡夫卡的fi目录下面啊。
主要是serv点这样的一个文件啊。在这个文件里面呢,比如说像bro ID这个是我们表示在集群下面的唯一表示啊,如果是单机的话呢,就没有问题。如果是集群的话,那么每一台机器它一个单独的bro ID。
并且要求是正数。😊。

所以的话呢这个地方它配置的一个原因你也可以讲清楚。因为你的服务器IP有可能会发生改变。但如果bro ID没有改变的话呢,它就不会影响我们的整个的consumer这个消费的一个情况。然后第二个的话。
listers就是我们的这一个监听。😊,啊,就是你的起的监听地址啊,这种情况下面也要注意,如果你写的是0。0。0。0,这个一般情况下面就绑定所有的网卡地址。因为一台服务器它可能有不同的网卡。
不同的IP所以4个0默认是绑定所有,然后你也可以填上你的IP啊,填上你的IP的话呢,你可能是绑定某一个具体的IPIP地址。然后像做 keep点connect这个东西呢是我们去连做ke的一个路径啊。
还有包括ng点我们的DRDRDI这个东西的话就是我们的消息保存的路径。啊,这个路径的话呢,一般情况下面啊,你也可以去配多路径,你也可以配置什么用逗号来分割。




啊,所以你要注意这个参数里面它的一些含义啊,其实还比较重要的一点就是这个al greater topics enable。😊。

就是是不是允许你自动创建主题?就是我们进行生产或者进行消费的时候,有可能这个主题不存在,对不对?那么如果这个enable这个参数它是te的话,它就会自动创建啊,它的默认值它就是te。😊,OK啊。
大家可以看到,其实参数的话呢,对于我们平时去玩rock卡夫卡的话呢,它影响非常大啊,还有包括主题的配置啊,number partitions就是我们的新建主题的分区数。😊。

注意这个分区一般来说它只能增加,它不能减少。

OK还有包括就是日志的保存日期啊,nuger rotation health,还有包括nugger rotation battles。

啊,分区的这个文件的限制啊,还有包括每个卷sment的bes这种限制。

OK还有包括最大的一个消息的besmessage点max这些参数啊。所以大家可以看到,你要去说一说卡夫卡当中常见的配置参数的话,如果默认情况下面你只能说出一两个,那说明你对卡夫卡的话不太熟悉。😊,啊。
默认情况下面,如果你能够说出5个甚至10个以上,那说明你在工作当中啊,非常的去注重这些参数,或者非常注重这些配置。因为卡夫卡它作为一款消息中间键的话,其实里面你要熟悉它,首先必须要去熟悉它的一些参数。
因为你在这种工作当中,你去生产消息,或者你去消费消息。啊,这个里面呢你都会去用到卡夫卡一些非常常用的参数。这些参数的话呢,对我们的这一个生产来说,对于我们的消费来说,它是有很大影响的。
比如我们知道啊你的这一个自动创建主题,如果这个参数没有配的话,那有可能这个主题不存在,我生产往里面发的时候,它就会报报错啊,如果说你把它设成for的话,它就不会自动创建。所以有些生产环境啊。
它出于权限的考虑,它会把这个al greater topics这个东西配成for。😊。




啊,就是你必须要。😡,通过。控制后台或者通过命令的方式,就是那种直接连接卡夫卡的命令的方式才能去创建啊。你不能通过这个程序的方式去创建一个主题啊,当然通过这种程序创建主题有它的好处。
就是我可以通过应用程序啊,然后它的一个业务逻辑来去创建不同的主题,然后满足不同的业务需求。所以的话呢,作为这个消息中间键,卡夫卡它其实是是比较吃配置的。也就是说你在工作当中。
你必须要去熟悉它的很多配置文件,你在工作的生产和消费当中,你才能把卡夫卡玩的很赚。所以呢这道题目它首先考核的是你一个知识的广度。😊。

就是你对命令到底熟悉哪几个。另外的话呢,这个面试题也考核知识的一个深度。

就是你在玩各种配置的时候,可能不同的命令里面,它对于集群,它对于这种集群的部署,它对于我们多网卡的绑定,还有包括它对于我们平时生产和消费,它都是有影响的。
所以的话呢这道面试题一般来说它是作为一个综合的面试题出现在你的面试当中。OK。



系列 6:P199:RabbitMQ上的一个queue中存放的message是否有数量限制? - 马士兵学堂 - BV1RY4y1Q7DL
我们再来看一下这一道rapQ的面试题,它来自于腾讯啊,对应的薪资是25K岗位高级开发rappingQ当中的Q,它存放的message是否有数量的限制,这个限制是多少呢?首先大家应该要知道。
其实在rappingQ当中,这个Q对应的就是存放message的一个队列。一般情况下面,我们可以这么去认为,在这个Q当中,它应该是一个无限场。就是作为我们rappingQ当中,你存放的这个Q啊。
理论上讲来说它应该是没有限制的啊。当然回答这道问题的话呢,你不能这么绝对啊,我们可以看到。😊。

嗯,你怎么去回答呢,都不是太合适啊。比如说你回答没有限制,好像呢也是不行的啊,但是默认情况下面它是没有限制的。它可以通过一个参数来进行限制啊,它也不是我们经常所说的什么1024啊。
4028还有一些其他的数数字,我们可以看到在这道问题当中,默认情况它是无限制。就是你rapq当中的内存有多大。那这个Q它就可以多长。但是呢我们知道如果你的消息过多的话。
它肯定会导致我们rapq处理这个消息的效率它会下降。因为这个对立过长的话,那么我们知道第一个内存占用的多。第二个的话呢,你要把这个数据从这个内存里面拿出来啊,相对来说呢,它效率要低很多。
所以我们可以通过对应的参数来限制,这个参数叫做X杠m杠啊,这样一个参数。这个参数的话呢,请注意这个参数它是限制消息的调。😊。

数啊,比如说这个设置成100万,那么队列当中的消息就不能超过100万。另外的话呢,还有一个限制参数叫做X杠m杠be,这个呢是限制我们消息的总量。比如说我们的消息总量限制成200兆。那么在队列里面啊。
单独的一个Q里面它就不能超过200兆。所以我们可以通过两个参数。第一个参数是消息的条数。第二个参数是消息的总容量啊,两个方面,对rapbinQ当中的Q进行限制。😊,所以的话当面试官问这样的问题的话。
他其实就是有一定的欺骗性。就是他问你的限制是多少。很多人呢可能是啊去绞尽脑汁想一想,哎,这个rapQ当中的这个mes是不是限制是多少呢?随便猜个数啊,如果这个数量。😊。

就是你随便说一个的话,那么这个答案明显就是错误的。应该说默认情况下面它是没有限制。但是我们可以通过两个参数来控制一下rapq当中这个Q的数量和Q的容量。通过这样的方式呢,我们可以去稍加限制。😊。
所以呢这就是这道面试题,他回答的一个重点和核心。

系列 6:P2:10种垃圾回收器(一) - 马士兵学堂 - BV1RY4y1Q7DL
好了呃,当我们讲完这个之后呢,下面我们就来聊呢,就是在java horse one里面啊,注意啊,我现在跟大家聊的都是hot spot这个小小的概念,需要你理解一下,就是我们平时所说的jvm啊。
它是一个规范,我刚才说过了,规范是什么东西啊,又是个标准吗,真正的具体的实现是每个厂商自己去实现的,各种厂商都有自己的实现,最流传最广泛的实现当然就是oracle的实现,它叫做hotspot。
当然oracle还收购了ba va公司的,原来的实现叫做grocket火箭,这哥们儿这俩被合并了,合并到一起啊,目前的都叫做hosport呃,当然还有ibm的g9 啊,还有那个如果公司的zm啊。
这是号称世界上最快的gbm了,但是它是收费的啊,嗯还有那个那个你像淘宝淘宝的淘宝vm啊等等,这些个都叫做jvm,因为它是符合jvm规范的,今天我们要讲的内容,大多数我所说我一说这vm指的是谁呢。
特定的啊,指的就是hot smart,就是oracle自带的这个,那么在oracle自带里面呢,由于呢他要进行各种各样的垃圾回收,所以在oracle自带里面呢,我给大家总结了一些一些一些东西啊。
就是oracle呢到现在为止,从jdk一点零一直到现在的jdk 14,一共诞生了十种垃圾回收器,而这个图的话呢,我希望你背过,你跟面试官要聊的时候,需要侃侃而谈啊,需要了解这些内容。
有些东西呢你就算原理性的东西还不理解,但是你必须得知道他的名字,cdc谁能给我absolute,我们先说结论,目前在做大多数的啊,我不是特指某个人,而是指在座的诸位嗯,开个玩笑。
你们你们在你们在线上系统里头啊,都会有垃圾,你们线上系统多数用的都是哪个版本,你们自己了解吗,多数用的应该都是1。8啊,还有依然依然少数的是1。7,超级少数的是1。6,比这小的感觉就少了,1。8的居多。
所谓的垃圾回收,所谓的j v m调优,大家听我说,你如果在线上系统要进行调优的话,第一步你需要做的就是你,你要确定你们现在用的是哪个版本,你们现在用的是哪种垃圾回收器,这个影响是超级巨大的。
不同的垃圾回收器它对内存的管理是不一样的,jvm的内存管理是由垃圾回收器来决定的,到现在为止一共有十种垃圾回收器都可以用的,我们先简单过一下,前面六种叫做分带模型,就是内存里头能分成两代,叫分带模型。
用到的垃圾回收器,后面这三种g one呢叫逻辑分带,物理不分带z dc叫逻辑不分带,物理也不分担,shindo跟z dc是竞争关系,他们两个算法差不了太多,excell是jdk 11新出的这个东西。
测试用,以及在特殊情况下不需要垃圾回收的时候使用,你就只管分配,不管回收,他什么事都没干,这是非常特殊的一个啊,今天我跟大家聊的,其实我跟大家聊清楚前面六个就很不错,作为咱们来说呢。
你如果不理解前面六个的话,你后面这三个也很难也很难理解嗯,尤其是你不理解c m s,你根本就理解不了g one,所以我们看今天时间啊,而且尤其由于大多数同学啊,你们在真正的线上系统里头。
如果你没有没有做过任何的调优,没有做过任何的设置的话,默认的是这个组合叫po skyline以及pyo,有同学说老师我怎么知道我用的是哪种啊,一般情况下你有好多工具可以用来定位它。
教大家一个实战的小命令,比如我们要起个java虚拟机,不都这么起了,这么version,只要你敲一个java命令,直接一程序,它就启动了一个java虚拟机,嗯一般大家现在用的最多的就是1。8,那么1。
8它默认的垃圾回收器是什么呢,用这个命令可以把它给找出来,java杠嗯,嗯x x print cmon flags,jership呃,你会看到呢他有这么一个组合叫use parallegic。
这是它自带的默认启动了自带的参数,这个参数呢叫use paralyc,使用的是并行gc,当你看到这个参数的时候。

对应的就是parallel scavenge以及parallel old,那有同学说老师这我哪知道啊,我看到他的参数,我也不知道他是哪种组合呀,没关系,叶老师这么贴心的人,一定会告诉你会给你做总结。
所以呢大家不用担心呃,在这里呢我给大家做了总结啊,你找找常见的垃圾回收器组合参数的设定,1。8的,比如说你用了seridc指的是什么,用的是png c指的是什么。
用的是concurrent mark swift gc又指的是什么啊,g ug one g ci又指的是什么,k linux底下怎么查,windows底下怎么查,都给你记清楚了。

所以我的今天敲的命令,如果大家没有跟上,不用担心,明天听完课,这个文档就发大家了好吗,来可以继续的给老师扣一,文档呢我有时候会调一下啊,所以咱们听完课统一发,好要聊清楚这些垃圾回收器的话。
我们先聊清楚这个分带模型,分带模型,注意我再说一遍啊,你如果你没调过你的垃圾,回你的那个线上的系统的垃圾回收器啊,就是分带模型,所以你先理解分带模型,分带模型是什么意思,分带模型是说。
这个垃圾垃圾回收器在管理整个空间的时候,整个你们的内存空间啊,你家这块地归你妈妈管,说这块地专门扔白线团,这块地专门扔黑线团啊等等,这个是归他管的,那么呃作为流传最广的g d一点八。
默认的它的一种垃圾回收器的组合,叫p s加p o好,这种组合对于整个内存的管理是分带的,叫分带分带模型,分类模型是什么意思呢,就是他会把内存这么大块,那么大块内存分成两大部分。
一大部分呢就这部分叫做新生代,或者叫什么年轻代,第二部分叫什么叫老年代,那有的同学可能会说,这东西为什么叫新生,这东西为什么叫老年,很简单,当我们新诞生一个对象的时候。
尿出来一个刚刚的比较新的新对象的时候,扔到年轻的,每经过一次垃圾回收,它的年龄往上涨一岁啊,这里刚有一个新生代的,经过一次垃圾回收,这哥们儿加一经过一次垃圾回收,这哥们儿加二好到一定的年龄之后。
说这哥们儿太顽固了,经历过了好多次的垃圾回收都回收不掉,它进入老年代,老年代空间空间表达,什么时候老年代空间站满了,再也分配不下新的对象的时候,整体性的开始回收,o这是新生代和老年代的概念呃。
那么在这里呢新生代和老年代呢,由于它的这种特性不一样啊,然后呢他的采用的算法也不一样,呃这个算法是什么样的呢,听我给大家解释,作为新生代来说,根据大多数的程序的统计,这个新生代的对象啊。
在经过一次垃圾回收之后,当然这个垃圾回收叫做新生代垃圾回收,由于它叫y,所以一般呢我们读文章的时候,也会看到这个词的缩写叫什么呀,叫y g c叫年轻代gc,这叫做年轻代的垃圾回收,年轻的垃圾回收。
一般的情况下会回收掉大量的对象,也就是说一个对象啊经过年轻的对象,经过垃圾回收的时候,大概率的会被清掉,为什么呢,比方说我们经常你看啊,这种for循环里边产生的各种的,但是for完了之后。
new new完了之后大家知道吗,for循环结束之后,里边的里里里里里里边的对象都没用啊,对不对,只要没有引用指向它就没用了,像大量的这样的一些个对象,经过一次垃圾回收,它就会被清掉。
那这种呢叫yg c,由于大量的对象会被清掉,根据以前的多数的程序的一个统计结果啊,90%以上的新生代对象,在垃圾回收之后都会被清掉,那会剩多少了,10%,那如果是这样的话,我们采用什么样的算法合适呢。
我们采用mark sweep合适吗,采用mark compact合适吗,都不合适,因为mark wap和mac的,你都要从根上开始搜搜搜特特别特别多,你才能把这个对象的都给搜出来,但是存活对象都特别少。
非常少,我问我显然就没必要这么干,那么这时候他怎么办呢,他都要都要都要,这时候他怎么办呢,他是这么办的啊,既然啊他在呃就是年轻代里头呢,在进行了一系列的小分区,这个小分区是怎么分的呢。
大多数都存活的对象进入到叫一个伊甸园里头,叫伊甸区人类人类诞生的地方,刚才我们说过,我们说呃一个对象了,这十个对象一次回收很可能干掉其中的九个,就剩一个,那如果就剩这一个的话,你们你们好好考虑一下。
如果这时候用mark sweep或者mark compact都不合适,为什么你需要再标记出来,把这把这九个全标记出来,再清理一遍,太浪费了,太费太费时间了,效率不高,所以这时候怎么办呢。
它采用的是叫做拷贝算法,它采用的是第二种拷贝算了,在拷贝的时候就是把拷贝你们还记得吗,就是把那个活着的拷到另外一个地方,有没有印象,把这个活对象考到另一个地方,那活着对象考到哪去呢。
活着的对象直接拷到另外一个区,这个区呢叫silver silver区,我再说一遍,一个新的对象诞生,经过一次拦截回收之后啊,其余的哥们儿都被回收了,这哥们活着,这哥们儿活着呢。
会直接给拷贝到另外一个区域里头,这个区域叫survivor,拷过来,考回来之后,整个区域咔嚓就全部回收了,所以这个效率非常高,当然咔嚓回收了之后,下一次又有新的对象诞生了,这个对要有新的意思。
那就回收来了,这个呃对象呢又被回收一次,这时候它会又拷贝一次,拷贝到哪去呢,拷贝到survival 2,拷贝到这里,然后这个survivor唉整整体清理一遍,所以这东西呢它的效率就会非常高,为什么呢。
因为他只需要遍历到那些有用的就可以了,便利贴有用的就只占了10%嘛,把这11%拷贝,我就不需要去标记那些没有没有没有用的,那些没有用的又特别多,所以我的效率就会比较高,这是拷贝算法。
因此在年轻代里面使用的就是拷贝算吧,但老年代不一样,老年代是那些特别顽固的,老是回收不掉的啊,这种的特别顽固的,那这时候呢你采用的算法呢,就不能像年轻人一样,不能够拷贝来拷贝去,那怎么办呀。
采用的就是mark compact或者是mark sweep,就是从根上找,找出来之后,这个有用的,找着了没用的标记出来清掉,采用的是这样的算作,因为为什么不能用拷贝,你如果这里用拷贝的话。
你每次拷贝的东西太多了,他们都太顽固了,100个对象里头有90个需要拷贝,你的效率显然就变低了,所以我再回顾一下,我记得我刚刚讲的这段内容啊,这是最基本的jvm的理论呃,如果这个都不了解的话。
你跟面试官肯定是没得聊,所以你从这儿开始好不好,我再说一遍,内存呢一般嗯对内存分成两大部分,第一部分呢叫年轻代,第二部分叫老年代,也就是说比例是多少,默认一比二,你自己可以设。
那么年轻代里头呢又分三个小3333个分区,这三个分区呢分别叫依恋区,s区,s区,当然有人叫s0 s1 ,有人叫s1 s2 ,有人叫from to,无所谓,他叫啥都没关系,指的都是一回事儿,好了。
让大家更理解这个算法,我用一个动画让大家更理解这个算法,一个对象产生了之后,它会进入到stack,当然stack比较超级,有点细节了,我们先把它略过好吧,我们不去管它,总而言之,一个对象产生之后呢。
它会进入到一店区,如果这个对象被回收一次,会进入到s1 ,好如果这个对象再被回收一次,会进入s2 ,如果这对象再未回收一次,又进入s1 ,如果这对象再回收呢,又进入s2 ,什么时候它会进入到old区呢。
年龄够了,这个年龄是跟特定的垃圾回收器有关系的,年龄多大才能进呢,可以通过参数进行设置,max tenure and resu,ok一般的普通的垃圾回收器的组合,他的年龄默认值15c m s的默认值六。
啊都给我讲,到现在为止,不知道大家是不是,能理解这种基础的分类模型了,来能够get到来老师扣个一好不好,但是里面还有好多好多好多好多小小的细节啊,我还是那句话,但学东西呢暂时要忽略细节。
然后回过头来再去找细节,先学梗概,先学脉络。

系列 6:P20:小程序演示 - 马士兵学堂 - BV1RY4y1Q7DL

两秒九,这是毫秒,两秒九,大概三秒钟左右吧,有同学说老师你想干嘛。

这个这个刚才这小程序能跟得上的,来给给老师扣个一,没问题吧,小程序比较简单啊,简单解释了一下好,同样的程序我做了一个小小的修改啊。

注意看啊,这个小修改呢干了这么一件事,还是那个x,只不过呢我在前面怼了一堆的p一到p7 ,long类型的,我在后面怼了一堆的p9 到p 15 long类型的,这些值都没用,就是用来占空间的。

其他的代码都没变,依然是1亿次的循环。

依然是第一个线程就改第一个x,第二个线程就改第二个x跑一下,一秒三诶,刚才是多少,两秒九,现在一秒三,what what's up,发生了什么,好,同学们拿大腿给我好好想一下问题到底出在哪。
为什么会有这么明显的效率的不同,为什么,问题出在这儿,同学们,你们想想第一种模型的情况下,这个x一和这个x2 挨着发现没有,他们挨着注意,这是long类型,long类型是八个字节。
一个long类型是八字节对吧,这也是八字节,我们还记得呢一个缓存行是64字节,所以这时候极有可能发生一种情况,这哥儿俩位于同一行里头,在同一个块里头,很有可能这个块第一个线程嘛。
被缓存到了第一颗cpu里,这个块与此同时又被缓存到了第二个cpu里,那么由于我第一个线程玩了命的改x1 ,我改完x一是不是得通知你另外一颗线程啊,说我这个行失效了,你是不是得存内存里头重新读啊。
大哥我通知你一遍,你得给我重新读一遍,我通知你一遍,你给我重新读一遍,这哥俩位于同一行,互相之间修改之后会造成效率上的降低,居然而第二种编程方式,第二种编程方式是这样的,注意看这是我们的x1 。
可是很不幸的是,诶前面这个x前面怼了七个long,我刚才说一个long类已经八个字节,七个long一共是56个字节,他在后面又怼了七个浪,又是56个字节,他自己占多少八字减。
所以这哥们无论跟前面组合跟后面组合,跟中间组合,无论如何,都不可能和其他的另外一个x2 位于同一行,那既然不位于同一行的话,你们拿大腿想一下,作为第一个cpu来说,我只改x1 。
反正不可能有其他的那个行,有其他那个cpu跟我这个x一做共享,那我还用通知你吗,你改你的x2 ,你跟我有半毛钱关系吗,就在缓存里玩命改,改完之后刷回内存就可以了,而第一个呢就是玩命给x一刷分。
你用我不用通知另外一行说失效了,所以这个效率非常的高,o,好能get到这点,同学老师扣一,有同学可能会说,老师真的有人这么来编程吗。

真的有有一个著名的框架,这个框架呢叫this raptor闪电,我说有没有没有人听说这框架,如果你面试的时候能把这个东西给说出来,那面试官肯定是高看一眼,this roger闪电好,闪电的意思是什么。
就是那个最单机最快的mq,应该说它的核心呢是一个你像别人家的缓存呃,都是一个呃,不管你是链表还是数组,一个一个头指针,一个尾指针来做你的缓存,但是mq吗存消息吗,但是这哥们儿是一个环形列表,环形队列。
环形队列它只有一个指针,这个指针来回的转,你知道吧,转到了头之后,转到尾之后就从头开始来回转,它只有一个指针,而且多线程访问的时候,他对这个指针做了一个优化。

做了什么优化呢,看一眼,呃disruption,这是他的那个环形环形缓存,叫rain buffer,rain的意思是环buffer是缓存环形缓存,你们看他的代码。

点进去之后,你会发现一个奇奇怪的代码,这哥们儿后面怼了p一到p7 ,看到了七个long,半毛钱没用,就怼在这用的这个叫缓存行的对齐,好来看这里有同学说他只在后面对了,前面有没有怼啊。
你们看你们看这个rain buffer他是从谁继承的,从呃rain buffer fields继承,我们看他的父亲,remember fields又是从rebuffer pad继承。
而remember pad本身没有别的七个类型的long,所以他前面对了七个,后面得了七个缓存行的对齐,还真有人这么写程序,因为作为disruption来说,他追求的就是效率上的完美提升,追求极致效率。
这就是现在有人在招招聘成员的时候,经常会说对代码有洁癖,什么叫代码洁癖,ok这个算一种对cpu的性能要压榨到极致,什么叫压榨到极致好,这是一种,当然如果你读过jdk,1。7的源码,jdk的作者道个理。
这大哥就在1。7的concurrent hashmap里面,就用这种写法了,就是强迫这个值不和其他值位于同一行,橘啊,橘猫这样大橘这样也会存在浪费吧。

我告诉你局,这个我是我这事得报了你啊,报了你这个局啊,开个玩笑,那个,空间换时间,这是经常提高效率时候的使用的一种方式啊,经常经常经常使用的用空间换时间,好多时候那个面试题。
算法题里头非常多的这种应用的形式啊,你要想到这一点,不存在一种说非常完美能解决问题,而且也不多多消耗资源的,不存在没有,如果那样的话,就有银弹了,不可能好了,看这里,当然jdk一点八之后呢。
其实又增加了一个一个。

这个其实讲起来就没啥意思了,因为jdk一点九又把它给删了。

就增加了这么一个注解,看看啊,啊。

那么jdk一点八呢增加了一个注解,这个注解呢大家理解有这么一个东西都可以诶。

我是放在哪儿了。

fty sharing,这个注解呢叫contented啊,就是这个注解,这注解呢只有1。8能用,你过了这版本还不给你用了,呃,这个注解呢就是我绝绝对的,让我下面这两个值问不是位于同一行。
那这个呢也能明显的体现出来他们的差距,但我建议大家呢也不要不要不要用,这个没啥意思,给大家讲一下这个注解吧,简单说一下啊。

呃一般来说除了面试,没有人会问这玩意儿还是同一个程序啊,大家注意看,我依然是这个t里边有个x,然后一个线程不断的改x1 ,另外一个线程不断的改x2 ,现在呢我跑一下这小程序,两秒一。
假如我要把这个注解打开a,同时呢你还得开一个参数,必须打开这个参数叫restrict contained,这时候它的效率呢就会明显提升一秒二,看到了吧,当然呃这种就是属于什么级别呢,奇技淫巧啊。
这属于就是俗称的奇技淫巧,这个这个这个这个东西,但不建议大家去呃,用在你真正的编程里头用这玩意儿,还是那句话啊,面试官你你你把它调起来打就可以了,你了解了之后呢,吊打面试官就行。
没有必要在你实际场景之中用这个好吧,这有点过了就好了,我讲到现在为止,我相信大家应该能理解。

这个缓存行的一致的概念了,到底什么意思了,呃还是那句话。

就是好多东西呢,你得通过编程来才能够深入透彻理解,就是我们学代码的得通过代码来展现好了,缓存好这个概念,我就讲到现在为止来可以继续的给老师扣个一,呃下面我们来聊另外一个非常重要的概念,这才是比较难的。
经常会被问到的问题就是volatile,还有一个作用还记得吗,volatile第一个作用叫保持线程可见性,第二个作用叫什么,第二个作用叫做禁止指令,重排序,下面我们来聊重排序这个概念,什么叫重排序。

重排序就是乱序执行。

系列 6:P200:说一说RabbitMQ中的AMQP - 马士兵学堂 - BV1RY4y1Q7DL
我们再来看一下这样的一道面试题,说一说rappingQ当中的AMQP。这道面试题呢来自于阿里巴巴薪资是25K对应的是高级开发。那么你要讲清楚这道面试题的话,首先我们需要去讲清楚两个点。
第一个AMQP是什么,第二个q当中的MQP是什么?首先啊我给大家进行一个对应的分析。作为AMQP的话呢,本质上面它是一个协议。就是QP它的英文全称叫做ad messageq就是高级消息队列协议。
这个协议呢它是通用的啊,它也不是说是q专有的,只是说q里面呢,它是默认情况使用的是AMQP这种协议。😊。

所以我们可以看到,如果你要在rapq当中去讲清楚MQP的话,首先你要画出一个rapQ。好,假设这个地方是一个rapQ。那么在这个rapq当中,你为了去完成这样的一个协议。一般情况下面呢,它会有两种角色。
一种外部的角色叫做生产者。除此之外的话呢,还有一种角色叫做消费者。其实作为生产者和消费者,他都是rappingq的一个客户客户端。那么rappingq它就是一个服务器。那么首先消息它当然是要进行发布的。
所以当我们生产者去发布消息的时候,作为AMQP协议,它会有一个东西要做,就是他需要去把这个东西对接到里面一个叫做交换器的东西。交换器。所以在rappingq当中有一个很重要的组件叫做交换器啊。
英文单词叫做exchange。好,那么我们去生产发送消息的时候,就发送给这个exchange。注意在发送的时候呢,我们称之为消息的发布。在消息发布里面,你的这一条消息一般都要带上一个路由件。
这称之为叫做。Root。就是你每发送一条消息,你必须要指定一个K啊,这个称之为路由器。那么发送完之后的话呢,在这个交换器里面,它会做一个什么事情呢?它会跟我们的这一个Q这个队列进行绑定。
比如说这个地方它有一个队列一。😊,对列,然后呢是Q。好,那么我们在rapq当中,一般来说会建立我们的一个队列和交换器的一个绑定关系。我们称之为帮定。这个绑定关系呢,它是这样的,在很多情况下面。
它也是通过一个叫做绑定。的路由。贱啊。来进行处理的。举个例子啊,在reconQ当中它会有几类这种交换器。这个交换器的话呢,举个例子它会有一种叫做直接交换器。😊,直接交换器叫做drick的交换器。
那么这种交换器的话呢啊比如说路由件里面这个键值是多少?😊,是李景。好,那么你就绑定一个键李紧,然后绑定到我们的队列一啊,这是我们的Q1。这个时候你发送消息,比如说这条消息里面你的这个root key。
😊,啊,简称T啊,它等于李锦的话,那么这条消息就会被我们的交换器,然后把它路由到我们的队列一当中。也就是说你在发消息的时候,如果通过一个direct直接交换器,那么绑定了一个对列一。
那么对绑定的这一个键的名字是李锦的话,那么你去发送一个路由件,对不对?这个时候他带了李锦的标识,那这条消息消息就会被路由到我们的对列一OK啊,当然如果你发送的这个路由件里面,你放了一个李锦2。😊。
不好意思。😡,这个地方它识别不到,或者你发送的一个叉叉叉,这个东西跟我们的路由件没有绑定关系,或者是说在我们的rapq当中,我们找不到对应的交换器和我们队列的绑定关系。那么这条消息它就丢失了。😊。
就是你发送的时候,他就找不到对应的绑定关系。OK那么除此之外的话呢,作为MQP的话,我们要是我们要进行消费。那消费者他就会进行对应的一个投递,对不对?比如说把这个对列一的东西投递给我们的这个消费者一。
那么这个时候的话呢,这一个Q等于李紧的这条消息就会从这个Q,然后投递给我们的消费者一。所以呢这就是AMQP它的一个整体。😊,其实AMQP它的一个整体的关系有几个核心的组件。第一个交换器。第二个队列。
第三个的话呢,交换器和我们的队列当中会建立绑定关系。😊,当然这个绑定关系的话呢,它会有跟交换器它就会有不同。因为交换器里面呢,它可以有direct直接交换器,也可以有这种主题交换器。
就是支持我们的这个正则表达式的。比如说你配置一个新可能匹配的所有啊,然后呢你还可以配置一些其他的啊绑定关系的话呢,也不是说单纯一种可以有多种。
与此同时你的队列也可能有多个可以去根据你的路由去建立不同的绑定关系。然后呢,让我们的生成者根据你发送的时候的不同的路由件,然后根据绑定关系投递到不同的队列当中。然后这个队列的话呢。
就可以去交给我们的某一个消费者来进行消费。所以这就是AMQP在rapQ当中它的一个整体流程。😊,所以回到我们的这个面试题,说一说rappingQ当中的AMQP。
首先你必须要知道AMQP是一个消息队列协议。然后呢,在rappingQ当中它是怎么实现的。它的核心有交换器,有队列,有绑定关系。同时你去发布消息的时候,有路由件。
然后根据你的路由件再去找合适的这样的一个绑定关系,让我们通过这个交换器啊,给它进行对应的投递啊,投递到对应的Q之后的话,每一个Q啊都可以去指定一个消费者,然后进行对应的一个消费。所以这道面试题的话呢。
它考核的点,第一个是协议。第二个是考核你对rappingQ它的内部机制是不是熟悉。😊。




系列 6:P21:CPU乱序执行 - 马士兵学堂 - BV1RY4y1Q7DL

我给大家画个图,小小的图,好听我说这是我们的第一颗cpu,现在呢我假设这个cpu呢目前正在执行指令,执行两条指令,这是第一条,这是第二条,仔细听,现在呢大家写程序的时候,我上面写一条指令。
下面写一条指令,我们往往会认为说我的,我的前面这条指令应该是先被执行,后面这条指令应该是后备执行,我们往往是这么来认为的,这个很正常对吧,你第一个写的写的代码和第二行写的代码,你往往会认为第一行先执行。
第二行后执行,但实际当中是这样的吗,我先告诉大家,结论,在你实际在cpu里运行的时候,很可能第二行先运行了,很可能第一行跑到第二行后面来了,这种呢叫做乱序执行,当然乱序执行的时候呢。
需要他有一点点的呃这种约束条件啊,就是你前后不能有依赖关系,你不能说第一行代码是x等于一,第二行代码是x加加,这肯定不行,因为我x加加需要依赖于你前面这个值,所以在你编译器经过了一系列的优化之后。
认为你前面前后这两条指令不存在,依赖关系的情况下,这两条指令有可能会被换顺序,这叫乱序执行,为什么要有这个东西,是为了提升效率,为什么要提升效率,我们假设第一条指令,第一条指令是去内存里头读一个数据。
而第一条指令是一个简单的计算,第一条指第一啊,第一条啊是一个内存里读数据啊,y等b第二条指令x加加好,我这是一个左简单的计算,我x这已经缓存进来了,我直接做计算就可以。
y等于b我需要找到b那个位置赋值给y,我需要从内存里头把这个b这个值读回来,大家应该知道我刚才说过,我们cpu的速度比内存的速度快100倍,那我等你回来,这个速度我有99个时钟周期,我是在这里浪费的。
如果在这个99个时钟周期,我就在这干等着,我的效率当然就低了,那我可以怎么干呢,我发现后面这条指令,这哥们儿跟前面这条指令没有直接关系,怎么办,先拿你过来执行,这个很简单。

一个道理,好这块能理解的同学来给老师扣个一,有问题你直接说啊,有同学可能会说,老师真的会存在乱序吗,真的会存在,老师你能证明吗。

完全可以,凡是不能被证明的理论,那个都不是理论啊。

都不是很好的理论,看这里。

这里有一个经典的小程序,我先跟大家一个小程序,这个小程序不是我发明的,这个小程序是以老外写的,是最早是拿那个c语言写的。

最早是拿c语言写的这个m那个项目里头。


好看这里啊最早是拿c语言写的。

后来呢嗯有人拿java它修改了一下,然后我拿过来给大家做演示而已,我觉得小程序设计的非常的精妙,我再说一遍,下面这个小程序向你证明有乱序存在,如果这里面会牵扯到一点点的逻辑推理,如果这话你听着费劲的话。
你就记住结论就可以了,就是确确实实会有乱序存在,好仔细看这个小程序是怎么证明的呢,他这么来证明有四个值x等于零,y等于零,a等于零,b等零,然后不停的死循环启动两个线程,这是第一个线程,这是第二个线程。
第一个线程干了件什么事,设这个值a等于一,x等于b,第二线程干了一件事,b等于一,y等于a,好证明来了好听证明是怎么来的呢,才这么来的,那个就说我们来推算一下,如果这两个线程放在我们cpu里执行的时候。
最终出现的x和y的结果会是多少,会有可能是多少,我们第一个假设叫不存在重排序,就是不存在乱序,不存在乱序的意思就是a等于一,一并发生在x等b前面,b等于一定发生在y等于a的前面,那么我们来推推算一下。
这四条指令最终执行的结果会是什么样呢,有可能是这种这种组合a等于一,x等于b,接下来b等于一,y等于a来推算一下这种结果的情况下,最终的结果值是多少,x等于零,y等于一,没问题吧,y等于a吗。
a已经等于一了,当然哇,杨琪琪啊,翔啊,这这个杨茜茜同学果然快啊,这带翔的东西太快了。

哈哈杨茜茜,对排列组合00011011啊。

你虽然很快不便秘,但是不好意思,你的结论不对,为什么,因为我们排列组合一下,只要不发生重排序,会是这种情况或者是什么情况呀,a等于一,b等于一,x等于a y等于b啊,x等于b y等于a无所谓啊。
反正这种情况总而言之,x值或是减x等于一,y等于一,当然还有其他的组合情况,还有其他什么组合呢,就是呃b等于一先执行,然后呢就反过来嘛,这哥俩最后你算来算去,会是这么几种组合,011110。
绝对不可能出现x等于零,y等于零,那反过来说啊,我讲到这儿能跟上吗,能跟上同学给老师扣个一,没问题吧,你你只要认真听啊,就这块都是这个推,这个推理呢,差不多就是一个初中高中的一个水平。
当然你实在听着费劲就算了啊,这总而言之,这四条语句你就当成四条指令,这四条语句有可能发生重排序,但是我们假设它不发生,如果不发生的情况呢,绝对不可能出现最终x等于零,y等于零的情况,不可能出现这种情况。

如果出现这种情况了,那只能证明一点,要么x等于b跑a等于一前面去了,要么y等于a跑b等于一前面去了,要么这哥俩都跑前面去了,听懂这意思了吗,那它会出现x等于0y等零吗,跑一下,这个看运气,运气好的话。
分分钟就出现了,运气不好的话,十几分钟才能出现,今天运气不好,这两天水逆,直接给大家看结论吧,就是我原来曾经跑的时候啊,大概我我曾经我截过截过两个图呃,第一次跑的时候,272万次的循环才出现了零零。
第二次呢是11万次的循环就出现零零,所以这个东西呢就得看看看人品了好吧,我们可以放在他这边,先让他等着他执行,一会儿,一会儿你会亲眼看到零和零零的出现,o说一下catch,ok啊,不论如何。
通过这个小程序,你完全可以证明一点,就是确确实实cpu会存在乱序执行,那有同学可能就会说了,老师这乱序执行会有什么问题吗,当然会有问题,以前有好多那个特别面试的时候,特别变态的程序啊。
我在这儿我就不专门给你讲了,主要就是由于乱序执行的存在,今天讲一个比较变态的面试题,这边变态的面试题呢叫呃,d c l要不要加volati呃,这个是超级变态的一道面试题啊,特别恶心。
因为这里面概念特别多,什么叫dc l,你要知道volatile禁止重排序,就是volatile呢可以禁止指令,让他不要给我重新排序,这两条指令我先写的,必须给我先执行,我后写的不可以给不可以跑到前面去。
好吧好仔细听这个过程讲给大家听,诶今天运气这么不好吗,这么长时间了,还没执行出来,放一边吧。

先让他跑着好,一会儿我们就会看到结果啊,不管你好听,这里面有好多好多非常麻烦的概念。

我一点点扣给大家听,什么叫d c l啊,什么叫那个呃volatile是怎么禁止的,为什么要加volatile等等,好看这里。

感觉有点多啊,你做好心理准备,不要走神,我先解释什么叫tcl好吧。

dco呢是双重检查单例哈。

deca double check lock,为了给大家解释清楚。

我从那个从最开始开始给大家解释什么叫单例,需要我需要我讲吗,需要我讲的,给老师扣二,什么叫单例,单例也需要什么,各位大哥,你们真的需要加强了,技术太弱了啊,大家看这里单位是啥意思,单例是最简单的解释。
当我有一个class,我不允许他new好多个对象出来,我只能允许他new一个有且只有一个对象,这个叫单例,单例模式,好单例模式是什么一个概念呢,大家看这里单例模式的概念就是诶,你看啊最简单的一个写法。
manager 01定义一个instance,new一个manager对象出来,我上来二话不说,先把它new出来,这是最简单的写法,你不是要一个单例吗,我就把它给弄出来。
然后我把它的构造方法设为private,我不让别人扭,只让我自己,我自己已经扭完了,那么谁来访问我这个对象呢,访问我这个对象的时候,提供一个方法叫get instance,谁要是访问的时候。
麻烦你调我这方法就可以了,我返回的永远都是同一个这个对象,所以不管你调我的方法调多少次,一次两次,最后得出来的结论一定是同一个对象好,这是单例的最简单的写法,来读懂这个小程序的老师扣一。
这个比较相对简单一些对吧,应该都能读懂,这就是单列最简单的写法,但这个单列最简单的写法呢会有人有意见,尤其是我们处女座的人,他们比较龟毛,然后追求完美,他会挑毛病,他会说大哥我还没用到这个单位了。
你干嘛就直接把它给弄出来,你new出来不要消耗资源吗,不要占空间吗,不要占时间吗,能不能等我用到它的时候再给我new,不用到它,你不要给我new,所以就诞生了第二种解法。

第二种解法什么意思,第二种解法就是就是这样来玩。

我给它定义这个变量。

但是我并不把它new出来,什么时候把它new出来呢,谁要是调用我这个get instance方法,我上来先判断哥们儿,你是不是依然为空呢,没有人溜过你啊,如果没有人扭过你的话,我把你弄出来。
如果有人扭过了的话,我直接返回就可以了好了,这种就叫懒汉式的,我特别懒,什么时候用到我了,我才把它弄出来,ok这是懒汉式的,这是第二种写法,这个写法没问题吧,当然这个写法的问题在于在于什么呢。
处女座的人又来了,说哥们儿,你这个不能保证线程多线程的一致性啊对吧,这你能保证一致性吗,不可以,最简单的道理嘛,一个线程一个线程来了,判断你是不是为空,是为空,一个线程先暂停,第二个线程来了。
判断你是不是为空,依然为空,所以第二个线程new了一个出来,第一个线程继续执行的时候又new了第二个出来,因此在多线程访问的情况下,很难保证你拿到的是同一个实例,那怎么保证多线程的抑制性。

拿大腿想想最简单的办法不就上锁吗,所以我给这个方法上把锁,synchronize,get instance,这个就保证了谁要来访问这个方法的时候,同一个时间段只能有一个线程,那等得等我这个方法执行完了。
另外一个线程才能继续去访问,这个肯定没问题,10000%都没问题,但是处女座的人又来了,他会说哥们儿,你这把锁的力度太粗了,什么叫左右太粗,就是你锁定的是整个方法,如果你这个方法里面有些业务逻辑。
这些代码是完全没有必要,放在我们的被锁的代码里边了,你能不能把锁的力度给它变细,这叫锁的细化。

所以就诞生了下面这种写法,我相信大家这块应该能读懂,给大家十秒钟,你读一读这个力度就放弃了,就是我拿到这个数值的时候,get instance,拿拿这个对象的时候,判断它为空,诶,你为空,我在上锁。
我上把锁,接下来我们还new出来,我不在整个方法上锁,你如果你原来有些业务代码没关系。

我不给你锁定,ok我想问大家的是。

这种方方案能不能解决一致性,可以不可以,我拿到的对象是同一个吗,唉大多数人都知道是不行没错。

为什么不行啊,想一下嘛,第一个线程来了,判断哥们儿,你是不是依然为空,是为空,第一个线程先暂停,第二线程来了访问哥们儿,你是不是为空啊,是为空,然后第二个线程继续运行,申请这把锁,没有人跟他抢,没问题。
上锁锁住new了一个对象出来,所以这哥们已经new了一个对象出来了,ok没问题,然后释放锁,第二个线程退出,注意它已经初始化了,第一个线程继续往下运行,第一个线程继续申请,这把锁能锁住吗,完全可以。
为什么,第二线程已经释放了呀,完全可以,所以第一个线程继续往下运行,又new了一个对象,因此这哥们儿扭了俩new了两次,最后执行的测试结果也能够证明这一点。

我起了100个线程,每个线程都调用get instance方法。

然后把他的hash code值打印出来跑一下。


最后你看到它不是一个high code值,肯定不是同一对象。

好了,同学们这块能跟上来给老师扣个一,那怎么改进这个代码呢,既要求要的效率要高啊,还是得懒汉式的,还得那个线程安全怎么改进呢。

好改进就在于下面这种写法,这种写法听我说啊,这种写法呢就是d c l这种写法,你可以认为它就是一种模式吗,好多好多的呃,这种这种开源软件用到的都是都是这种模式,比cl用的用的挺多的。
这tcl的杠杆是怎么干的,就是我一个线程来了,我判断哥们儿你是不是为空,是为空,我上锁,上完锁之后,我再判断一个底片,哥们儿,你是不是依然为空,如果你依然为空,那么说明我在上锁的这段过程中没有人改过。
你没有第二个线程把你给弄出来好,这样的一个方式是完全能够解决问题的,反复确认你是不是依然为空。

说为什么叫d c l啊,大哥double check lock。

check检查第一重检查,第二重检查两个check,中间加了一个lock,这叫double check lock,叫d c l,就这意思好,这是dcr单例,我相信大家应该能理解。
d c l单例到底是什么意思了,当然关于d cl单例,以前有同学有好多有疑问的地方,说,你干脆就别判断外面这层判断了吗,你不要判断了吗,你直接上锁不就完了吗,你上厕所之后判断它为空。
然后搞定不就可以了吗,来有这样疑问的同学,老师扣个一,有没有,给大家十秒钟思考一下,运用你们的大腿,听我说一句,这东西呢主要是为了提升效率的,你们知道吗,上锁这个操作它是一个非常重量级的操作。
判断这个操作只需要几个纳秒,非常简单的一个操作,现在假设有1万个线程同时来调用这个方法,同学们,你们拿大腿想一下,最终的结果会只有一个线程得到锁,把它给弄出来,如果上来我们就加锁。
剩下的9999个都要参与上锁的过程,效率就低了,但是如果我们在前面加了一重判断,那么剩下的9999个只用判断一次,我加锁的过程就可以省略了,因此效率就高了。

来能get到这一点吗,可以继续,同学老师,可以,好我们继续,但是这道题你只是明白了dcel单列也不行,这道题问题就出在他问你要不要加volatile,要不要在这里加volatile,为什么结论必须要加。
为什么这里边就比较深入一些,你们先得就等着这个答案,我先把代码呢给大家复制一下。

一会儿我们拿这个代码做参考。

好代码我先放一边,为了讲清楚这个问题,我们还得讲一个比较简单的理论啊。

这个小理论非常的简单,讲给大家听就行了。

随便写个小程序,就这个小程序啊,来这个诶,同学们看到了吗,第30万次循环的时候出现的00k,所以已经证明了乱序存在了,这个就不多说了。

总而言之,你只要让他跑,他肯定能证明往这看,现在呢我写了这样一个非常难的一个小程序,小程序特别难,看看你能不能读懂,ok,好的,看这里,这里面也是一道辩论题,叫做创建一个对象的过程是什么样子的,好听。
当我们new出一个对象来的时候,背后他到底执行了哪些操作呃,为了观察到这个过程,我需要看到它的二进制码,它的字节码by code。

view show by code with the class library,这是一个小插件啊,直接拿来用就行,比较简单,这是main方法。

找到我们的方法里面的main方法的一个实现,code好,这是翻译成字节码之后的这么多指令,就是java里面的这些指令,五条new一个对象需要在java内部执行五条指令,这五条这点字体比较小。
我给大家复制到ppt里。

打开,就这五条指令啊。
系列 6:P22:volatile如何阻断乱序的内存屏障 - 马士兵学堂 - BV1RY4y1Q7DL
比如说呢我们有一个class p,那么它呢有一个成员变量,好它有一成员变量呃,印度雷霆的m嗯,然后呢,当我new t t小t等于new t的时候,他执行的过程到底是什么样的。
刚才我们看到了他有五条指令构成,这条指令分别是new指令,duplicate,复制指令,这个先不管它跟咱们现在要讨论的东西没关系,还有一个指令叫invoke special。
还有一个指令叫a store,最后return指令跟咱们讨论的没关系,所以最核心的是这三条指令,这三条指令分别叫new invoke special和a store,现在大家还能跟上吗。
能跟上的老师扣个一,好可以是吧,可以我我我我要调整一下速度啊,好看这里这个new指令和呃,invoke special和a store,这三条指令构成了new一个对象的核心,这三条指令分别是什么意思。
仔细听我说这个new指令呢,大家知道我们有一个任何一个对象的时候,都是需要在内存里头开辟一块空间的,我得往里头装这个小m呀,我得装那个mark word呀,装那个class pointer啊等等,好。
我总是需要一块空间的,所以这个new指令就是申请一块空间,这是第一条,但是同学们你们需要了解到的一点是什么,当我们申请到这块空间之后,这块空间里一定有一个小m值存在好,这个m的值是几,如果是c。
如果是c加加这个m的值是不能确定的,是原来程序遗留的值,但是如果是java这个值是确定的,这个值叫做成员变量的默认值,这默认值是几呢,它是零,这个我觉得你你你学过最初级的jy c,应该就了解。
那默认值是零,所以当我们new出一个对象来的时候,他这个m的默认值是几呢,是零好,接下来下一步叫invoke,special叫特殊调用,invoke调用special,特殊特殊调用调用了一个方法。
这个方法是哪个方法呢,initialize方法,你说这个方法叫啥,构造方法,构造方法就是把成员变量初始化的,初始化的值是几呢,是八,所以在这个过程中,他会把零改成八好,第三步叫a store。
a s store的意思是小t,和真正的对象建立关联,把这个对象的地址值存到小t里,好看一下这个执行过程,当我们执行到new对象的时候,他会首先在内存里头开发空间,这个值几是零。
当我们执行到invoke special的时候,这个值才会真正的变成八,所以一个对象的诞生中间有一个半初始化状态,什么叫半初始化,就是m的值为默认值是零的这个状态,这个状态叫半初始化。
叫half initialized,好看,这里,接下来a a store的意思就是a这哥俩建立关联,第三条,有同学说老师您讲了半天,这东西跟那个volatile有半毛钱关系吗,有认真听。
这是刚才我们那段代码,我们刚刚证明了指令可以重新排序,我们刚刚证明了d c l必须前后都要加check,我们刚刚证明了你有一个对象,它由三条指令,最核心的三条指令构成,那么现在我们来仔细看一下。
如果发生了这种情况,对照代码,现在第一个线程过来的时候,现在我们要new那个单立状态的那个单位啊,比如说我们在new new这个单立状态的单位的时候,第一个线程来了,哥们儿,你是不是为空啊,是为空。
那他就上锁,上完锁初始化对吧,你这个对象吗,好new,当他new到一半的时候,申请了内存里边的值是一个默认值是零的时候,好在这个时候,正好在这个时候发生了指令重排序,啥意思。
就是下面这两条指令发生重排序了诶,再看一遍,我们现在正在new这个单例对象啊,new到一半的时候,第一个线程来了,上锁上完锁new new new到一半的时候,发生了指令的重排序。
看这里这个指令重排序发生的非常有意思,他会把a store one和inbox special调个个,有可能,那真正会发生一种什么情形啊,同学们,你们想想看a store one什么意思,叫建立关联吗。
那也就是说这个小t执行到这里的时候,here,这个小t已经指向了一个半初始化状态的对象,好这块还能跟上同学给老师扣一,那有同学可能就会说了,同学们,你们想想看,正好在这个时候,第二个线程来了。
第二线程上来先判断诶,哥们儿,你是不是为空啊,如果为空的话,我就再new你啊,但是你要你需要了解的是,这个t为空吗,不为空,但是很不幸的是,它使用的是一个半初始化当状态对象,结果第二个线程来了。
判断你已经不为空了,那干嘛,哎我就直接拿过来用了,结果我就用到了m等于零,这个值我本来想用的这个值是m等于八,这里面正好记录着双11的秒杀,成立了100万订单,正好记住了100万这个值。
结果来的时候本清零了,当然这种情况呢,其实呃绝大多数情况下不太可能发生,但是理论上是有这种情况存在的,好会问老师再看一遍呃,由于double check lock比较特殊,由于cpu会执行这种乱序执行。
它会存在这种现象,由于在java里面,你有一个对象的时候,需要分成三步来做,所以理论上会存在这样一种情形,第一个线程先上来判断哥们儿,你是不是依然为空,视为空,我就new你扭到一半的时候发生指令重排序。
结果t就已经不为空了,不为空了,我另外一个线程来判断,我就直接拿到了半初始化状态的对象,好,好了,所以必须要加volatile来这块能get到的,老师扣个一能理解吗,应该应该应该能听懂吧,好。
当然我估计会有同学,有各方面的各种各样的疑问,那个有些疑问的话,那我们一会再聊,好不好,a store依赖invoke,为何还要重排,对,其实你在问一个问题,我相信多少同学会有这个问题,好好听啊。
好好听,下面是面试中,经常经常经常会被问到的一些专业名词,这些专业名词有有人见过,但是都不理解什么意思,我讲给你听,认真听,第一第一个问题,什么样的指令允许重排序,就是有一些指令是允许前后重排的。
有一些指令是不允许的,那么你怎么知道这两条指令是允许重排序的,来有这个问题的老师,扣一就是重排序的规则到底是什么样的,好大家听我说大家听我说,这个呢有一个专业的名词叫happens。
before有有有有有人见过这个名词吧,应该就是在jvm里面,它规定了八种情形,这八种情形要求绝对不能重排序,除了这八种之外,其他的指令随便你排,这种不存在于这八种里头,如果你想了解自己去搜。
那么还有一个专业名词叫as if serial,还有这种又是什么意思,看上去像序列化执行,实际当中是乱序执行的,只要最终结果不变就可以,这里指的是单线程,如果能理解能理解,不能理解就算了,不管他。
因为下面我要给大家讲的是,怎么才能禁止指令重排序,好听,我说好,我们可以继续吗,可以继续,同学有点可以,为什么加了volatile,它就不重排序了,为什么y,好看这里为什么加了volatile。
就是那个就就就就就可以呃,不发生重排序了,首先你要理解作为硬件的底层来讲啊,所以硬件底层来讲,它到底是怎么禁止这两条指令不能重排序的,好听我说怎么定制这条这两条指令重排序呢,其实非常非常简单。
一个道理就是我在你哥俩中间加一道屏障,你不能越过这道屏障,指令一指令二不允许你重排序怎么办,诶,加一道屏障好,这道屏障被称之为memory barrier,内存屏障好,关于这个内存屏障。
在很多很多cpu里面的实现是不一样的,作为jvm它规定了一种规范的要求,好能理解吧,就是我要在两条指令之间加屏障,就这个就这个可以就禁止你的两条指令,就可以重排序了,不允许你重排。
但是呢很多网上的文章呢会把这个东西啊,java的实现跟你那个底层的实现完全混在一起讲,实际当中远远不是这么回事儿,你好好听,认真听,作为jvm级别的内存屏障,注意这是jvm级别,什么叫jvm级别。
就是我的java的规范里,要求任何一个实现了jvm虚拟机的,这样的虚拟机,虚拟机规范的这样的虚拟机,你都要给我去实现这四种屏障,这四种凭证我花五秒就能给你解释清楚,你不要看它特别复杂。
这四种名字分别叫load,load store store,load store store,load load叫读,store,叫写,凡是你看到这种屏障,load load就是指的是一条指令。
是low的,一条指令也是漏的,这两条指令中间加一个load load屏障,其他的还需要我解释吗,唉能理解这四种屏障了吗,能get到的,老师扣个一,没超过五秒吧,没理解是吧,威力,这还不能理解。
就是load load是一种屏障,这种屏障屏蔽的是哪两种指令,不能重排序,第一个load,第二个load中间加一个load load屏障,这两条load是不可能重排序的,那其他的呢。
store store呢还用我解释吗,上面有一个写,下面有个写,中间加一个s屏障,这哥俩不能不会进行重排序,load是什么,load是读store是什么,store是弦,明白了吗,屏障是自动发生的吗。
no作为java虚拟机来说,规范里头要求你必须给我实现这四种屏障,具体怎么实现呢,我跟你讲,我跟你讲实现具体就是你只要加volatile就可以,就这么简单,对volatile所修饰的任何的一个变量。
其实就是修饰的这块内存吗,volatile修饰的变量不就是修饰的这块内存吗,对这块内存任何的读取操作,任何的写操作都要在前后加屏障,前后加平章的意思是怎么加呢,这么来加的。
当然这个细节我记得只有阿里考过,其他的呢,没有人考过这玩意儿,只有阿里阿里,因为他们面试官的自由度比较高,按着一个问题之后呢,往深里问,随便你问多深,所以只有他们考过,其他人呢基本上没考过。
所以大致了解就可以,jvm层面规范上要求,对于volatile修饰的任何内存,你要对这块内存进行写的时候,前面加一个store store barrier,同学们,你们拿大腿想一下。
这意思不就是说我要对它进行写了,不就store吗,那你前面的store必须给我写完了,我这个写才会执行,等别人全写完我才写,这哥俩不可以重排序,下面叫什么,前面叫store load。
store load的意思是等我写完其他的load才能去读,保证你读到的是最新的值,所以就保持了线程的可见性,ok就这意思,那要是读操作呢,读操作是前面我要读,我等我读完了其他人才能读。
load load barrier,等我读完了其他人才能写load store berry啊,k,大致的volatile的一个一个具体的实现,它是这么要求的,好了,这块能大致理解就可以了。
没有必要去深究它的一个细节,基本上面试也没人没人会问到这个程度,但是实际当中的问题是在于这里,虽然啊这是jvm规范的要求,再强调一遍,这是jvm的规范的要求,specification。
具体你们怎么去实现这些屏障,那是你们具体cpu的事情,我再强调一遍,这东西是一个虚的,是一个标准,实际当中我们用什么指令去实现它,那才是真真正正的实现这块概念,能理解吗,才能理解给老师扣个一。
因为网上很多文章会把这部分的实现,跟你的硬件实现全混在一起讲,所以你会混淆,你听我讲就行了,z o m a n a怎么说,先不聊它啊。

听讲就行了,嗯到目前为止呢,这么说,这个各种的cpu,它对于内存瓶装的实现是不一样的,什么意思呢。

就是给你举个最简单的例子,就是如果你是x86 的cpu这种的,我用的是最多的了,呃它本身呢就支持三种不同的指令,这个指令呢分别叫fence,fence就是里边的意思l fm fans。
那s就是store load,就是那l就是load了,就是一个一个写一个读m的,是所有的,ok好,他其实本身就是在cpu指令这个级别,它是支持这三条指令的,那么有同学可能会想当然地认为你。
jvm不是要求必须实现内存屏障吗,那四种类l l s s l和s对吧,你不都得支持那几种内存屏障吗,既然你都得支持那几种内存屏障的话,你本质上你是不是应该用这个指令来实现啊,那是这样的吗。
讲到这还能跟上吗,同学们,学完这节去面试要多少钱,30万以上是正常的啊,咱们讲一下实际当中是这么实现的吗,然而并不是因为不同的cpu,像这种指令它是不一样的,你不能写一个完全统一的。
所以hosport实际上是偷了个懒,那这个指令是怎么实现的,你得去看他hosport实现啊。

这个hosport实现的话呢。

系列 6:P23:阿里一道关于CF的面试题 - 马士兵学堂 - BV1RY4y1Q7DL
你得去读什么呢,去读那个那个呃,你你你,你得去读那个那个那个整个,你只要把虚拟机对于字节码的解释,那个文件啊,解释执行的run time,解释运行时啊,就是你看他自己节码是怎么被解释执行的。
你得去读这个文件,这个文件呢比较复杂,我能非常贴心的给大家介绍了,笔记里就是这么贴心贴心大姐姐,我是贴心老爷爷,当去读它的时候,你会发现呢它是这么来做的,你要去看他的bad code。
interpreter,bike code,字节码,interpreter解释器,字节码解释器是怎么执行的,java是解释执行的,对不对,然后解释执行的时候,是由于这个c加加的代码来实现的。
它怎么进行呢,他判判断是if catch volatile,如果你这个catch volatile,那就要求你前后要加屏障,前后加篇章怎么加的呢,是调用了这个方法,这个类的fans方法。
fans就里面的意思,order access order顺序,access访问顺序访问你,你你你你不要给我乱序执行fans方法,那这fans方法是怎么实现呢,下面是它的实现,大家看看大致能不能看懂。
啊这个这个最最终的实现是怎么实现的呢,汇编语言的实现,汇编的时间,这条指令loadl,rookie还是lo,大家还记不记得那个synchronized的,是用什么来实现的。
siri怎么是怎么实现lock compare and exchange,对吧哎对,而且这个thing of volatile怎么实现lock adl,有同学可能就会说了,大哥这个洛克怎么什么都管啊。
没错,因为这个洛克他是一条锁总线的指令,同学们,你们想想看,我去访问这个东西的时候,别的cpu都访问不了,我怎么访问,随便我,而且lock指令还能够干一件事,把当前处理器的对应缓存内容刷新到内存。
也就是进行一个内存同步,那么大家你拿大腿想一下,只要有一条lock指令,是不是就能实现了线程可见性了,线程可见,并且使其他处理器对应的缓存失效,啥意思啊,你那边失效了,你是不是得重新去内存读啊。
所以一条洛克指令把这事儿全干了,线程可见性指令重排序,你排不了序,我把我把总线给你锁了,你怎么排序,没法排序,所以这哥们儿干了所有的东西,就是这条lock指令,所以有人在问你volatile怎么实现的。
直接拿一把锁lock扔给他,好面试在问你volatile的时候,你是不是能理解了,来能get到这点,同学老师扣一,索总监效率不高啊对啊,我也想要让他效率高。
我也想让他用那个x86 那种fm fm fans等等,但是他不用啊,他偷懒吗,我不说就是hosport实现它偷了懒吗,那有同学可能就会说了,说老师啊,这个lock为什么adl是个什么东西啊。
为什么要at他呀,为什么lock这条指令呢,你前面的那个lock compare cs操作,我还能我还能理解,对不对,那是要上锁吗,要改里边直的,我这dl是个什么东东,好仔细听,我说这个i d l呢。
是往e s p这个寄存器上加了个零的歌,就是你往某个寄存器里的值,甭管它是几,你往上加了个零,说明没有任何操作,所以这就是一个空操作,只要他中心思想是要这条路,而不是要后面这条指令。
所以这条指令就随便来了一下,就这么回事,那有同学可能就会说了,老实啊,空操作,我学过汇编,我知道啊,汇编里面有一个空操作呀,来有没有同学知道汇编的空操作的,对啊很op吗。
no or no operation,对不对,没有没有没有操作,但是很不幸的是,这条指令如果你去查x86 的,它的汇编的那个指令集的时候,说明你会发现这条指令无法被锁定,这条指令你不能这么写。
lock l p直接就直接就不可能的,不允许,所以没有办法,他就lock了一条加零指令,没有做任何操作,这就是他偷懒的地方,为什么不能不做,问英特尔去,不要问我,为啥我不知道,但给我讲完了。
你还不知道啊,我都讲到这个程度了,你还不知道,还还还不知道,你还要让我怎么说,当然下面我们还有一些实践,这个实践的比较复杂,我今天就不给大家做演示了,关于理论性的东西,我们就聊到这儿,下面讲到面试题吧。
好吧,我们稍微回顾一下我讲讲过的内容啊,看看今天大家是不是有收获,今天讲的内容也是比较多的,就是有很多底层的东西一旦通过之后呢,就各种语言啊,各种那种那种应用级的应用层面的东西,对你来说。
那就是一层窗户纸,一捅就透了,呃我们今天讲了cpu的内存,缓存,有cpu和内存打交道,中间有好多级缓存,一共有三级,回想一下那张图,l one l two是存在我cpu和内部。
l three是存在一颗cpu内部,而我们的内存是多颗cpu共享,那缓存一行往里头缓存的时候,按照一块一块来,这个专业名词叫缓存行,关于这个缓存行来说,那么呃大小呢现在呃是约定俗成的,是64个字节。
因因此呢他们会诞生了这种缓存一致性,要保持一致嘛,缓存一致性协议,英特尔的叫m e s i,其他的和这个不一样,还诞生了一些编程的技巧,这种技巧以前人用的比较多。
后来以至于jdk一点八专门发明了一个注解,来教你,怎么样把这些不同的内容放到不同的缓存行里,cpu呢讲了乱序执行这个概念,也向大家证明了这一点,dcl为什么不能乱序,为什么要加volatile。
刚才给大家解释了,首先你要理解什么是tcl,其次你要理解你有一个对象的时候,它是有好多步骤构成,而且这些步骤之间互相之间的顺序能打断,第三一个volatile是如何到底阻止乱序的,jvm级别的要求。
那四种屏障,low low,the store store load和store store lol,为什么能同时实现volatile两个作用,volatile内敛哪两个作用,线程可见性,指令重排序。
你拿大腿想想,这哥们儿一一log的话,就直接把内存全部都刷新了,得缓存全部刷新,通知其他缓存行失效,你下次要去读的时候,一定得去内存读,保证线程可见性,同时它锁住总线,绝对不可能让你发生重排序。
我都锁总线了,你其他指令想体现执行不可能的,所以一条指令干掉了volatile的两个作用,ok,好能够继续同学老师可以去哪学汇编,去老师这儿来学不就行了吗,老师讲东西讲的这么透彻和清楚,学完就让你掌心。
看这里,听得快忘得快没错,你不做不做总结肯定会忘的,快拿张纸记下来嘛,随便拿张纸记下来,饭前饭后便前便后好好看看他,你只要你别那个变后用了,饭前又用啊,这个不合适,好看这里啊。
这个呢今天再给大家讲一讲那个线程池的问题,呃,以前呢我计划有时间可以给大家讲讲线程池,结果每次都发现,其实讲先生池呢需要给大家讲很多很多的概念,你才能理解线程池,对作为线程师来说呢。
你首先要理解什么是colorable呃,什么是future呃,什么是阻塞队列,blocking to呃,什么是那个线程池的七七个七个七个,那什么啊,还有线程池各种组织的模型。
呃这个呢一两天确实这样讲不清楚啊,vip里面讲的非常详细好听,我说呃最近呢也刚刚遇到一道题,大家可以审一下这道题,看看大家能不能答得出来,这是阿里面试,大概在p6 p6 p7 这样一个水平的时候。
一道面试题看你能不能答得出来,呃其实作为阿里来说呢,很多人可能不太了解啊,这个阿里的p5 其实约等于p6 ,这是啥意思呢,应届生在校的学生进去之后,往往是屁股开始社招生进阿里1~3年左右的。
3年左右的大概是p6 ,一般来说你到了p5 之后呢,再稍微攒攒时间,就可以到p6 了,多页的程序,这辈子不可能这么牛,你给自己这么负面的心理暗示,那我还能说啥呢,这辈子我都不可能赚更多的钱。
那你就真的就赚不了,我觉得你行,你至少试试,好看这里啊,仔细看一下,看这道题大家能不能理解啊,有没有同学有思路的这道题啊,是一个什么问题呢,实际上本质上是是是是一个设计模式的问题,当然你需要理解这道题。
多线程分解多个任务,如果所有校验的结果中均为处处,如果只要一个返回false返回false,最关键的是在这叫尽量快尽量快,什么叫电量快,举个例子,我们下面一个是一个总任务,这个是总任务,张三儿去买水。
李四去买肉,光武去买锅,最后我给他做火锅,这是我们总任务,派出三个县城去干这件事,张三买水需要1年,李sir李sir买过这个王五,买锅需要三秒,李四买肉需要十秒好,现在的问题就是说所有的都买回来。
那表示为true完成了,那么我这个总的程序就算完成,如果说其中有一个返回false了,比如说这哥们儿执行了两秒,就发现我买不着锅,锅没有,所以我给你返回一个false,那么这个时候作为这哥们儿来说。
要通知所有线程cancel掉,cancel掉,整个任务结束要尽量的快,尽量快的,意思是你不能等他执行完1年之后再给他结束,只要有人断了,所有人全给我cancel掉,这其实是一个分布式事物的一个玩法。
如果你能理解这个本质的话,就分布式事物手工实现该怎么去实现,它说不准叫colorable,闪电闪电骑士啊,这个不错,相当不错,forejoin叫color,你能想到这一点,very good,好听。
我说大家如果能理解什么叫future,这道题如果能听懂就听,听不懂就算了,算是附赠给大家的,好吧,呃如果能理解什么什么是future,应该就能理解,这future呢就是一个任务要求。
可以有返回值的这样的这种任务啊,这这就是那个任务的返回值,好关于这个任务的返回值,就是我返回之后呢,要去要要求马上给出反馈,同学们听我说啊,就是那个作为java来说,他原来并没有提供这种模型。
如果有人用过future的话,这个future什么时候才有结果呀,是不是我得调用这个future的get方法呀,我才能知道它这个结果对不对,好听我说这个get方法是什么操作,各位同学,这个叫阻塞操作。
阻塞啥叫阻塞,阻塞的意思就是我在那傻等着,一直等他有了结果为止,那么你拿大腿想一下,有一哥们出去了1年,你在这里get得等他1年才能回来,结果有另外一个哥们已经返回,结果是false了。
你应该把它cancel掉,你怎么cancel掉它,你开脱不掉它,因为这是阻塞,阻塞在这里了,所以这是它的一个核心点的要求非常快,正是由于意识到了,说那个jdk原来的提供的类库里头并没有这种。
等返回来之后,我马上就做出反馈的这样的一个future,所以有没有听说过这个类库瓜子,有听说吗,挂吧,googoogle专门给java做的扩展类库,对不对,google的对好。
这个类库就扩展了一个叫什么叫什么future呢,叫listenable future,有没有听说过这个的叫listenable future,如果你能达到这个very good,很好。
而且呢还乐于学习更多的这种内裤,ok,好这就叫类似的future listener,future出来了之后,就是你一回来,我马上就有反馈意,我不用在那里阻塞着,我,只要注册一个quebec就可以了。
回调监听器对它本质上是一个什么东西呢,observer设计模式,所以设计模式是你长技术内功的第一要义,observer这种设计模式观察者吗,那,当然我们继续讲,这里边还有点深入啊,估计好多同学听不懂了。
听不懂了,我很快讲完啊,听听到什么程度算什么程度,那后来呢jdk一点八说,哎呦不错哟,google谷歌,你不错哟,你居然拓展了我很想拓展的这么一个东西,好,我学你,所以在jdk一点八之后。
有一个future诞生了,这个future叫compatable future,complable完成完成之后就有反馈的这样的一个future,来看这里吧,我简单给大家写了一点小利的程序,不是很完善。
我讲给讲给大家听,future啊,这是listenable future,completable future,看这里啊,这个我做了一个小的模拟,我有三个任务,test one。
test to test three,第一个是三秒,第四秒,第三个是一秒,它会返回false,然后我用completable future怎么玩呢,这么来玩,completable future。
supply is sink,执行第一个任务,执行完了之后会调用我的call back,也就是说任何一个任务执行完,都会调用我的call back,我call back怎么执行啊。
只要有任何一个任务返回给我的false cancel,处理结束流程,让所有其他线程结束,通知其他线程结束,最好你能写回滚roll back,超时处理怎么玩,把这个都写好,这个教会你自己去写。
这就是completable future,它的核心是什么,刚才那小伙说了,小伙水平不错啊,它的核心是fork join pro,加上考了不,效果不错啊,阿里欢迎你,对分支,当然这里面呢还有这种细节。
这种细节呢留给你自己好好思考思考好吧,怎么处理,结束流程就是有一秒的已经回来了,那1年的都得给我,你得给我cancel了呀,对不对,你不能随随便便的还搁那执行1年怎么开走,我告诉你。
cancel这件事让一个线程半途中结束挺困难的,不太容易,你们好好思考一下,通知其他线程回滚,你执行的一些操作都得给我做好日志,由于我先我任务取消了,你是不是该把钱退给我呀,所有的东西做回滚。
如果说做了我,我比方说远程的分布式的事物,那我超时了之后怎么处理,写到这一点的时候,阿里欢迎你,interrupt完成不了interrupt,你得去catch那个exception才可以行进,好。
我们今天就聊到这儿,好吧,记住了东西,我们就聊到这啊,这个一时半会真的聊不完,8月份呢我会重新讲新的整个的线程,我觉得我第一版讲的还可以,但其实呢第二版我想加的内容更多,请允许我介绍介绍我们的课程好吧。

呃课程的深度以及我们的这种知识点的深度,其实呢我相信大家伙应该可见一斑啊,我一直强调就是大家伙在学习的时候,有一个非常重要的东西,不要浪费时间,你个人的精力啊非常的宝贵。
有很多人上学的时候的精力用在去学什么,福特圣呃,学点什么这个设计那个设计啊,学linux的各种命令,学点黑客,然后呢再学点编程,其实你根本就不知道它的整个的多赚钱的点,到底在哪里,能理解吗。
就是说如果你要学photoshop时间,我教你学别的地儿,你可能多赚好多钱,所以组织好你自己的精力和时间,是能够让你的职业生涯变得可预测,而且比较有效,向前看对,但你不愿意向前看的话,我就无所谓啊。
马老这里的课程基本上是以向前看为主,在这里等等,这也是为什么在我们的呃,整个的我们指导的学员里面呢,嗯基本上是短时间之内呢,就能让他有一个不错的薪水上的提升,这是面试突击四个月啊。
这四个月其实还算是比较长的,嗯这是咱们上海的学员,我们老师的面试指导之后,总报80万啊,我周老师的周老师的系列的指导,嗯两个offer是吧,上海应届生15k,上海西安涨了四次签的应届生拿了9k。

虽然不太多,但还可以哈哈,怎么说呢,就是原来是找不着的呃,从时间角度讲呢,这是武汉半个月,就是这是效率啊,我们就我们讲的,我们写程效率,我们找工作涨涨薪水也需要效率。
你非要说我搞个3年我才能涨2000 3000,那就效率太低了,三个月两个offer继续啊,这这就是效率呃,十天突击,为什么十天突击能搞定工作呀,背哈说难听一点就是背搞我们的突击班,背面试题。
当然你也要知道面试题经常会问什么,对不对,突击应该突击什么,好吧好了,整个课程的内容需要做个简单介绍吗,需要的扣个一有十个我就介绍,没有十个我内容就不介绍了,我希望大家伙呢我介绍也不介绍也好。
大家能把咱们的课程内容,要从咱们的小姐姐身边啊,要要走这个课程内容啊,呃其实是其实是这样的,就是说我们是经过了那种,非常非常细致的设计啊,才把这个整个课程内容给他给大家设计出来。
然后哪怕你就算是自己自学也好,自学也好,你看到这个内容自己对照模块去学习的时候,其实你会发现你的条理性也比较好,因为我非常担心,各位同学们的学习呢是这种碎片化的,今儿唠一知识点,明日落一知识点啊。
今儿是关于shell的名人,关于并发的,后天关于数据库的,在后天关于优化的,在后天关于节架构的,后天再来一大数据的,看上去你在这里每天都在这里瞎忙活,忙活完了之后呢,别人拿你简历来一看。
一个给力的项目都没有,是不是有量的吗,就是每天搞点随便画的,有没有,有的扣个扣个一认识一下好不好啊,不要怕丢人,这种男的学习效率就非常非常低了,你叫做战术上特别忙活,忽略了战略上的问题,请大家注意。
所有的学习一定要有一个短期目标,或者涨薪,或者跳槽,或者入行,或者进大厂,以这个来驱动学习,而我们整体的设计呢就是从你最底层开始啊,计算机的基础的必修课,尤尤其是那种非计算机专业的转行过来的。
今天给大家讲了好多,其实就是操作系统的是吧,组成原理的,然后编译原理的这些内容啊,呃大厂必考的内容啊,到基础做项目很关键,项目驱动就是你的你的简历上写一堆项目,才是最重要的,是不是数据库,网页框架。
做项目好常用的软件和开发基础啊,然后做项目,分布式微服务,做项目做项目想进大厂,算法与数据结构工作的软实力,其实到这里的时候呢,就是从零就可以入门了呃,大多数线下的机构讲的逃不出我们这部分内容。
第一部分在这部分内容基础之上,我今天给大家讲的是java底层的一些知识,性能调优的知识,并发的知识原理和源码层面的知识,中间件的运用,综合的项目开发优势项目是吧,然后架构的设计理论,具体的设计方案。
案例的专题,那么这部分内容是带大家进入高新设计内容的,前面的大多数内容是讲落地,从这里开始,我们讲设计设计,我给你举举具体案例吧,学生的具体案例来举例子啊,你就大概知道设计内容是什么内容了。
这是我曾经带过的一个学员,他原来是50多万的年薪,我带他90万干进腾讯,腾讯的典型的面试题,就是一道,刚才我说我给大家讲过的一些,跟大家伙对照课程大纲的这部分内容的题,架构设计题。
大概就是对应的就是这个啊架构的案例专题,这个呢还是挺难设计的啊,一般来讲建议呃2年左右程序员开始涉足,如果你刚开始入行的同学呢,作为兴趣去研究,但是你现在短期可能还用不太上好吧,2年以上开始涉足。
怎么提薪,这个哥们儿是90万拿了腾讯的年薪,但是你学历可能不如他,不过你的技能只要到位了,搞个中间的六七十万,五六十万总是问题不大,微服务的专题设计模式的心法,到呃比较流行的新的微服务云。
原生云原声的落地,这个我们讲现在的架构是不用云,不用云,这个现在是不太现实了啊,呃软件测试啊,大数据的内容,go on的内容啊,如果你要愿意,可以去考试c k的认证和c k s的认证,然后技术的管理。
技术的规划,技术的选型,还有我们就业的,就是帮大家怎么去一一对一的去提升,怎么去提升这个学习,怎么去提升这个面试的突击,帮大家做好潜力的指导,面试的指导啊,如果明天在座的诸位要是愿意的话。
也可以把你们的这个简历拎出来啊,来帮你们改改简历,自我吹牛逼一点点,请老师改过的简历,其他你任何都不需要有,每个月2000块钱以上的涨幅,就是不干别的,改完简历嗯。
每个月2000块钱以上的涨幅白来了好吧,只要改完简历就有啊,然后呢贴近于我们上面所拥有的所有技术的呃,各种项目,这样方便你在简历上写出来,各种各样的项目,写到简历上,好了呃,呃这是给大家呢深入总结的。
作为一个优秀的技术人员,应该掌握的技术站技术突破,兔子虾兄弟们只是这样的啊,有没有问那种软性问题,我没有办法一一帮你解答呃。

关于软性问题,大概我们总结有70个左右。

这部分问题呢,我们总结在了我们的第一次的面试突击里面。

我登录一下就算了,不登了,我登录一下吧,微信扫一下。

行,那么这个教师呢到现在为止,我们一共为大家提供了226门课,3800个左右小时的时长,这是已经讲完的,不包括正在直播的呃,基本上每天都有直播,直播课的内容也在不断更新,在这其中呢。
我们在我们第一次的面试突击里面,给大家讲了一系列的这些个小细节的,软性的内容,这部分内容呢其实我说起来的话呢,也不太好回答是吧,你那个到底你要不要编啊啊或者怎么样啊,你这跳槽怎么看呀是吧。
你你为什么要离职啊,你还是模拟要问吗,工作失误怎么办啊,你怎么理解你这个岗位,你为什么要离职啊等等,这些各位兄弟们关于hr的70个软件问题,这里都有,我在这里就不想展开了,你要编或者不要编。
其实是去跟你的具体的工作内容有关系,这也是为什么我们学生的面试成功率比较高,很简单是由老师在这里陪跑陪着你,你到底有什么地方呢,觉着没没没答对了,哪怕你回头找老师问或者录音录下来。
老师告诉你什么地方拿的不好,下一次不要犯这种错误就ok了,因为这种成功率比较高的原因,我只会算法提供管理系统啊,那你就永远会是吗,所以我跟你,我跟你们一直说,你们是一个不断成长的过程,你现在只会这个。
难道说代表着你就以后这辈子只会这个吗,学习嘛,对不对,差什么学什么不就ok了,三期外包怎么规划,首先第一步定目标,长远目标不好定,你可以定短期目标,短期目标一般以两种方式为主,第一种是我要成为某个岗位。
第二种是我要多赚多少钱,出来之后还能听懂不,所以自己定好我要多长时间之内多挣多少钱,这是最简单的目标,定完目标之后呢,就知道学习该怎么学了,差哪些该怎么补了,只有你定完这个老师才能给到你具体的路线。
这是为什么,我报完名之后呢,就是有一个老师帮你梳理的这个过程啊,然后后期呢帮你陪跑,这个过程我学习涨了七个,就是你可以给自己定目标,你说我三个月我想让5000老师。

我现在这个目标是这样的,老师你看看我现在以我现在的情况合适不合适,35岁,40万年薪涨到了70万,开不开心自己想啊,自己琢磨开不开心是不是很爽。

1年多赚了30万,我们整个学费多少钱,1万出头而已,投资记住给我记住这一点就是投资自己,投资自己是你这辈子永远最值得投资的事情,作为男人也好,作为女人也好,作为男人投资你自己,让你自己变得更强。
你才能吸引更优秀的女性,记住这一点,女生不是追来的,是吸引来的,所以女生也是一样的,你有自立的能力,你就不会不会依附于某一些质量特别差的男性。

西施玩到手也就50多,你有吗啊就更经我没法跟你聊的,你关注点永远这么奇葩是吧,他说我关注点是他从40万到手二到手30万,涨到了70万,到手50多万,你的关注点是70万哦,才到才50万,卷少鸡腿往上涨了。
好的好的好了,今天呢有一个很重要的环节,就是有不少同学是要我改,帮我改一下简历啊,兄弟们,这个这个简历是怎么怎么提给我的呀,我们小姐姐已经提给我了啊,我来,下载一下,找几份简历给大家看看啊。
有时候怼大家两句,也不要往心里去,给大家两句呢,是让大家伙理解这个社会的险恶,以及你思路上的偏颇,把思路给我纠正过来,就是你你自己琢磨一件事情,那就是非常简单,你要不要多赚点钱,如果你这个欲望没有。
就不要找我,如果这个预告有老师就有办法,他说70万的不多,虾皮年薪850000加股票年薪百万还不够是吧。

还不够,还要更高的,就是大小伙儿啊,都是一个慢慢成长的过程。

你知道哪天说你刚毕业,这是我们迄今为止最牛逼的学生,30岁,公司给了5000万的股票,已经变现,也就是说他的现金资产就已经5000万,30岁啊,一个普普通通没有背景的程序员。
这是他总结的关于p p7 的部分应该做什么,当然你的上嘴唇一碰,下嘴唇不就才5000万吗,因为目标都都还很远是吧,你不用跟我聊啊,你很牛逼啊,这个cpu吧,不是cpu,使他运气比较好。
他正常年薪是在120万左右,赶上公司上市,但是他技术水平确实比较好,老罗小姐给我提了一份简历,又抽烟,24届应应届校招的简历,柴哥的悉尼大学,on the resume。
嗯master i t南京好多23应届生资源科技,首先你要问清楚一点啊,就是这个很重要的一点呃,你是在国内找还是在国外找,在国外和国内呢它的内容是不一样的,你写的中文我估计是在国内啊。
我们以国内来举例子好吧,然后我们目标薪水是多少,目标薪水也没有写,那边薪水没有写二维设计游戏,举点性收集信息科技雅思,你这次你嗯那个各位应届生的同学啊,你这么写东西是不行的,好吧,嗯听我说啊。
就是各位应届生同学呢,我们以以什么来举例子,我以一个就是咱们南京教育呢,这个这个是有线下班,这个大家可能也知道是吧,先下班呢我们是不收学费,然后等你毕业之后再来付学费的啊,主要是解决第一你要用时间来学。
第二呢你没有多少钱,嗯然后呢等你赚到钱之后呢,我们再来收你这个学费啊。

这也是比较良心的,呃这个呢目前呢是县中心是有两个地方,一是上海。

一是长沙,我们现在长沙内容是一样的啊,嗯这个方向是以java大数据为主。

然后我们线下版在整个的去年。

在上海那边的就业,我给他抽烟。

回来瞅一眼,我们线下班在上海这边的一个就业情况啊。

这是去年呃,一丁点不夸张啊,我可以负责任拍胸脯的相机讲,这里头的数据没有一丁点水分,这是我们整个去年一整年的,在上海这边大概就600 600人左右,这200元呢一部分是中专高中的最低年薪,拿了15万。
然后呢凡是大专起步的18万以上,没有低于18万的,然后50%呢是在就是你本科的,差不多就20万以上啊,就这样,那么这个它会涉及到一个重度的简历,润色过程哈。

我都不能叫环,叫包装,叫润色,这个简历呢应届生的简历。

你要想拿到比较好的薪水啊,如果你目标只是找个什么6k的,7k的,8k的,找个外包。

那就无所谓,你随便写,你像这种简历差很远的地方在于什么地方呢,你的知识点会哪些不会哪些不知道啊,看不出来看到了吗,你博客历史啊,什么决定啊,跟我跟我没关系啊,参加了口周赛挺好,这个是这个是重要的。
热爱唱歌,你说有意义吗,一点意义没有,就是说你整个的东西能偏了嗯,雅思多邻国的份,这个意义也不大,还有呢又擅长这个语言,又删除这个语言,偏了散了,记住了,想拿高薪一定是聚焦聚焦,聚焦聚焦你们入行的时候。
想拿高薪是1米宽,1百米深这样的一个知识体系,随着你整个成长的,你慢慢又变成1百米宽,56米深,越来越宽的知识体系,所以这时候你要聚焦,我的目标是java后端这些东西啊。
什么a p f x swagger postman意义不大,我的目标如果是java端,你给我写这里写python意义不大,你跟我这里写什么嗯,这个多少分,这多少分往后放,你你要愿意的话,往后放。
能理解就重点往往前突出,还有非常重要一点,如果以我们闲下来举例子,一个应届生要想当很好的薪资,四个项目,1234,前面这两个分布式微服务的比这个差的有点多,但是你的优势在哪里,你的优势是在这学校不错。
学校不错,学历不错,这个一张这个你可能会拿到一些面试机会,可能会拿到一些对应的薪水,但是看着这份简历正常的,你按照老师的模板给你改完的那种,如果你拿18000,你这份简历可能只能拿到12000。
差百分之差1/3吧,所以重点在什么地方呢,我再跟你说一遍,第一重点突出,重点突出就代表着你知道什么是值钱的东西,你跟我这说什么,有运维经验,跟我这说,了解shell语言对我来说没有意义,你知道吗。
因为我要招的人是什么,一定要站在我的角度考虑问题,而不是站在你自己的角度,我再重复一遍,简历是什么,简历是广告,广告是什么,广告是我是我厂商要什么,你要往上写什么,我厂商重视什么,一定是往前提前写什么。
能不能理解我现在厂商重视的时候,我要找一个比较牛逼的实实实习生算法什么的,前提是吧,我这个那个那个那个那个你还这个解释了,解释了一些什么乱七八糟的东西,不要解释这些东西都没意义,对我来说。
你成就成够就够,我们你这个水平够了,没拉你过来,水平不够,你就就不拉你,你想办法把自己水平写够了就行啊,系列的精通,熟悉重点的知识点,要了解哪些是重要的,哪些是不重要的,哪些是我们企业看重。
哪些是不看重的,这些个呢你分开要分开,你要知道的是他看重的那些不看重哪些啊,seo server不看重的mq可以往后放,分布式微服务,这里没有是吧,然后如果对应项目的话。
四个项目为什么会有那些二本的学生,在我们线下会拿到40万年薪以上,刚毕业很给力,就是项目写的很给力,知识写的很给力,但是我不我就不给你展示他们的,他们的这种这种简历的那个具体的内容了啊。
所以这个是需要你大量的积累之后,你才能写的写的上去,四个项目,前两个分布式微服,后面两个写什么,后面两个可以稍微的就是,就是相当于你你可以稍微的把标准降低一些,可以写单机版的游戏的后端,实在不知道的话。
从我们这里挑,就是我们为什么在我们整课程体系里头,给大家提供一系列的项目,从这里挑就行了,前面写两个写音乐,音乐音乐水中心或者写我们的网约车,ok后面再写两个写什么就写游戏,后端这个也很给力。
ok写个何佳芸不就行了吗,你说清楚了吧,来看看这个吧,换一个吧,这个写法要比要比上一个稍微好一好一点点啊,呃二次的离职就是我至少知道呢,我专业技能我是什么,我要稍微排练一下,前面那同学。
你不要认为你是你是学生,就按照那种对自己的要求放松,你一定是按按照一个专业专业的人,职业的人要求自己啊,这个知识常用的ok spring cloud sql,ok我觉得他这个排列还可以啊,排列还可以。
就是我我最烦的是什么样的一种写法呢,上来先写a tml css js会idea或eclipse会get,你这东西都是都是都是边缘性质的啊,我搞一个较好的人,我上来,你这些东西强不强,跟我有毛线关系吗。
这些都是夹缝线,往后放啊,你看他这个就放到最后,他这个你看idea eclipse maven放到最后看到了吗,重点往前放刺,就是最差,往后放,这是最最普通最简单朴素的原理吗。
你第一个你最最最拿得出手的点,是不是第一个让人家看见呀,恶灵力哪个哪哪哪哪,跳槽有点多啊,兄弟这三个就跳了1年不到,实习不说了,记住啊,这跳槽这件事情对你们将来非常的重要。
你们一定要一定要找到我加入进去啊,非常的重要,是怎么说呢,5年两跳,大厂能接受,过去任何一家工作经验超过3年,大厂能接受,除了两种情况之外,很多大厂就直接把你家给pass了,clb环境。
smart oa,spring cloud and sql,呃,这种的都往后放,应该是先把这块儿往前,把这块往前放,这是业务的描述,职责的描述,买了你这个为什么测试提交bug,然后呢进行全方位调用。
你这个听我说啊,就是说各民族大学为了教育职业学院自我评价,你别写这么多自我评价啊,你得听我说啊,就是说你这份简历呢,我觉得是一个中规中矩的简历,这都是同学带我来,这是一份中规中矩的简历。
但是你这份简历呢值钱不高,值钱度不高呃有很多时候我们批改简历的时候,有个很重要的参考点,就是你的你这份简历想要拿到多少钱,在哪个城市,这个呢特别特别重要,我再重复一遍,就这个简历你扔出去。
你说我找一份普通的工作,拿一份外包的那个薪资,这个是没有问题的,这份简历没有问题,但是我们一般改简历的时候都有两个前提,第一个前提是你是在哪个城市,你想用这份简历拿到多少钱,我给你做个假设。
如果你是在北京,你这份简历想拿到25000,那你这个简历就差多了,听懂了吗,如果你是在北京这份简历,我想拿13000,这个简历没问题,可以拿到,我们以25000来举例子,这个简历就差不少了。
好差在什么地方呢,第一个呢这个项目不是很给力,起码我们要看到这个项目牛逼的点,就是你一定要知道,你要你要让别人看到我比较值钱的点,到底在哪里,我这么跟你说,整个的在市场上来讲比较值钱的有以下几点。
第一个叫原理的理解和源码的阅读,就是你对于底层的了解,原理的理解,源码的阅读,如果你想突出的话,尽量突出这个,第二个如果想要还要往上提示什么东西,是架构的设计和理解,听懂了吧。
好第三个就是你特别牛逼的项目,什么叫牛逼的项目呀,大并发量,高弹性,分布式大数据量,云原生落地,要体现这个第四个各种的优化知识,jvm的优化,ngx的优化,数据库的优化,架构的各种调优。
你这个呢稍有体现,但不够突出出,你别在这儿呢,在这呢进行全方位调优,组长的带领参与一下干嘛,你自己干不了是吗,为什么这么谦虚,你应该怎么写,我进行了一个什么样的调优,把原来的并发知识量从8000q p。
给它提升到了20000q ps用数据来说话,这么说,能不能理解兄弟们,就是为什么在我们的课程体系里面,我们会给大家设计一个什么东西啊,就这个啊大厂的架构质量保障,生产事故分享课,这是为什么呀。
你们可能不知道为什么,就是我们设计课程的时候,其实实际是苦心竭虑,但是很可能很多人理解不了,专门这种课,还要拿一个课程出来分享,为什么呀,因为在你们面试的时候,绝大多数都会被问到一个问题。
你们项目中遇到过什么难点,痛点没有,说白了就是你的亮点在哪里,你整个你的简历的支持的,让人让人眼前一亮的东西在哪里,我告诉你就在于这些地方线上工厂出了什么,怎么排查的,cpu标高怎么办呢。
虚拟化的问题出了什么问题怎么办呢,年级时出了问题怎么办呢,性能优化的时候,你踩不到坑,上续环算法重复ready锁失效等等,能理解吗,这就是在咱们原来的京东和新浪的一个老师,原来在京东后来就行了。
他们在线上,京东的线上,先和那个新浪的线上,真正遇到过的问题的实际分享,就是你听完这个课,你就会知道该怎么去跟面试官谈,该怎么把你这个项目说的特别牛逼了,来这边听懂了,给老师敲个一两个q vs大项目了。
对照从文说明这个还是接触过的不错,就这些东西其实老师早就把你们一扫,就把你们考虑好了啊,甘老师扎实过来学涨薪是很轻松的,我带给你的更好的那个收获呢,是你长远的职业发展的旅顺,这样比那个重要的多。
嗯所以这个这个简历再重复一遍,给我简历的时候就要说清楚你是要在哪个城市,想要这份简历拿到多少钱,这是我们调优简历的第一个前提好吧,如果你就想拿个12000,15000左右,可以可以就可以拿这个去拼。
还有啊这种这种废话呀,嗯基本上打动不了谁,只能打动你自己,这样吧,我给大家看一个比较牛逼的简历,就刚才那个年薪120万的简历,你们想看看吗,我还说那牛逼的学生拿拿拿5000万已经套现了。
然后当时的薪水是1000 1120万,你想看看吗,想看漂个一来我来看,就是说,这个就基本上就是那个纯技术类的天花板了,好吧,纯技术类天花板,你们不要担心说你们达不到他这个水平,你们记住了。
他这水平也不是说天生会的,他在大学的时候也不也不是也达不到这种水平,都是一步一步地学习实战,一步一步过来的,马斯克呢可以直接带你到这个水平啊,找一下,呃自己看这个评价,跟你跟刚才那个同学的评价比较。
你们看看这两个的区别到底在哪里,刚才那同学的评价,我找找跑哪儿来了,这个是吧,这是在抒情啊,这是在写小论文,在抒情,感动你自己,但是不职业,你们自己比较就行了,5年多少经验,3年以上的大型系统架构设计。
3年以上的团队管理,分布式高并发,高可用大数据量的系统架构设计和研发,对什么什么开源软件深度阅读,并且能够定制开发,好了很简短,最核心的竞争力已经出来了,这个是什么,这个是在说我很努力。
我愿意从从事这份大哥,不重要啊,不重要,听懂了吗,不要玩自己感动自己的事情,个人技能他永远不会把那个什么html css写前面吧,好了,京东什么阅读过什么分布式,因为你要知道。
如果你真正的理解现在企业看重什么,你就知道他这个排练的前后前后顺序的原因了,非常简单,大家伙看中的排在最前面,分别是to b c t c c,优化中间件集群的搭建分布式吗,对不对。
e中间件消息中间件是吧,负载均衡好,整个的项目经验呢,是以纯技术的列表的形式来体现,分布式的系统架构,当时是怎么来完成的,海量数据的架构以什么来完成,没那么多乱七八糟的业务上的介绍。
业务介绍对我来说不重要啊,高并发的系统,高可用的架构,高性能架构,可这是解密当时120万年薪,各位同学也不要太过于说嗯,哇我什么时候才能到这种程度,其实我跟你讲啊,如果按照一个粗略的先系统化了解。
再去慢慢了解细节的这种学习方法来看的话,只需要六个月的业余时间,老师就能带你把刚才那份简历所涉及到的内容,全部走一遍,但是你说有细节上我能记住多少,背过多少突击,我能搞定多少。
去面试这个东西的话是一个概率问题,掌握10%有10%的机会,掌握20%有2%的机会,但是最重要的知识体系化,跟着我们的各种走,这部分就没问题啊,全全包裹啊,他那个简历里面的东西全包裹,放心。
这里全要这硬度测定分不是破译的,很帅,是的,说明他透彻理解了嗯,好的简历老师手里有很多,但我会告诉你这个简历差在什么地方,我们再来看看嗯,应该我再再再来看看其他的这个同学的简历啊。
起码发过来我给大家瞅瞅好吧,大概的,其实马马老师给给大家改一份简历啊,来来回三天左右时间才能改完一份,就是我为什么毫不夸张的说,就是我们老师给大家改完简历,什么都不用动,你整个薪水凭空增加2000块。
这个大家有信心吗,有信心的飘个一就是你什么都不用动,你什么知识都不用学,就给你改完简历,你整个薪水估计都要2000块钱,一个月1年2万多完全没问题,核心的一点就是你要知道企业要什么,各位兄弟们。
不要老想着自己为什么一定要把这个给我给我,给我给我弄明白了啊,还有一定要理解我所说的简历是什么,是广告,还有一个呢知识点是什么东西,是概率哈哈哈,不是说非要掌握多少啊。
3年java开发端庄高并发分布式挺好,你看他这个他就知道哪些东西是值钱的嘛,对不对嗯,开发框架这可以啊,简短有力啊,比那个写一堆呢还要强不少,当然有一些呢就是有些写的比较细会更好。
有些写的稍微粗一点更好,我一会再给大家看一个细一点的例子好吧,那个那个哥们是24岁,拿了60万年薪啊,想看不能看的太丑,一眼就是关于这部分怎么写,专业技能这部分怎么写,好打开来瞅一眼啊,简单的。
嗯找一下啊,这个,这个你自己看啊,这个是整个专业的技能,它是一个接近应届生的,一个一个一个一个条件啊,你们看到的这面很宽,并且很深,这个是最重要的啊,京东什么属于什么,了解什么是吧,哪个最重要往上写啊。
这个呢是在24岁,大概才工作2年,2年左右,经验2年左右是可以达到这种水平的,兄弟们不要害怕啊,你要这跟我们走,我就能带你到这种水平,然后60万当时拿了60万年薪,我发多少。
你还在看这个刚才那个同学的简历啊,太原科技2020年4月至今good,你看20年4月到现在没跳过槽,没跳过槽就不要跳了,20年到现在2年多,2年多不到3年,我刚才讲过,想杀大涨什么条件来着。
在一个公司工作满3年,别跳啊,别跳就不要跳了,一定是准备好再跳,你吓一跳的话,能够拿一个很好很好的涨幅,王老师这个涨幅不限啊,你不要老让老实说,那我涨幅就是人家就只能超过30%多了,不给那是你傻。
这个你看这种的相对的介绍呢,呃就相对来说偏业务一点,发现了没有,相对来说偏业务一点,不是说不太好啊,如果你想突出你的技术水平的话,那就不要太做过多的关于偏业务层面的东西。
比方说你项目的微服务好这些个呢你可以列,但是你没有必要说把那些后面的细节全列出来,另外呢你列入为服务来为服务很普通啊,那你的优势是什么呢,你这个微服务互相之间的耦合度怎么样,你是怎么组织它的。
是用了什么样的优秀的设计方式吗,d d d吗,怎么拆分它呢,你这些东西没写出来,嘿嘿是不是,还有呢以后不要写html,也不要写前端的东西尽量少啊,跟日子还还包括测试干嘛,这个职责这块就明显不太对了。
职责这块一定是设计类的,往上写牛逼代码的落地,我负责的网上写有一些在线的bug的调整,网上写有一些特定结构的优化,往上写,现在这种配合测试了什么代码,检查了这些东西呢,不值钱,就尽量的不要往上写。
听懂了吗,现在预购每天租房顶的物流,后面就不看了啊,大概是这样的啊,那个还是一句话,就是你想拿这份简历拿到多少钱,如果这份简历放在放在放在北京的话,估计是在2万~25000之间,这应该问题不大。
这个还可以回去,再加上他这个加上他这个没没没怎么跳过槽,这手啊,毕竟还可以啊,看看运气,有可能能还能到3万,这是有可能的,但是如果你想比较有把握的拿到年薪,30万~50万左右的这个区间。
比较有把握的拿到要增加,我给你所说的就是你的项目呀,天天一过网是能够很容易做包装润色的项目,做哪方面的包装润色是不是流量大,并发量大,数据量大,结构复杂,是不在线的,日志的跟踪啊,呃链链链路的追踪啊。
这个这个除了日之外呢,还有这个这个这个呃,呃整个的这个负载这部分了,呃优化这部分了,然后什么缓存这部分了,就是你突出这些点能理解啊,突出你用了redis,redis承载了多少多少东西啊。
中间有没有崩过呀,理论是怎么调优的呀,突出这些啊,这个会让你的会让你这个项目变得更值钱,所以剩下就是往细节里优化,你就能达到下一个吸水的高度,让我说清楚没有,我们从来都看到这了,看这个这个东西。
后端的实习,你这个不是看到这种的,我就不想看了,你知道吗,我学过哪些课,你这个对我来说有你就一定写简历,一定要思考一点,出发点是让对方看到了,愿意继续往下看,以及愿意来拉拉你这个人过来过来。
我们聊聊对方想要啥,对方你既然是想找jva后端时期,一定是对方想要java后端,你看看这里面跟张浩德有半毛钱关系吗,大学英语高数,谁不学安卓嵌入式网页设计,python c sharp。
mysql c加加,跟他们java一个关系都没有的,一个跟java关系都没有,还有我的大哥呀,这后面的我还怎么看,你就自己想去,我第一眼看到的是跟我java后端一点关系没有,我为什么会让你来。
我想要看到的是不是应该是项目相关的呀,是不是应该是和这个相关的呀,兄弟们,fly local说的很对啊,牛肉店看到是大专家没用的课,他说的非常对,fly local他应该也是面试过人的。
就是你的目标是java后端实习啊,兄弟然后你让我第一眼看到的是,第一你学的不太好,第二你学的东西跟java无关,对你要学会隐藏对自己不利的信息,学会突出对方想要的信息,就没什么可说的,你项目经验也不够。
选个权限管理,这不是搞笑的事吗,这是所有项目里面都包含的一个模块而已,比如说你没做过完整的项目,对完整项目长什么样,能不理解,要学会包装这一点啊,你记住啊,就找实习生啊,给你找正式工作。
本质上区别不大的,ok实习生,你如果过去想干真真正正的,对你以后工作有利的事情,而不是说过去打个杂,端个茶,倒个水,就一定把它当成按正式工作去找,正式工作的简历怎么写,你就该怎么写。
这是我们在校生太容易犯的错误了,就这种简历扔出去,你要有反馈,我就太佩服你了啊行吧,就这啊,没没没已经没法就往下看了,ok扬长避短,还不如写在线下培训,不知道吧,对没错,你还真不如写这个。
你说我在哪哪哪,我参加过培训,但人家让你来实习的时候还还非常有可能的,我跟你讲明白吧,好了呃,这边发了我四分,我看看有没有其他同学发给我的,再重新,如果有的话,那就再再再多讲两分好吧。
炎炎老师发了一个抽烟,这个,诶这是那个呃就这种玩法呢,一看就是经过那个专业培训的包装的,我感觉是啊,不知道不呃这个不知道我为什么没有,不知道我理解的对不对啊,这个同学的放大不了啊,烦人啥情况。
我得下载下来吗,好吧,我稍微下载一下,要不然这个放大不了啊,这个看起来太烦了,我来看这个这个这个兄弟的啊,这个感觉是经过有一些人的指点的,车,看上去就比较这种简历呢,就是大概是你呃没有经验的那些个hr。
或者是那些面试官,他会被这样,他会非常喜欢这样的简历,为什么他现在很详细发现了没有显得很细,而且大概流行的什么都懂,哎这就说明我挺需要的,这样的人是我需要的这样的人,但是对一些对于一些有相相对来说。
面食店比较丰富的,这样的话,你就有可能不一定能够能够看得了他,所以这时候呢我们为什么讲这个,你看为什么我们说那个120万年薪的简历,他优秀的原因在于什么地方,你好好自己琢磨一下。
就他第一个上来之后的自我介绍是要转眼球的,就他上来之后的第一份呢就是他的自我介绍,而并不是说个人的概况啊,我知道啊,我知道,我知道你们呢呃,就是你们这些都是模板弄下来的。
但是呢你要想方设法的是要抓对方眼球的,你就这点能理解,一定要理解啊,抓对方眼球,所以你要想办法在前面加你这种,让对方看见眼前一亮的东西,这样可以清平刚刚的求助,籍贯四川成都呃。
6年本科17k6 年17k的话,目前12更新20期望目前不是6年12,你听我说啊,那个以后写期望薪资就不要写5000多少了哈哈,还有一个一定就是大家要钱的时候,要钱的时候务必要了解市场。
市场在什么地方呢,我现在多少年,我是一个什么学历,决定了我现在正常的拿的薪资是多少,我这么跟你讲吧,如果你是在成都,你6年的一个本科生,你现在拿的最少应该是20以上,是最少的啊。
最少20以上要20k以上,有2万 2万块钱,你目前的期望薪资17k,我hr的第一想法是你现在的薪资到不了17k,我的第一个想法是你水平差,所以你到不了你能理解吗,所以不要写自己的水。
你薪水低就不要写出来,另外呢要薪资这块的一个原则叫什么东西啊,叫宁可要跑,不能要少,我给你几个,举个最简单的案例,有个人的真实水平,a和b的真实水平,这个人的真实水平是80,这个外号的真实水平是60。
这个那个什么一点的吧,这个人的真实水平是100,这个人的真实水平是60,这个人的信心不足比较谦虚,我们不能叫信心不足,就比较谦虚,追求那种有把握的事情,一个面试我要争取能通过,给我感觉很爽。
我一定要通过通过概概率比较高,所以呢我会谦虚的往上写东西,希望别人能够认识我这个珠玉,然后呢我正常的往上面写80的水平,往简历上往简历上写80水平,别人怎么灭,我都能看得出我很爽的,我面的过程很爽。
但是需要注意的是,你这双是5万的水平,80别人是看不到你那个100的水平的,我只能在我的眼睛里,我只能给你4万的薪资,因为我不能够判断你这个人的真实水平,我只能通过简历来判断你,我这我又跟你不认识。
我又不是你肚子里蛔虫,我哪知道你有100的水平,这时候你能拿到的是4万的薪资,但是你很爽,你练了十家,你会乘八家,这八家你都能拿到4万的薪资,你会很开心,但是我们换另外一个人,他是真正的水平只有60。
也就是他最真正的水平只能拿3万,但是他蹬着脚都往上写,使劲儿的往上要,还要留给别人砍价的空间,他要45000,最后给他砍成4万 4万,他最后呢念十家只能乘两家,你面十家成了八家,他面十家成了两家。
最后的薪资你们都拿了4万,这是你们真实水平,你拿大腿好好给我想想,是谁哭飞了,是谁赚大了,记住要钱这块儿就体现了你的水平的一部分了,已经给你两瓶2222瓶洗面奶,这个1000块钱一瓶,这个十块钱两瓶。
你告诉我,你下意识认为哪个洗面奶的质量更高,涨幅太高了,企业会认为被宰了,你赢了好吧,我们目前最高跨度的涨幅,长沙6000块,跑到杭州拿25000,企业人家没有没有任何被宰啊,送你们两个,送你们两个字。
傻帽啊,好吧哈哈哈,你要是真正的想多赚点钱,你就不会认为那老是在骂你啊,谁要是老师在开导你,点开你啊,又要少了好吧,直接写啊,我再跟你讲,再跟你说一遍,你真实水平什么样,没人知道啊。
就是你你简历你想写到在长沙,在成都这边,我想写到4万的水平,老师也有办法让你的简历写到,那剩下的不就是说你能cover住这份简历,是不是你就能拿到4万,你好好琢磨这事儿不就这么简单的事吗。
你不要老想着说我真是值多少钱一个人啊,给你确定一个人的薪水靠什么来确定,我在没有见过你的时候,只能根据你简历来确定,如果没有见过你,我跟你简历觉得你值4万块钱,来了之后面试4万的内容。
你过了我就给你4万,知道吗,他给大家公司说的肯定不是6k,说的是6k,只不过当时对方公司确实急着要他水平,人家面他的时候就是按照25k的水平面的,人家过了,能理解吗,当然你要是采用极端方案。
你说的你可以说不是6k啊,我原来18000,现在涨25000,很正常,就是你们好多时候吧你们的认知,你们的认知在于你的想象,你知道吗,就是你们好多认知是在你你们自己的想象,我想象的是这事干不成。
所以我就认为他干不成,你们从来没有试过啊,啊不多说了啊,就是你整个简历看上去很牛逼,但这一份就直接给就给你就给你,把你的水平拉低了,我就这么跟你说啊,好还有很重要一点叫做前后端综合工程师,这叫什么。
全站所有的大公司都没有这个梗,如果有都是打杂的,搞所有的中小公司,有的有这种岗的,基本上就属于想玩命的省成本的,一个人当两个人用的,所以这个东西不值钱,搞后端努力搞好后端,搞前端,努力搞好前端。
前端搞起来也有架构,前端架构师,后端搞起来有后端架构师,不要强调自己是前后端都干,所有前后端各都干的人,在一个老油条的眼睛里,看上去就是一个啥都会,啥都不精的人,没有重点的人。
什么时候你可以突出你前后端都知道呢,开始迈向技术加管理岗的时候,说清楚了没有,所以呢把你这种3年前端开发经验,全部都给我干掉,没有舍就没有得,该舍的要舍掉,注册用户多少,注册用户不重要。
并发量多少才重要,ok搞这些细节我就不再仔细看了,看他们没玩了,都不留给出平台,大量的业务描述不太好,少量的业务描述,重点技术描述,重点责任描述,诶这个写的不错,性能调优几秒提升到一秒。
报表5万提升到百呃,最高百万,ok这是不是就就相对来说比较值钱了对吧,这是优化,如果还有并发,还有那个那个高弹,那就更好了,听听懂了吗,所以重点往这方面引的话就行,并发高谈云原生这些问的都是可以发的。
但是我觉得你整你这个个简历,要比其他的几分好的多啊,要好得多,这个简历而且呢弹性空间很大,做细节优化做好了之后呢,可以大幅度提升薪水,都说的这几几点吧,好好改一改,把这种hydnet之类的边去掉啊。
不值钱,就是要理解现在什么值钱,什么不值钱,可,好吧我们简历简历就讲了这么多吧,尽量不要说上家工资和期望差太多吧,一般来说不要进大厂的时候,大厂会做背调,也很难弄,瞒得过去,广州末流本科5年真实工作。
连毕业7年可以要多少,24x12,24x12,大概在25万左右,35万~40万之间,建议建议这么来,要,各位要薪水这件事我再给大家重复一遍,我再给大家重复一遍,就是你们老是考虑薪水的时候。
你们是一般是一般是这么来考虑啊,我的真实水平什么样,所以我应该对应我真实水平的薪水,但实际当中呢是没有人知道你这种水平的,就你有时候真水问题未必能展现的出来,也嗯嗯各位能听懂吗,能听懂挑个音。
我这不是在教你们歪门邪道,而且只要你每一个认知就是你们啊,放弃你们以自我为中心的想法,一定要考虑,我作为面试官,或者我作为用人单位,我不认识你这个人,我跟你也不熟,我评价你这个人值多少钱,我怎么评价。
你,好好想,我怎么评价我只有一个办法,就是拿到你的简历,看你这份简历值多少钱,听懂的飘逸,所以你下一个工作想拿多少钱,就写值多少钱的简历,自己判断的不好,为什么老师的东西就在这儿呢。
也老师会帮你搞定这份简历,你应该只搞钱,然后剩下的你要干的事情就是cover住这份简历,所谓的cover住,也并不一定说这份简历所有的内容全部百分百,扎扎实实,从头到尾全做过,全掌握住no。
针对这份简历,他会问什么,能够答出来这份薪水你就拿到了,肺腑之言,听进去的扣个一,怎么走捷径就在这儿呢,你呢是有些老师可以让你很简单的走捷径,有些呢老师让你扎扎实实的从头到尾的提升。
所有的一切在于咱们的这个课程大纲,以及咱们的服务模式,一对一的服务,一对一的评估,一对一的指导,面试的陪跑,简历的优化,职业发展的陪伴,还是那句话,你们平时学个四级,知道报个班有用,学个雅思。
知道报个班有用,反而在你们安身立命,涉及到你们每个月多赚多少钱的问题上,不愿意找一个专业教练就太傻了,投资自己永远是你这辈子最应该做的投资。

它会让你翻个五倍,十倍百倍的回报。

让你翻回来,这是我们所取得的一些效果,咱们的女同学涨薪500%,涨薪50%概念,京东的。

咱们的32岁的程序员,2年没参加工作,带娃出来拿40万年薪。

比她老公都高,咱们的女成员,原来11k我们给他带到19。5,大概也就用了三个月左右时间,马老师这里的课不仅不单单是深,而且最关键是我们讲求方法,还能快快速见效,这是过年的一下突击,春节没有好好过春节。
春节期间就好好去学习了,原来拿19,现在拿28,大家都说,如果说按明年再说,明年就比今年多拿了七八万块钱,它不香吗,四个月涨了12k,1年14万,大专学历受到大厂的offer,突击了一周。
就用了一周时间,我们帮他改完简历,3500,就这么快。

修改完简历,两天十几个面试,原来没有面试。

1年没上班,信心满满,回到了ok,两个月薪水涨了66%,拿到55万年薪,敲个牛逼出来吧,这不是一个人,一堆人都能拿到这样的收益,这就是投资自己所带来的,明天最后一天是我们抽奖的最后一天。
明天也是我们的白金卡的最后一天,明天也是我们涨价前夕的最后一天,明天也是我们双旦优惠的最后一天,不要错过,记住早一天开始,其实你的成功的概率就早得多,不要想着撞了你的南墙之后啊,非得等明年过了年。
过了年之后呢,撞南墙,撞了南墙之后呢,发现自己确实比较差,才想着学习了,那是不是又晚了十好几天呢,你知道十几天能学习多少,你知道在马老师这里,一周之内的能长新的学位有多少,我给你,我给你找一找。
一周到两周就涨薪有多少,你搜一下啊,直接搜一周,这里有1000多位好吧,1000多位学员,一周就是一周,ok就干了一周报名了一周,成都20k可以吧,就一周面试前突击了,一周5。5,本科突击了一周。
1年涨了12万,我就不给你一看了,除了一周的两周的,我跟你讲,报名3月啊,实际学了两周,年限涨了6万,一个月5000,其实我跟你讲啊,真正开始学习的时候,如果按照正确的学习方案。
如果按照我们以目标驱动的学习方式,掌心这件事,马老师这里是板上钉钉,我想知道那个带丸子怎么写的简历,简历都这么写,精通什么会什么,写过什么项目都这么写,你知道那个有有毛线用。
每个人情况和每个人情况不一样,这事儿你就交给老师就行了好吧,你拷贝拷贝不来那个那个东西,如果所有的简历都千篇一律,用人单位早晚会意识到这个简历是模板,我们为什么说要每个人不同的简历。
每个人呢老师带着简历为为你陪跑,让你与众不同。

系列 6:P24:先从一个小程序了解并发 - 马士兵学堂 - BV1RY4y1Q7DL
今天我们从那个最根本的并发开始跟大家聊呃,要聊这个东西呢,我们从我想想从哪开始聊,就就从最简单的一个小程序开始好吧。

最简单的小程序我们开始呃,这个小程序呢。

你跟着我的思路啊,我先带大家读一下。

我们先从小程序开始,这小程序呢大概长这样一个很小的小程序,我们这里有个循环变量,就循环变量名字叫count,它的数值是十个亿,10亿啊,相当于我下面有一个东西呢循环了11次。
好在这里我们有一个class t t,里面有一个成员变量long类型的x啊,就这么一个非常简单的类。

好,接下来我构建了一个数组,有两个t,那么20=6 t ara一等于6t好,同学们看这里相当于呢这是一个数组,这个数组里面装的什么东西呢,装了一个t又装了一个t t里面长什么样啊。
t里面有一个小x小x大概长这样是吧,好接下来呢我们做了一件什么事呢。

往下读,做了这么一件事儿,我们起了两个线程,这是第一个线程,这个这个第一个线程不停的修改,arr 0的x修改11次,第二个线程不停的修改arr一的x修改11次,其实这个小程序就这么简单嗯。
重新用画图的方式解读一下,我们有两个对象,这是第一个t,这是第二个t好,这是第一个t里面的x,这是第二个t里面的x,然后呢我们有两个线程,这是第一个玩命改他这第二个玩命改。

他大概就是这么一个程序来这块没有问题的,同学给老师扣个一啊。

能跟得上的,有点反馈啊,ok懂懂金心,ok感谢,看这里,我们最后呢其实算了一下呢。

很简单,我们算了一下整个程序执行完大概花多少时间。

那好跑一下看。

好看这里啊,这是我们花的时间,这个时间是多少,798,大家记住的时间大概800个毫秒好吧,接下来我对小程序呢稍作修改。

改的地儿不多,就把这两行注释给打开,唉这两行注释打开之后发生什么现象呢,相当于我这个整个class里面呢,我给它加了一些乱七八糟的数据,看到了吧,唉前面给他加了七个long,从p一直到p7 。
在这个x后面呢给他加了又加了七个楼,七个类型,七个long类型的啊,从p9 呢一直到p 15,是不是哎那好,原来这就相当于什么呢,我在用画图的方式说一下啊,相当于什么呢。
相当于哎这个是我们最开始的第一个程序是吧,两个t ok这是第一个t里面的x,是第二个t里面的x,然后有个县城玩命的去改它,第二个线程的玩命去改它,那么我们改了第二个程序之后呢。
相当于在这个x前面从p11 直到p7 ,给他加了好多好多的数据,往后面呢也给他加了好多好多的数据,p9 呢一直到p 15 k相当加了好多冗余数据,当然我们改的重点改的还是这个x,右边这个也一样啊。

我们加了一堆数据,加了一堆数据啊,其他的程序其他的地方哪都没变,刚才呢我们是800多毫秒,我们跑一下看啊,现在新改过之后,这个时间注意看他是244,看了吗,就是最开始的时候是798,现在是244。
也就是意味着什么呢,同样的这个小程序哎,我们给他加了一些乱七八糟数据之后呢,它的效率提升了,来能get到这点,同学你给老师扣个一,好吧啊,稍微给我点反馈,我能知道待会是不是是不是跟上了,是不是听懂了啊。
呃刚进来的小伙伴呢给大家解释一下,那个呃腾讯课堂这边呢他出了点bug,所以呢呃今天呢大家移步移步到咱们自己,咱们自己开发的这个直播间,好吧嗯,哎这就是小程序展现出来的现象,那么这到底是为什么呢。
为什么我们给他给它添加了很多。

乱七八糟数据之后,它反而是效率变高了呢,哎我有我理解上应该是添加这些数据呢,它的效率才会变低才行,你看啊,我把它注释掉,我们就是又回到了那个干干净净的x是吧,好了又是796,哎如果我把这个注释打开。
呃再跑一下,244啊,这就非常奇怪了,这是这个原因是什么呢,在这里呢,这个原因呢其实就是并发的底层里面的可见性,ok下面呢我来给大家解释这个原因,这个原因呢比较特殊啊。

你你要跟着我的思路慢慢走好吧,我们呢从,我把这些线程历史啊,还有面试题啊,基本的概念我就我就不说了,呃我们从呃计算机的组成开始慢慢说啊,听我说呃,我们一般的所谓的这个程序呢,它是怎么执行的。
呃这个事呢比较重要,一般的程序啊,你比方说有这么一个程序叫qq啊,点e x e,假设是windows底下的qq。ex e,他没事的时候,实际上这个文件啊是躺在硬盘上的,对不对,我们把它下载下来。
想让这个qq。ex e运行,我们双击它,双击一个图标,这个qq。e x e的整个程序会放到内存里好了,这就是内存里面的这个qq,点e x c,当然你如果还想运行第二个的话,你再点一下。
还可以有第二个qq,ok对应的是一个文件,说的对吗,那好那这个程序运行的时候怎么运行的,这个程序运行的时候是这样的啊,找到main,不管你是java还是c还是python还是谁,一定有一个主函数。
找到main开始的地方,然后一一句话,一句话的把对应的这些数据放到我们的cpu里面,把对应的指令读到cpu里面,举个最简单的例子,比方说2+3,2+3,这东西是是是怎么算出来的呢。
好当我们读到这这条语句的时候,会把这两个数据二和三唉放到cpu的某个位置上,当然这个位置呢叫寄存器,用来存储数据的呃,好多同学没有学过计算机的一些硬件原理,我在这儿呢稍作补充。
总之呢就是把二和三唉放哪去呢,放到咱们的cpu里面去,好这个二和三其实正常的它在哪啊,是在内存里面是吧,把这个二读过来,读到cpu放放一个位置上,把这三读过来放一个位置上。
然后呢我们对这个23做了什么操作呀,加法操作好,把这个加法指令add o,放到我们的一个叫做program counter程序计数器,其实也是一种指令寄存器啊,大概就这意思就是记着我。
我现在要做什么样的操作啊,是一个ad的操作,这个呃加法操作,然后呢最后就得出来的数值啊,我们得出来的五唉,再给他写回到内存的某个位置上去,大概是这么个过程来,这个过程大概能听明白的,给老师扣个一。
这没有问题吧,总掉线吗,总掉线咋回事,诶首先我我我我的网络还可以啊,因为我这里显示是一帧我都没有掉啊,我一帧都没有掉好,大家看这里啊,那个,这是一个非常简单的程序的运行的原理。
你会发现呢其实所谓的一个小程序啊,呃我们来运行它的时候,其实呢就是呃cpu和内存它们之间的不同,不不间断的不停顿的打交道的这么一个过程,在这个访问过程之中,我们说。
cpu它的速度比内存的速度呢大概快好多好多倍,那大概快多少倍呢,还100倍100倍,有人说这哥们访问一下我的寄存器,如果需要一个纳秒,那么从这哥们这里要是访问到内存去的话,得需要100个纳秒啊。
这是它的速度的差距,速度非常快,那速度非常快的话呢,这就会产生一些问题啊,呃我要是读读里面数据二和三是吧,我读过来我得需要200个纳秒,读一个需要200个对一个,但是我计算一下的话。
我可能只需要一两个纳秒就搞定了,我cpu大多数的时间呢其实在等待啊,这样的话呢对于cpu来讲呢,它就比较浪费啊,我给你提供了这么高的算力,但是你用不上,那怎么办呢,怎么办呢,琢磨一下。
如果我想让从cpu往内存读数据效率变高,诶你猜猜我们该怎么办,兄弟们,课件可以领取吗,可以啊,该怎么办,还挺恶心,技能ok对放缓存这个很容易理解,就是我们在中间啊,由于它离得太远了,速度太慢了。
怎么办呀,哎我们在中间的位置给他放一个啊,离我稍微近一点,他的速度就没那么慢了,然后这里有个二,这里有个三,哎我在这里也放一份二和三,下次啊我要再在访问这个二的时候,我就从这访问了。
我就不会去那个内存里面的,我守着这个距离,如果大家理解不了的话,你把它这个这个地方理解为北京,你把这个地方理解为上海,那么当我们从北京到上海取一份数据,取得比较慢的时候,怎么办,我在济南给他缓存一份。
往这也放一份,我第一次的时候呢,济南什么什么什么什么东西都没有,但是呢我从北京访问上还访问到这个二的时候,往回读的过程呢,我往中间放一份,下次再访问这个二同学们就直接在济南访问了,听明白了吧。
那我再问你,如果从北京到济南,你访问你还觉得慢,你怎么办,还觉得慢的话,中间再放一份,天津在天津再放一会儿是吧,北京到天津,你要还觉得慢呢,各通县一份,ok那那天安门到通县,你还觉得慢怎么办。
跟那个跟那个天门到通县中间是吧,找个找个位置啊,然后再放一层等等,大概就这个意思,那么现在问大家一个问题啊,你们你们动脑筋思考一下,你说呃这一层一层的缓存,我们是多了好呢,还是少了好呢。
兄弟们认为多了好多桥,多,认为少了少了少了,好的桥少多了好少了好,这东西是这样的啊,听我说看情况对,杨大哥说的非常对啊,大家不要认为多就一定是要多少就一定要少,那不是这么回事,多有多的好处,少少的优势。
那多了的好处是什么,多的好处是当我们下次再读数据的时候,它的效率会变高,什么意思啊,比方说我们这里有一层啊,这里有一层,这里有一层,这里有一层,有好多层,由于最近的这一层离我比较近。
如果这个数据我要读的数据呢,最近这层里面有那嗓子速度当然就快多了,但是呢你同学们,你们想一下,如果在每多层的缓存里面都有一份啊,我们想要的这个数据,这个x那假如这个x发生了变化。
那是不是我这个所有缓存里面的x都要改变,想一下是不是如果内存里面的x发生了变化,我这个是不是都要改变,都要变一下,所以呢它维持它的数据的一致性,这块要花费的效率,就花费的精力就比较花费的代价。
就表达能理解我说的意思吗,就是你要保持这些缓存中间的同一个数据的,要保持一致,那你保持一致的话,由于你层数特别多,那当然你花的代价就比较高,这个比较简单,很容易理解,那好这是呃多了的情况,那少的情况呢。
少的情况是我要维护他们之间的一致性代价,我会我会比较低,我改一个地就可以了,比方说只有一层,如果说只有一层情况下呢,又会它的不好的地方在于说诶,他访问的时候的速度也会变慢,所以呃中间到底要放多少层缓存。
这件事听我说啊,中间要放多少层缓存,这件事是工业界呢经过了很长时间的探索,然后呢根据现有的这种硬件的条件,这么来决定的,到目前为止呢,我们绝大多数情况下的,我们的cpu这个缓存的大概是多少呢。
这个缓存大概是三层缓存啊,我把它称之为叫三级缓存,我们略过一些啊,vip里面讲的内容啊,主要看这个缓存的问题好到目前为止呢,我们呃呃我我不在这讲了,我们讲的就是三级缓存啊,再用用用这张图来讲。
这个三级缓存到底什么意思呢,就是从我们的cpu的计算单元啊,或者说从我们的cpu的寄存器吧,在这个位置,那么到我们的内存里面,中间呢是有三级缓存啊,这是第一集,我们称之为叫l one。
这是第二集称重解l two是第三节l three,然后呢内存这个缓存的位置呢,大家不用纠结,如果你没有学过硬件,你可能看着比较别扭一点,实际上这个缓存的位置呢是每一个单独的。
和大家都知道cpu有不同的核,每一个单独的盒都有自己的两极缓存,然后呢,好多盒共用的封装在一颗cpu里面的一整颗啊,两个盒双核cpu,那么它共享一个l3 的缓存,然后cpu直接来访问内存。
大概是这么一个过程,好同学们听我说,当我们有了这三级缓存之后啊,三级缓存的概念来来跟得上的,听明白的老师扣个一啊,我这三级缓存16兆,那不少了,挺挺大的,这块应该没这块应该没问题,比较简单。
那我来考虑一个读数据的场景,比如说啊我们现在这个程序啊,我要需要读到这个内存里面的这个x这个数好,那么读的时候怎么读呢,他读的时候是这么来读的,我首先去我的一级缓存找,我没有找到,那怎么办,去二级啊。
当然有些特殊情况,直接去二级找,就是找不着的情况下怎么办呢,往下级再再再去找啊,l3 也没有,怎么办好,去内存里面读,我读到这个数据之后呢,会顺手往l3 放一份,l2 放一份,l一放一份。
ok那我们下次再用到这个x的时候,就直接从l一可以放完了啊,大概这么一个过程呃,那好我现在再问你一个问题,大家思考这么一个场景,如果我们对每一份微小的数据,每一份微小的数据啊,这么小啊,一个比特啊。
或者一个字节非常少小的一份数据,每次访问的时候呢,比方说我就我这程序非非常特殊,我就是访问了数据一次,ok每一份小的数据,我要访问他的时候都要来这么一遍,第一个找不着找第二个,第二个找不着找第三个。
第三个找不着,ok找到我的位置,y找完了之后呢,往这儿放一分,往这放一分,往这放一分,他效率反而变低了,反而不如直接去访问内存了,是不是这样子,所以呢在这个里面我们还有一个优化的空间。
实际当中呢他是这么来读的,怎么读呢,就是当我用到一份数据的时候,比如说这个x然后我读这个x的时候,我是按照一整块来读啊,我读它一整块的数据x y z是吧,a b c啊,我一下全读过来。
如果这事你理解不了呢,你把它看成一个数组,一般来讲,我们比方比方说我们对数组做一个循环操作,是不是一个for循环啊,从第一个数据开始,然后不停的循环它,那我读我访问到第一个数据的时候呢。
我就把整个数组的数据,一次性的全部给放到缓存里,全部放到缓存里,全部放到缓存里,那就是说我只有第一次的时候,我访问第一个数据的时候,我把这个数据呢放一次,但是第二次访问第二个数据。
马上我就不用再访问第二层三层内存,这个效率就高多了,它的速度会非常快,o这个概念大家是不是能听得懂,就是我读一个数据的时候,并不是说我只读这个数据本身,而是把这个数据放到一整块里。
把它周边的数据一块拿过来,用数组的例子来举的话,就是我们用到的很多种情况呢,呃我用到数组的第一个数据,我大概率会用到这个数组第二个数据,所以我把它读过来,我下次在我离我最近的缓存里去访问。
他的效率就变高了,嗯这块没有问题的,给老师扣个一了,对空间换时间没错啊,比较程序的局部性原理没错啊,就是程序的空间局部性原理啊,当然还有程序的时间局部性原理,这个这个不知道啊。
这个咱们不管他怎么知道是不是第一次,他只要反他,只要他只要看到这个第一级缓存里没有,他就认为是第一次呀,ok大家听我说,下面你再思考另外一个问题,这个问题是这样的,就是我们这个块的这一块的大小是多少。
它大小是多少呃,是大了好还是小了好啊,我们反正我们读一次呢,要读一整块数据,这个这块数据是大了好还是小的好,同学们,来认为大好的敲打,认为小的好的话呃敲小好吧嗯,不大不小适中也看情况对啊,说的很对。
跟那个刚才的层数是一样的,就是大有大的好处,小有小的优势,大有大的不好的地方,小也有小自己的缺点是吧啊,它这个大了有什么好处呢,我们来分析一下,其实很容易理解,如果这个块越大。
那么我一次性能够缓存的数据量就越多,我一次能缓存数据量就越多的话,那我当然命中的概率就比较高,就是我找到我想要的数据里面一下就找到了,就就比较高,但是如果这个块过大的话,我读任何一个小小的数据。
都把它周边的数据全部往里面存存一遍,这个效率肯定会变低,同样的,如果这个块儿过小,存的效率保持一致性的效率肯定变高,这个没有问题,但是呢我的命中率就会变低,哇塞这外面是发生了什么情况。
呃因此在我们同样的啊,也是在我们工业实践的过程之中,找到了一个妥协,在目前为止绝大多数的情况下,这一整块数据的大小,麻烦你给我记住一个数数字,这是数字是多少呢,64个字节来给我记住,不是64位啊。
是64个字节,另外呢给这一整块数据单独取了一个名字,这个名字的名称叫缓存行,缓存行就是我们读数据的时候是一行一行来读,ok它并不是说一个一个来读,而是一行一行来读,缓存行,64个字节,这个概念听懂了吧。
等于16kb大哥,我再给你说一遍,16 64个字节ok了,这个概念叫做缓存行,cline的概念。
系列 6:P25:Java简历中哪两大点最值钱? - 马士兵学堂 - BV1RY4y1Q7DL
呃一般来讲呢,我们讲并发呢有三个非常大的特性,这三个大特性呢呃分别叫做可见性,有序性和原子性,这三个大特性,分别叫可见啊有序,我拿鼠标写不太容易写,好看了,你那个就凑合看,可见性,有序性。
还有一个叫什么原子性三特性呃,我记我用今明两天,这两天的时间,来把这三大特性的最基本的原理,给大家分析透彻,以后,你在简历上写上这块的时候了,唉能做到心里有数好吧,ok,其实我说到这儿呢。
我不知道大家会对于目前为止这个市场上,比较值钱的简历长什么样啊,有有有多少同学是有心里有数的,呃各位同学听我说啊,如果说我们讲一个简历值钱不值钱,它的核心点到底在哪里呢,我提出两个词儿。
你放在心里头去就行了,从开发的角度,基本上就是围绕这两个,就一个是大并发大并发量啊,一个是什么大数据量,各位把俩词记住,就是所有的一切的一切,你的简历值不值钱,取决于你对这两个方面,大概你能掌握了多少。
你项目里头应用多少,你项目经验够不够丰富,围绕大病发量呢,有一系列东西,从底层的到中间件的缓存的,消息的分布式的,然后微服务的啊,然后高弹性的高扩展的云原生落地的是吧,这是这是一系列。
那么围绕围绕大数据量呢,就是大数据量的存储是吧,处理计算清洗啊,包括挖掘等等这一系列,各位能能能听明白吗,尤其是这个对于有有经验的同学来说啊,请你抓住这两大核心好吧,一个叫什么,一个叫大并发量。
另外一个叫什么,另外一个叫大数据量。
系列 6:P26:缓存一致性协议 - 马士兵学堂 - BV1RY4y1Q7DL
呃我相信网上的好多,好多同学呢应该读过和缓存行有关的,一系列的方方面面的文章,呃各位同学读过的,你给老师扣个一啊,看有没有读过的,一直不清楚核到底是什么,如果你想透彻的理解的话,得去学那个数字电路。
但是你简单理解的就是,用一个用来计算的单元就可以了,嗯64x8比特对,64个字节啊,好当你理解了这件事情之后,呃,我们来考虑就是这么这么一个场景啊,现在啊,假如说这是我们内存里面的各种各样的数据。
它是呃从逻辑上来说呢,它是一行一行一行一行的,对不对,那在某一个行里面呢有两个数据,一个是x,一个是y,那好假如说啊我们现在有一个线程,那么大家都知道这个线程是跑在不同的cpu上的。
也就相当于呢我有一颗cpu,需要去读这个缓存行的数据,那么读出缓存行数据的时候,他是怎么办的呢,他首先是在一级缓存找,没有二级也没有,三级也没有,怎么办,ok在我们的内存就找到了。
注意这哥们儿要访问的是这个x啊,这个面好,这个x,但是呢他会顺带着把一整行数据全部读过来,ok它这次呢l3 里面把一整行数据缓存在这,把l2 里面缓存一份,l一里面缓存一份,然后呢我以后对于x的访问哎。
就直接从这里开始访问了哦,很简单,那与此同时啊,有另外一个cpu或者说另外一个线程,它要访问的数据是谁呢,他要访问的数据是y,他首先在这个里面找有这个y吗,没有二级里面也没有。
他去三级找三级里面有没有这个y啊,有三级里面这个y在哪个环,在哪一行数据里面在这一行,所以它会把这行数据放到这,把这行数据放在这,然后呢他就开始访问这个y是吧,这边就开始访问这个x大概这么一个过程来呃。
我们这个图呢比较容易看懂啊,那么在这里呢大家伙你瞅一眼,其实对于同一行数据,同样是这个xy所在这一行的数据,它有多少个备份,你看一眼啊,一共有多少个,同样的好备份好,一共有多少个。
一个两个三个四个五个六个,ok那我就想问你了,如果在我们这边这一行的数据发生了改变的话,我要不要使用某种机制去通知另外一行,说哥们儿,我这行的数据发生了改变啊,你这边有及时变化啊,你这边有及时。
你你要不及时变化呢,你访问到的就是没有更新的原来的老数据了,就可能会出问题,原来这个x是零,然后呢我已经把它改成100了,但是呢由于你读的比较早,你这个x还是零,现在我通知你,你得更新一下,哥们儿。
你得更新一下,不更新的话,你这个x的值就是老的值,有可能会不对,咱这块儿听懂的,给老师扣一没有问题吧,也就是说我们需要某一种机制保持什么呢,保持住我们各个缓存行之间的数据,让它保持一致,就是出香之间的。
你不要有错了的现象,ok都保持到一个最新的状态,所以我们讲每一个不同的硬件,每一科不同的cpu啊,不同的厂商都有自己的这种协议,来保障不同缓存行之间的数据,来让它保持一致,避免用到的时候会出错,好了。
这个协议呢我们把它称之为叫缓存一致性协议,叫缓存一致性,ok我们带来这个概念叫缓存一致性协议呃,有多少同学听说过缓存一致性的,有没有缓存一致性协议,这个协议里面有常用的协议有哪些,有听说过。
你敲出来有没有酒吧,有没有听说过这个词,就是m e s i是吧,网上一搜应该一大堆,这是什么,这就是英特尔,英特尔cpu经常使用的,英特尔cpu的使用的那种缓存一致性协议,呃,但是呢需要各位同学听清楚。
就是不同的这种cpu,不同的硬件厂商有他自己的缓存一致性协议啊,有的是英特尔的m s,有的使用是m s m o s synfirefly,dragon protocol等等。
这些东西呢都是现有的cpu厂商所提供出来的,方方面面的这些个缓存一致性,所以大家不要把m e si等同于缓存一致性,这块就就行了,呃,vip课程给大家详细解释了呃,至少是粗略让大家入门什么是msi。
但是在这呢我就不展开了,那个呃各位同学听我说啊,网上有很多很多文章啊,就是把msi和volatile等同起来,还有呢把m e s i和缓存一致性协议等同起来,我告诉你这些全是不对的。
全部队没有一个是对的,听我说,缓存一致性是一个普遍性的称呼,具体的协议,每种硬件厂商和每种硬件厂商它不一样,这块能理解吧,嗯ok好看这里看这里,那那么我们回到刚刚那个小程序好吧,当你理解了这件事之后。
我们回到刚刚那个小程序,就这个小程序呢你会发现诶,我把这个x前后给他堆了一堆的数据之后,大家大家稍等我一下啊,我让咱们外面的咱们的小姐姐们小点声音啊,我马上回来,这边说了放小声,说把声音放小了。
说话声音放小,ok ok好,看这里老板生气没有生气啊,看这里看这里,就是呃,当我们把x前面给他堆了一堆的数,冗余数据之后呢,我们的访问效率反而提升了啊,这个原因到底是什么呢,我们来分析一下。
这是那个第一个x,这是第二个x呃,然后我们这个这个这个线程呢,使着劲或者这个cpu的使劲使劲去访问它,这边呢使着劲儿去修改它,那么在第一种情况下,我们x前后都没有什么数据,s前后没有什么数据呢。
这俩哥们儿大概率啊,我们不能说所有的概率就是大概率位于同一行,这个没有问题吧,那为同一行就意味着什么,意味着说诶我这边呢会有这行的缓存,你这边呢也有这行的缓存,那我改完了这一行的某一个数据之后。
我只要改了其中一个呃,我肯定得用使用某种机制啊,不管这种具体的机制是什么,我一定要通知另外一个线程,或者叫另外一个cpu是吧,就是我这边改动的东西,你那边得可见可见性是不是哎我这边改完了。
你这边得得可见k采用什么样的机制,让你可见是立刻可见还是固定时间,而在什么情况下触发你可见等等,不管怎么样,我得我得使用一种协议来通知你,你想我这边改了10亿次,那我就来回来去老通知你。
我这边改了改了改了改了啊,然后呢,你这边改了第二个x也得来回来去老通知我,所以当我们这个线程开始不停的修改x的时候,看上去他们两个互相之间不影响,但其实他们在内部在不停地使用缓存,一定的协议来保持一致。
那么为什么我们在它前后加了很多数据之后呢。

它的效率就变高了,原因是什么呢,其实也非常简单,同学们,你们想一下,如果我把这两个x想办法,让它位于不同的缓存行里面,诶我前面给他堆一堆数据,后面给他堆一堆数据,然后呢这个x前面也是一堆。
后面也是一堆好了,这哥俩呢由于是这个长中,中间的长度,已经超超过这个这个这个缓存行的长度了,所以呢哎这个x位于这行,这个x位于这行,那么同学们你们想一下,我这个线程去访问他的时候,这个线程访问它的时候。
我们还需要互相通知吗,待会不位于同一行数据啊,所以你这边缓存只有这个x,你这边缓存只有这个x,没有其他了。

在这块听明白了,也老是扣个一,所以就相当于什么呢,相当于我们用了前后的冗余数据,把这个把这个把这个数据给它保护起来了,保护在一个单独的缓存行里面,是不是很简单嗯,所以它的效率就提升了啊。
这就是我们这个小程序,你把它注释打开之后,它效率提升的根本原因啊,前有同学老师理解不了这一点,所以那个我给大家画了一小图,这个小图一看就能理解,大家还记不记得还记不记得,就说我们一个缓存行的大小是多少。
是64个字节,是不是那好啊,我们一个long类型,java里面的long类型是都是多少多少啊,是八个字节,是八个字节,那64÷8,也就是我们统共一个缓存行,里面能装多少个long呢,一共有八个。
所以我在这个long前面放七个,这个long前面的这个long后面放七个,那么你想想看,无论你如何的排列组合,不管你这个缓存行到底你是你,你是怎么划分啊,你是从哪开始划,无论你怎么画。
哪怕你从这儿开始画,ok我跟前面组合成组成一行,或者从这儿开始画,我们后面组成一行,或者从中间开始画,把我放在中间,但是你放心,我绝对不会和另外一个x位于同一行,以前有同学说啊,以前的同学老问说。
老师啊,你为什么在前面放七个,后面也放七个,你你你你都放前面行不行,我做了一下实验,我发现只要前面放了就可以,是的这个是没问题的,你你把这个前面放了呢,也有可能和其他x不为同一行。
比如这个x在这个位置是不是,但是你要小心的是,有可能这个x位于这个位置,那么它和后面组合的时候,这俩哥们又位于统一好了是吧,同学们乘有两个x吗,乘有两个,你有一个数组啊,你仔细读那个程序就知道了啊。
它是它是一个数组啊,我是用我我是做了做了一个一个数组,这个x这个x啊做一个数据,ok,这就是为什么呢,我们在前后给他怼上这些冗余数据之后呢,它的效率提升的原因,那有同学可能就会说了。
说老师这这这我我要编程,我要考虑这些东西,我就累死了,对同学们听我说,你们日常要编程,要写成这样,我估计你们你们老大他他他会骂,你看不懂是吧,你在干嘛,嗯嗯所以这个东西呢大概存在于两种场景之下。
第一个场景呢,是你真的在为整个公司的人在做类库,在在写底层啊,你写的这个东西呢,你们整个公司的人都在调用,你要想办法提升你效率,可以考虑使用这种技巧,第二个什么呢,第二个是面试。
这是这这这对我们来说是有意义的,以前老有朋友问,说老师讲了半天,这些东西我谁都开发也用不上,我学了干嘛干嘛呢,很简单,过面试最简单的逻辑就是你过了面试拿25000,过不了面试,一分钱拿不着。
或者说你答出来这道题答到这个深度了,拿25000,你达不到这个深度,虽然也让你过了,拿15000,中间差1万块钱,这就是它的存在的意义,好多同学不理解,为什么大厂里面考的东西越来越深,很简单。
因为考浅的,已经不能够把大家伙的水平给区分开来了,考一个招一个切土豆的,一来来了1万人,我怎么切啊,没法切啊,我都不知道该选谁,怎么办,来加强点条件啊,了解那个刀的结构的优先嗯,刷刷去9000。
还剩1000人,还是太多,了解土豆营养的优先,听懂了吗,嗯这就是它存在意义好吧,那么真的有真的有人是这么写程序的吗,呃其中呢如果你是jdk一点七,你要读过源码的话。

那个lb q就是link的blocking,kj u c里面的那个类,他就是这么写的,如果你还理解不了的话,那我再给大家介绍一个小的框架,这个框架的名字叫this rapture。
这框架不知道大家有没有听过。

那要听过这个框架呢,你给老师扣个一distrutter,嗯然后找人来做核弹的切土豆,那没办法,做核弹的太多了。

潇洒廉价扣二其他人呢有没有人听说过是吧,有事没事的,多去了解方方面面的各种各样的框架,呃,这个discharter这个框架呢曾经获过一个奖,叫杜克奖,这个奖项相当于计算机械的奥斯卡奖。
你可以这么来理解就行了,它是英国的一个做交易的公司,l max所开发出来的,它可以理解为最,效率最高的嗯,最快速度最快的单机版的mq n q message q,message q呢就是消息队列啊。
一般来讲呢你可以把它简单认为是一个数组,然后呢我一个一个消息扔进去,有一大堆的线程往里头扔消息,还有一大堆线程呢从把这消息读出来,ok这就是一个mq,一个mp呢,大概率的同学们会认为它是一个数组来构成。
或者链表来构成啊,总之呢就是一个线性结构,但是呃这种呢一般有一个头指针,有一个尾指针是吧,我们新新来的呢,哎把这个为把把往往尾巴上放是吧,读的时候呢,你按照按照自己的规则来读,那好呃。
我们这个disrupture,它采用的这种结构呢和其他的不太一样。

它是一个环形结构,它一个环形结构,一个环在这个环上面分布着一系列的存储位啊,二的多少次方,然后我们最开始的这个指针指在零零,或者叫指在-1这个位置上啊,然后诶等我们向下挪一个,他就指到了零这个位置啊。
指到一的位置,指到二这个位置,我们指针指到哪个位置,你就往哪个位置上放东西就行了,哪有东西是我放满一圈了,怎么办,放满一圈呢,你就等着这个零被毒走了,被释放了,你就再往里头放就可以了好了。
这个玩法呢它就只有一个指针就搞定了,它不需要一个头指针,一个尾指针需要两个指针,只需要一个指针就搞定了,ok那这个这个玩意儿呢,就嗯这方面呢它提升了一个效率,它其实提升效率有两个大的方向啊。
一个是c a s,这个明天我讲给大家听啊,就是做这种无锁的等待嗯,cs然后呢,其中还有一个就是使用了我们这种catch line ping,叫缓存填充技巧,o看这里,那么他是怎么做的呢。
好我们来读一下这个指针它的源源码,大家可以想象一下,就是这个指针的话,它一定是好多好多线程去访问它,因为好多线程都往里扔吗,好多线程去访问,他,要争取对这个这个数据要进行保护啊。
要不要和其他数据混在一起,不要和其他的有用的数据混在一起,这个呢万一其他数据改了,他们两个位于同一行的话。

还得来回来去的进行这种缓存行的一致,效率就变低了,这个东西呢它是追求效率的,框架名怎么拼,没记住这个啊。

给大家打开这个框架,disrupt。

闪电啊,你如果你如果没记住的话。

那你就记这个闪电就可以了啊,英文的闪电像闪电一样快,不是那个疯狂动物城里面的闪电。

好,我们来看看在这个destruction它的框架里面呢。

有一个非常好玩的东西呢,叫做ring buffer,ring环形的buffer,环形缓冲区,也就是我们刚才画画的那个环形的那个,纯消息的地方。

好我们点开这个rain buffer,看看它的源码,你会发现很好玩这个东西,这是那个指针最开始的位置-1啊,然后呢你会发现在这里放了七个lp 1,一直到p7 ,好吧好不好玩,是挺好玩的。

p11 直到p7 ,如果你没有听我讲过,你一定不知道这玩意儿是干嘛使的,很简单,它就是保护那个指针的,不让那个指针和其他地方位于同一行,这样他的访问对那个指针的访问的效率会提升,o来这块能看懂的。
给老师扣个一,是不是有人这么写程序啊,他这应该没问题啊,阿里的基础职位嗯,那有同学说老师这不对啊,你你你只在一边放了呀,只有一边有p到p7 啊,这个不对啊,我们我们刚才讲你要是有一个数据的话。
你得给他放一边,你这x你这个它放在这边,那右边有可能和其他的这种有用的数据。

组合在一起啊,那不对是吧,应该还有还有一个p一到p7 才行才对,那么它在哪呢,看这里rain buffer的父类叫rain buffer fields。

我点进去ring buffer的父类叫ring buffer pad,专门用来做填充的。

好在这里又有一个p一到p7 ,所以你可以想象一下,这个x前后都有p一到p7 的保护,那么是不是访问它的效率。

在高并发的情况下就提升了,来这块听懂的给老师扣一有没有问题,这就是最简单的最基本的一个可见性,但是它和程序的可见性还不太一样,它和语言无关,不管你是cc加加python java。
随便你在它最底层的运行上,就是必须要保持缓存行的可见性,o挺好玩的是吧,嗯好当你理解了这件事之后呢,算是开开个胃啊,上点开胃菜,大家呢先理解了一点这种最基本的东西,下面呢我们来讲深入一点的。
稍微难一点的好吧,呃下面这个东西呢我们把它称之为叫做有序性,呃,可见性相对简单,其实就是各个缓存之间如何保持一致,这个改了之后怎么通知对对方好了,这个可见性,那么概念上相对简单啊。
那么第二个呢这个要稍微麻烦一点,这个东西呢叫有序性,打起精神认真听,就是我们写程序的顺序啊,程序执行的顺序。

有同学说了,老师你这还有什么可讲的是吧,好同学听我说这个小程序呢,我先让他跑起来,因为这个小程序出结果会非常的麻烦,非常难,有可能最长的时候我等了呢,哎运气真好啊,这次这次只是2万多次,我就得到了。
结果我有一次等等,等,他的话等了十几分钟才得到结果啊,好看这里啊,我给大家解释这个第二个小程序,这个小程序呢比第一个小程序稍微复杂一点点,你要认真听啊,不要,不要走神,不然很容易跟不上啊。
听我说这个小程序是这样的,我们有四个数据,这次数据比较多,x y a和b这是我们四个数据,一个是x,一个是y啊,一个是a一个是b啊,最后我们考察的是这两个x和y的数据,a和b呢就是用来做存储用的啊。
一会儿往下看就行了,然后呢我们进行了一个大量的循环,基本接近于无限次的循环,接下来我在每一次循环里面,每一次循环里面我干了一件什么事呢,起了两个线程,这是第一个线程,这是第二个线程。
好第一个线程干了这两句话,a等于一,x等于b第二线程干了这两句话,b等于一,y等于a就这么简单好,我现在呢需要大家说考察的是什么东西啊,就是这是第一个线程干的两句话,a等于x等于b。
这是第二个线程干的干的两句话,b等于一,y等于a,我现在如果说这是第一句,这是第二句,这是第三句,这是第四句,我现在想问你的是,我们,正常的理解,按照正常的理解,这四句话在时间上先后执行完的顺序。
会有哪些种情况,比如说我第一个线程执行完了,第二个线程才执行,我们执行的顺序就是1234,当然还有一种可能性是第一个线程执行完了,第一第一个第一句话,然后第一个线程暂停了,轮到第二个线程执行。
第二个线程的执行了第三句,然后轮又轮到第一第一个线程,第二句1324能能明白我说的意思了吧,兄弟们,就是我现在要考察的是,这四句话的前后的执行的顺,序的组合到底有多少种。

这个大家知道吗,这个组合有多少种啊,就是这个前后的顺序的组合有多少种,这个不不不一定啊,四种no no no,没那么简单啊,这个我就不考大家了。

排列组合是吧,比较麻烦,你得自己排。
系列 6:P27:并发编程底层原理(一) - 马士兵学堂 - BV1RY4y1Q7DL
大家看这里就行了啊,看左边基本上就是这么几种啊,这是第一句,第二句是1234或者叫3412是吧,这种情况啊,1324对吧,嗯3142ok或者1342是吧,然后呢3124大概基本上是这123456。
一共有六种,一共有六种啊,基本就是六种,基本没有其他情况,ok组有六种,看看明白这意思了,兄弟们,那好我们要考察的是什么呢,在这六种执行的情况下,六种不同的情况下,我们最后得到结果。
得到的x值和y的值到底是多少,好我前面讲的能跟上的,你给老师扣个一啊,我讲的是每次讲的是小程序呢,由于它稍微复杂了一点点,好多人跟跟不太上,给我点反馈好不好,所以对,那我们考察这六种情况之下呢。
最后最后得到的x y的结果到底是几,反正的初始值都是零,你看啊a等于一,x等于b那这个时候x的值呢,由于b初始值是零,所以x等于零,b等于一,y等于a,由于这个a已经变成一了,所以y变成一。
所以最后我们得到了xy的结果,这个是零一,以此类推,这里得到的是一零,其他所有情况,像这种的得到是一一这种的一一,这种的一一这种的一一,那就意味着,不管他们之间无论进行任何的排列组合。
不管你怎么进行排列组合,随便你最终我们会得到三种可能的结果,第一种是零零,第二种是什么零一,当然啊一零是吧,还有呢啊对不起,没有零零啊,sorry对不起,三种可能的结果,第一种是零一是吧。
第二种是什么一零,第三种是什么一一,就这三种不可能有,第四种不可能有第四种,各位听明白了吗,好讲到这儿还能跟得上的,给我点反馈,给老师扣个一啊,呃但是呢你会发现,如果你去执行这个程序的时候。
这个程序的什么时候会结束,只有在x和等于零和y等于零,这两个x就是发生了零零这个情况的时候,x y同时为零,我们最后这个成绩才会结束,你会看到我第23841次循环,我们得到了零零这个结果,好不好玩。
那这事就很奇怪了,按理说是不可能的,为什么他会有零零呢,why,神奇密斯卡对,因为发生零零的可能性呢其实并不高啊,不太容易发生,所以有的时候我们一一个程序,一个程序要跑下来的话呢。
有可能你要等好长好长时间,才有可能会发生零零啊,像我第一次运行2万多次就出来了,这个是属于人品好,你像这个第二次在运行,你就等吧,也不知道要等多长时间了,就我们就不等了啊,我们一会儿先讲着课。
然后一会儿你就会看到它的结果,好吧,呃为什么会这样啊,同学们,我们来分析一下在什么情况下才会出现零零,因为你按照排列组合来说,你这种情况是不可能出现零零的,对不对,想出现零零的,基本上是这两种情况。
注意看基本上这两种这两种情况,这两种情况是什么呢,首先是交叉执行,写这个这是第一个啊,第一个本来是a等于一,x等于b是这这是112这个顺序,结果它变成了二一先执行了,第二句话,x等b后执行了a等于一。
ok这时候x等于零没问题,同时呢与此同时第二个线程也反过来了,知道吧,原来是三四的顺序变成四三,先执行了y等于a后执行了b等于一,或者反过来或者反过来交叉,无所谓,能看懂吗。
就为什么这种情况下会非常的稀有稀少,是因为我们不仅第一个县城里面,两句话的顺序变了,另外的第二个线程里面,两句话的顺序也同时变了,并且两个是交叉执行,ok在这种只有在这种可能性之下。
我们才能得到零零的结果,o,好了,这次我们是循环了,你看啊,这次我们是循环了多少次,是27万,这次运气就不太好是吧,循环了270775次之后,我们才得到了零零的结果,ok那也就意味着一点。
我们其实就就就就先先不用讲各种各样的理论,我们从结果来看就已经推算出来了,你看到的不一定是你看到的,你看到的这两句话,a等于一。

是吧,你看到的这是第一句话,然后x等于b。

这是第二句话对吧,你看到的是应该你理解应该是先执行它,后执行它,但是未必有可能是先执行的,x等于b后执行的a等于一好了,这个东西呢就是我们讲的程序的有序性,一般来讲有序性只有一个线程,不会造成严重后果。
没有没有后果,只有一个线程的情况下,你有序性你打乱顺序没有关系,按照规则来就可以,但是在我们多线程的情况下,县城之间的有序性会造成各种各样可能的混乱,而且这是面试的一个重灾区。
我们先讲清楚了这个有序性的概念,来这块听懂的,给老师扣一,我们再来,我们先讲几道和有序性有关的面试题,你们来体验一下,就是说有序性有关的面试题大概长什么样好吧,怎么保证线程执行顺序,我一会儿给大家讲。
比较简单不难,我们呃看一个看看看看看看看看这个吧,看这个呃这个小程序呢,那他的你可以考你的是要找bug好吧,你看看这个小程序有有什么bug存在,这小程序的模拟是一种什么情况,是这么一种情况。
当某件事发生的时候,我要干什么,这个说起来容不容易解释,你可以读成语就行了,我们假设有一个number值,这个number值ok我我我我媳妇的年龄是吧,他现在还比较年轻。
什么时候这个number值变成18了啊,我就娶她为妻,大概这么一个情况呃,我先回答第一个问题,就是这个private static int number,我没有给它设设初始值啊,没有给它设初始值。
同学们告诉我这个初始值是几,number的初始值是几啊,兄弟们,这大家知道吗,这个应该应该知道啊,这个必须得知道,对不对,哎是零,没错啊,说的很对啊,这number的初始值是零,那好。
然后这个是我我媳妇这年龄什么时候准备好啊,我用我用另外一个值给它做一个监控,这个值呢叫ready类型是word类型,布尔类型的ready等于false,什么时候呢,它变成了我能娶她为妻的这个年龄好了。
这个时候这个ready就变成true就可以了,所以呢我在这里有一个观察者线程,readers threat,在这个观察者县城里面呢,我就去读,well,not really,只要你还没有变成true。
well,not ready si yield,我就我就不停的循环不停的循环,什么时候你ready变为true了,我就把这个number值给你打印出来,表示啊,这件事发生了。
那好在我们的主线程里面启动读者线程,接下来把number设为42啊,42我们就结婚是吧,ok然后把reading设为true,那么大家就可以想象一下,number呢已经设为42了,看这里你可以想象一下。
number这个值已经变成42了,然后这个ready已经变成true了,我这个线程一直监控这个ready是吧,这ready已经变成true了,好了,我就开始去访问这个42了,ok大概这么个情况好了。
这个小程序呢呃有两个bug,其实这个小程序有两个,有两个bug,你们找出其中一个来就可以好吧,同学们告诉我,这小程序什么地方有可能会出bug啊,看看是不是能够找出来,54321顺序对,顺序没错。
咱们刚刚讲完有序性吗,好我就问一句啊,就是同学们你们想一下,这是两个线程啊,啊这是第一个线程,对不对,这两个线程啊,这这是这是第一个线程,然后呢我们的主线程是第二个线程,同学们,你们想一下。
我这两句话就是number等于42和re等于true,这俩哥们我刚才讲了两句话,有可能换顺序的,那有没有可能这个ready等于true,放前面去了是吧哈哥俩换了个顺序,ready等于true放前面去了。
正好还没有来得及,就稍微的给大家解释一下啊,这是那个reading等于true,本来正常情况下number等于42,你理解他是在在在在这个前面执行,是不是,但是不好意思啊,这俩哥们换了个顺序是吧。
那等40跑下面来了,reno一处跑上面去了,就跟刚才我们看到的那个那个那个语句一样,他俩换了个顺序,那么在这种情况下,ready已经设为true,还没有来得及去执行,number等于42的时候,好。
我们这个线程执行were not ready,哎ready已经为true了,那就那那就继续往下执行了,直接把number值打印出来,注意这时候number还没有14,42呢,等于几啊,输出为零。
这就不是我们想要这个结果好吧,为啥会换顺序,一会儿我讲为啥我们已经观察到这个现象了,o所以我们可能会得到零这个结果,这明显不是我们想要的,o这是这个小程序的第一个办法,就是它的有序性造成造成的啊。
总之有序性这件事你就一定要知道,就是在我们的单线程的两句话,他前后有可能会换顺序,注意是有可能呃,在这呢我我我先给大家讲为什么会换吧,好不好,先给大家讲为什么会换顺序啊。
我先讲为什么一会儿再来继续讲题好吧,认真听,为什么两句话有可能会换顺序呢,其实呢答案非常简单,是为了优化,是为了提升效率,所以我们计算机的很多地方,都是为了提升我们的计算效率。
ok我们假设有这么一种场景,这么一种情形,认真听呃,我呢有呃做了有有我cpu有有两条指令要运行啊,这是第一条指令,第一条指令呢是去内存里面读一个数据,回来漏的一个数据啊,low的一个数据。
注意去内存里面读,那么第二条指令是什么,这第二条指令是我在我自己的本地的某一个,寄存器里面做一个加加操作啊,比如爱佳佳这个i呢已经在我寄存器里面了,同学们,你们想一下啊,我们假设一下。
我们假设我们从呃我我我是我,我前面刚刚讲过,说这个cpu访问内存的时候呢,它的速度比较慢,我们假设读着读,把这个数据读回来,我们需要100纳秒,好,我们做这个艾加压操作呢,他正常的其实它速度非常快啊。
正常就几个纳秒,我们假设吧假设需要20个纳秒啊,假设好,如果说我严格按照两句话的前后顺序执行,严格按照一二,严格按照前后的两句话的顺序执行,那么总共要花费的时间是120个纳秒,能看懂吗,这个应该没问题。
但是呢如果说我去发了一条读指令过去,我让这个这个读去读内存,我还没有来及读回来,这个过程之中,反正我等着也是等着我这100个大表,等着也是等着我在这个时间呢,先把这个爱加加操作给他先做了。
放前面去先做了,明白了,就是我们还正在执行这条语句的过程之中,还有另外一条语句,执行完了,我们最后得到的结果是多少呢,注意是100个纳秒,我们节省了20纳秒,来这块能听明白的,给老师扣一。
如果你还理解不了这件事,我给你给你举个最浅显的例子,比方说我我现在要吃饭,我吃饭的话,那我肯定要做锅做水,然后烧菜洗菜切菜,然后呃蒸米饭等等,有一种呢就是说我我我先跟着做锅,刷锅做水是吧,然后等水开了。
我再我再去切菜,再不弄弄,这个太慢了,怎么办啊,在等水开的过程之中,我就把菜给切了,把那个其他的全都给准备好了,把我锅碗瓢盆全全给摆好了,ok这个效率就提升了,就这么简单,所以它的本质上是为了优化。
那好那好,那当你那个理解了这件事之后,还有同学可能就会说说老师这能随便换吗,他有可能会换,但是他能不能随便换呢,答案当然不行,某些情况下两句话是可以换顺序,但是某些情况下是不能够换顺序的。
给你举个最浅显的例子,就是前后这两句话存在依赖关系,比如说我们现在有这么一个这两句话,i等一爱佳佳来,你告诉我这哥俩能换顺序吗,能不能,这百分百不能,这哥俩换了顺序,我们最后得到的爱这个结果。
i是内存里面有个值,它它它它就不一样了,对不对,i等于i加加,我们得到的结果是二,我们要反过来的话,a加加a等于一,我们得到的结果是一,所以这两句话叫做存在前后依赖关系,那这两句话就不能换。
这东西由我们的优化程序来判断编译器,来进行判断编译优化啊,呃当然执行的过程中也可能进行优化,来这块能听懂的老师扣一单线程不会,no no no no no no no,注意所有的有序性指的就是单线程。
单线程里面才存在有序性,多线程有序性是正常的,多线程乱序是正常的,兄弟们,你多线程两不同,不同线程能连这几句话,但那那这个顺序是我是确定不了的,这就是单线程的两句话,他们的乱。
他们的乱序才能称之为叫叫有序性,ok但是单线程的有序性啊,呃按照规则来的时候,他不会对最终最终结果产生影响,只不过在多线程的情况下,他才会产生影响,这个比较麻烦,我再说一遍,我再说一遍啊,这里有点绕。
就是单线程,比方说这两句话,i等于1g等二,这两句话可以换顺序吗,随便换是不是,反正最终的结果呢都是哎,这里面这个i的值和j的值,最终结果都是一样的,随便你放前面,放后面都一样好了,所以在单线程里面。
这两句话是随便换顺序的,o但是多线程就像刚才那种情况,就有可能发生我们不可预知的情况,有可能发生我们理解不了的情况,ok所以单线程的有序性是为了提升效率,但是它会造成多线程的麻烦。
来各位听懂的给老师扣一,那我们讲讲最简单的这个换顺序的原则,就这两句话,怎么样才能允许他换,怎么样不允许他换呢,其实最终的判断是单线程的最终一致性,就是你只要最终的我们得到这个结果是一致的,你就随便换。
a等于对等,二,你谁谁在前,谁在后,我们得到的i和j的值都是一样的,但是最终一致性不能保证的情况下,你就不能换,这时候这是最终的一个一个判断,当然里边的判断需要各种各样的技巧,他的技巧比较多。
那是编译器干的事,你可以暂时不用理解它,好简短总结,为了提升效率,单线程可能换顺序,但是换了顺序之后,在多线程的情况下可能会惹麻烦,这就是我们要讲的最基本的概念,呃我讲到这儿还能跟上的,给老师扣一。
我们下面要上一点难度啊,我希望你前面都能理解了好吧,因为前面这些个呢我们讲只是一个偏便宜点,说明是1万多的难度吧,后面我们可能要上到三四万左右的难度啊,这个难度呢就更难一些,注意看呃。
我们来看我们来看这件事,也是多线程的情况下引起的啊,多线程情况引起的,这是一个著名的问题,这个问题呢叫做this escape,this escape,this指针溢出问题。
这个问题在所有的语言里面都有,各位同学,我其实今天讲的和明天讲的很多东西,都跟语言的关系并不大,它涉及到的都是一些底层的原理,这个是this溢出的问题,这个指的是什么东西啊,我们理解这件事情呢。
我们需要你理解,就是一个对象的构建过程到底长什么样,看这里啊,呃这是我们一个类啊,就它类名叫什么,不管它有一个成员变量,number值等于八呃当我们new这个对象的时候。
new这个对象的时候需要你注意的是,new这个对象的过程,我想给大家讲清楚,就是我们构建java构建一个对象,呃,其实c加加里面构建一个对象,python里面go on里面各一个对象。
它的它的这个过程是一样的啊,那都有这个过程,就是构建一个对象的过程,大概长什么样呢,呃我知道很多东西可能没有学过c,没学过c加加呃,但其实这就是你跟计算机专业科班出身的,他的差距啊。
我希望给大家补补一点这种基础的知识呃,我们所谓的构建一个对象啊,比如说我们现在有一个类叫t,然后它里面有个成员变量叫number是吧,其实我们所谓的构建一个对象呢,就是首先我用这个对象的大小。
在内存里面申请一块空间,构建出一个空对象来,然后它里面不是有个x吗,哎我把这个x的值呢再付给他啊,比方说等于八就ok了,这个大概是一个过程,下面呢我们来跟踪一下这个过程啊,就是new一个对象的过程。
认真看认真看啊,我给大家呢为啥在看清楚这个过程,我给大家这块一定要跟上啊,就是我刚才讲完了111万,1万多的这样的面试题,我们现在下面要讲三四万的面试题啊,这个面试题呢肯定会稍微难一点点,注意看。
我们看这个啊object,我们看一最简单的就是object o等于new object,我们这是一个最简单的java程序了,我跑一下嗯,好我们跑完这个程序之后啊,大家都知道这个java程序的执行呢。
它最后会翻译成class文件,会翻译成为一次解码啊,就是它内部的执行过程到底什么样,我们可以通过观察它的字节码的执行,能知道它内部是怎么执行的,好注意看我们观察它的字节码。
will so bad code啊,去显示它的字节码是吧,找到方法这个了,这一栏找到main方法,找到它的code,好注意看这个就是整个程序的执行过程,这就是整个程序的运行过程。
就是这也就是我们另一个对象的过程,这个过程呢呃看上去跟天书似的,不过没有关系,我稍微给你稍作解释,你就理解了啊,这里面起作用的指令大概有这么几条,第一个是new申请一块空间。
第二个叫invoke special,调用构造方法,第三个叫a store,建立关联,duplicate,不用去管它,return,不用去管它啊。

我现在不跟你解释那么多乱七八糟的。
系列 6:P28:并发编程底层原理(二) - 马士兵学堂 - BV1RY4y1Q7DL
我让大家看清楚这个东西来画一个图啊,这个也是美团的其中的一道问题,就是构建一个对象的过程,对象的构建过程,好我们来看这个对象的构建过程,具体的class t m等于八,然后呢t小t等于6t啊。
我们怎么把这个t给构建出来,这个汇编码呢,我给大家写在这儿了,这是第一句话,叫new new是什么意思啊,兄弟们很简单,就是t有多大,就在内存里面给他分配多大的一块空间,o不给他放这儿好吧。
就把这个t的大小的空间给它放,大家都知道t里面有一个成员变量小m好注意,当我们把这个东西给它分配出来之后,我就现在问你没有执行后面的时候,这个小m的值等于几,等不等于8=8吗,等于几,这小m值等于几啊。
兄弟们来告诉我一下,末乘车等于零,没错啊,说的很对,就是最开始的那个默认值吗,你不给它赋值的时候,它默认值不就是为零吗,是不是这小m值等于等等于零,好注意执行到这句话的时候,这小m值等于零。
那什么时候这个m值才会变成八,是调用完这句话叫invoke,invoke是调用的意思,special叫特殊调用,调用了哪个方法呢,t initialize,也就是t的构造方法,只有调用完构造方法了。
你才这个值才能确保它变为八,ok好,第三句话叫什么,第三句话叫建立关联,a store,就是这个小t说明一个指针指向了这个对象,建立管理好看,这个动画看这个动画,这里有个小t。
我们现在要new这个对象了,首先分配一块空间,m值变等于几呢,注意m值等于零,接下来什么时候才会变成八呢,执行完这句话,invoke special这个值才会变成八,看懂了吧,那最后这句话是什么。
a store,什么小t和这个对象建立关联,好,我们讲到这儿,讲到这里,大概呢有呃,new一个对象三步构成,第一步分配空间默认值零,第二步调构造方法,附初始值八,第三步建立关联,记住了吧,再说一遍。
首先申请一块空间,复默认值零,接下来调构造方法,赋初始值八,然后建立关联,通过这个指针就可以访问这个对象了,这块听懂的给老师扣一,那这个this指针又是什么东西啊。
this指针就是这个对象里面有一个this,它指向的是谁啊,指向是他自己是吧,大概就这么个意思啊,好认认真真听我说,当你理解了这个过程之后,我们下面再来看看刚才的那个小程序,它的bug点在哪里。
回到刚才这个小程序,著名的类似指针的溢出问题,在这个呃溢出问题里面呢是这么来写的,t03 ,this escape number等于八,构造方法,这是它的构造方法,构造方法里面我启动了一个线程。
new thread,在这个线程里面有执行什么东西啊,打印this number,打印this number,我我我正常的期望值,应该它打印出来是个八,是不是我在我的主线程里面,直接new了一个对象啊。
就可以了,ok大家仔细读,就这么简单,小程序有没有bug,bug在哪里,有没有,上号说零对嗯,为什么有可能会是零啊,兄弟们,这不对呀,我这点number为什么可能会是零,我刚才讲过。
是不是构建一个对象的时候申请一块空间,首先把number值,这个时候值是几啊,兄弟们是零,假如说啊我还没有来得及调用完我的构造方法,注意我们说我们调用完构造方法之后,才能保证它变为八。
我还没有来得及构变这个构造方法给给他,给他那个那个调用完成,但是呢由于我执行了其中的一句话,这个线程已经启动了,线程已经启动了,整个方法构造方法还没结束,既然县城已经启动了。
我这个这个这个number值还没有变成,我期望的这个初始值,我这时候去访问的number,是不是非常有可能读到的是它的结果是零啊,就是读到了一个我们不想让别人看到的那个值,来这块听懂了,老师扣一。
来各位听懂了,老扣一了,就这块没问题吧,这就是说,当我们还没有把这个对象构建完成的时候,我这个this指针啊就已经被其他线程所用了,这个就是所谓的this溢出,好听,我说听我说来这块应该没问题啊。
比较简单啊,有同学说这就3万了吗,没没没没有没有啊,这个离3万还差一些,离三四万的面试还差一些,大家看这里啊,认真听啊,这个呢我们呃就是说this,等于说我对象构建了一半。
但是我这个this已经被被被被另外一个显著,拿去用了是吧,这个肯定是不对的,那么怎么改正这个这个这个东西啊,怎么改正啊,这玩意防不胜防不胜防啊,呃在这儿呢,如果你读过这本书的话。
其实你就应该知道这本书的名字呢叫effective,你知道吧,有同学读过这本书的,给老师扣一,我认识一下effective java有没有读过这本书,很有名,effective java出版了之后。
由于这本书造成的影响特别好,结果后来又出了一系列的effective,这个effective那个effective c加加啊,effective c,effective python有没有不知道啊。
反正出了一系列的,它里面讲的其实很多东西呢也比较简单,就是你编程序写程序的时候一些基本原则,其中有一条规则,其中有一条规则就是注意,不要在构造方法里启动线程,为什么,因为你在构造方法里面启动线程的时候。
有可能会读到初始化了一半的对象,叫半初始化对象,其中有一条原则,我再说一遍,叫不要在构造方法里启动线程,以前有同学不理解为什么,现在是不是能理解了,像这条这条习惯犯错误的人特别多。
尤其是写那些个游戏游戏服务器的,好多游戏服务器就new一个game,其实在在那个game的构造方法里,就直接把现场给启动了,不出错是不出错,一出错你永远也查不着原因是什么,好记住这条规则了吗。
ok下面我们来看一条面试三四万左右的难度的,和这个有关的问题,好吧,也就是美团的第二问,这位兄弟拿下美团这个七连问之后,大概嗯拿了应该是拿到了50万的年薪,呃美团大概。
这个当时问问题的时候就是围绕这句话,围绕这句话就看你的基础到底深不深,围绕这一句话,大概问了七个问题啊,第一个问题是对象的创建过程,这个我已经给大家讲过了,不重复了,第二个问题,这是第二问。
答出这个问题来,唉,基本年薪四五十万了,dcl要不要加volatile这个问题,这个东西我估计好同学,有的同学可能不知道什么是volatile,有同学可能不知道什么是d c l。
这个呢我需要给大家慢慢解释啊,呃同学们听我说这个d c l不懂得它的全称呢,叫double,double check lock,叫双重检查锁,听懂了吧,double check lock叫双重检查锁。
来这个概念,如果你没听过,你给老师一个反馈,你扣个二,我看有多少人没听过的啊,我需需不需要解释一下,嗯基本上每次都得都得解释啊,那个其实这个问题呢,其实要花费的时间还比较长。
大家伙认认真跟跟着我的思路走啊,这里呢需要打开我讲的另外一门课,这门课呢叫做设计模式,设计模式一共有23种,是提升你的设计实力的,一般来讲我们是刚开始那个入行的时候,是做落地啊,别人给我设计好了。
我去把它实现那个呃当我们的能力越强,年龄越来越大,就越应该变成有一定的设计能力,设计模式是最初级的设计能力啊,我再说一遍,设计模式呢是最初级的设计能力,ok,我们在这里的呢一共有23种设计模式。
组合搭配使用,这里呢我给大家讲最简单的一种,这种这种模式叫做单例模式,这个比较难的呢,像telemethod strategy这些observer proxy,这些都比较难,应该说proxy是最难的。
single呢就是我们现在要讲的这个单例是最简单的,单例的这种设计指的是什么东西呢,就是我们需要有一种机制保障某一个类,不管它类名叫什么,它有且只有一个对象,一一般都知道我们构建一个类的时候。
t我们想要它两个对象怎么办,我扭两下new t一个再new一个t又一个,但是我们能不能设计一种机制,在某种情况下呢,我们让这个类啊只有一个对象,不能有多个啊,这种情形呢其实用的比较多。
嗯我相信稍微有点经验的成员里边用,应该是用的都非常的多,他说某一些做配置管理用的类,只需要有一个就够了,举形象点的例子,就是说你作为一个man或者你作为一个woman。
那么你只需要有一个你的husband,或者只需要有一个wife,你不能让他弄好多个,你不能想new多少个多少个,这不行,那么怎么在机制上,怎么在语法上来构建出这个东西来呢。
啊最简单的实现方式大概长这样啊,就是我们有一个类,我们首先呢对这个类进行一个初始化,构建一个对象啊,instance,这就是它的一个有一个对象,构建完了之后,注意我们把这个它的构造方法。
major 01设成private,大家都知道我设成private,就只能我自己用,其他人就用不了了,ok那别人用不了了,别人想用我这个对象怎么办,我给他提供专门一个方法叫get instance。
ok当别人想用的时候,你就调我这个方法就可以了,这样啊在我们的主程序里面,无论你调用多少次,你get instance,你get instance,无论你调用多少次,最后呢我们得到的这两个对象。
其实都是这个对象,都是instance,这大家能看懂吗,就非常简单的实现单例的方式方法,那这块也能看懂的,老师扣一啊,比较简单,这个不难不应该看不懂啊,好你能跟上这件事之后呢,呃就是我们来进一步探讨。
实现单例模式的更好的一些方法,这是最简单的方法,也是最实用的方法,如果没有,如果有人要求你实现单例模式,没有特殊情况下,你就用这种简单安全容易理解,其实越往后越麻烦啊,当然麻烦有它麻烦的一点点好处。
好处就在于效率高,注意看,现在呢大家注意看,我们首先这个单例它是这么来实现,就是不管你有没有用到这个单例,get insense,有没有用到这个对象,我们在这里呢二话不说都把它new出来了。
客人想过一种情况没有,万一我们把它new出来了之后呢,没有人用它,没有人用,你是不是把这个对象弄出来,白白占了一块内存,这个东西吗,那这个事儿不太好是吧,那不太好怎么办好,吹毛求死的成员们就开始追求说。
那我能不能有一种方式啊,我要用到这个对象的时候,我再把它初始化啊,如果没有用它的时候,我就不把它初始化了,这样子可不可以,答案当然是可以,所以就诞生了这种写法,这种写法非常的简单好看,这里我在这里呢。
我构建了一个对象,但是注意看我没有让它初始化啊,我没有把它设成new什么,在什么地方把它弄出来呢,在这里谁要调用我的get instance的时候,也就是要使用我的时候,我判断一下,判断是不是冷空。
那如果等于空,说明没有人把它初始化,接下来我把它初始化,中间,这个sleep是为了在多线程的实验环境之下,让错误展现出来用的,没有什么其他的业务上的意义好,我首先判断判断这哥们如果等于空。
那么就把它扭出来,那如果不等空,我就直接return了,直接你直接你就拿去用了好了,这样的方式看上去比刚才的那种要好一些啊,是吧,咱们要好一些,就是我什么时候用它,什么时候new它什么时候不用呢。
什么时候就不new,那但是这个方式有致命的缺点,这个致命的缺点就在于并发的时候,就在于多线程的时候啊,看这里,现在呢我这里有100个线程,每一个线程都调用了它的get instance。
拿到这个对象之后,打印了他的hash code,就是把它的hash code打印出来,唯一码啊给打印出来,我们跑这看啊,不能说唯一码就是把它的哈哈希码打印出来啊,100个按理说应该是同一个对象。
但是我们往上拉你会发现这都好多类型,468结尾的,三二结尾的,264结尾的,434结尾的,看到了没有,你会发现实际当中我们用了好多个,这可不是单例,这些人好多例了是吧,多例为什么呀,这个能理解吗。

简单解释吧,好不好,避免有同学。

水平太差,同学们,你们想一下啊,现在我们假设有两个线程去访问这段代码,这是第一个线程,然后呢,第一个线程执行到这里,if instance等空啊,判断确实等空,第一个线程暂停还没有来得及往下执行的时候。
sleep了吗,sleep了没有来得及往下执行的时候,第二个线程来了,第二行程判断instance等空等空吗,没问题,还是等空,第二线程继续往下执行,然后new了个对象,注意这时候对象已经new出来了。
放在这放这儿了,第二线程结束好,第一个线程在这个时候继续往下运行,注意他已经判断完了,所以他又new了第二次,来这块能看懂的老师口音,有没有问题,ok所以这个以后我们就用了好多个对象。
当然第二个线程为什么没有sleep大哥,他sleep我只是让大家伙看到的,你这个你问出这个问题来,我只能说明你对于程序的理解到位啊,就是你如果理解程序在cpu里面,就线程的cpu没运行机制的话。
你就要知道中间是有可能随时暂停的,随时暂停啊,我放在这里让暂停时间长一些,只是为了让大家伙更容易看出这个毛病来,好了,我们就讲到这里,上锁,什么叫上锁呀,就是我们写synchronized就可以了。
synchronized的概念是什么东西啊,最简单的理解就是,一定要这个线程执行完整段代码,其他线程才能执行,能看懂吗,就同样一段代码一定是这个线程先执行,完完完成了。
这个线程必须结束了另外一个线程才能开始,所以这就保证了,无论如何,我一定要把它给构建出来了,另外一个行程一开始发现他已经不等空了,ok那就直接拿去用,这样的话只要有一个线程完成就可以了,这个叫上锁。
没有问题吧,就是枷锁对,但是当我们把锁加在整个方法上的时候,我们通常讲呢说这个锁的力度比较大,为什么呢,因为它你可以简单理解为叫锁住的是整个方法,就是一定是整个方法全部执行完,另外一个线程才能执行。
整个方法效率太低了,因为其中有一个有可能有一些单独的业务逻辑,比方说数据库里面读个数据,文件里面读一个数据,就是就是打着输出一些数据,就是打印和和读取,没有没做任何修改。
那你有没有必要把它放在锁定的代码里边儿呢,没有这个必要是吧,同学们,本来呢你咱们说上厕所是吧,上厕所应该是你上完我上,他上第四个人在上,本来就就这么就这么点事儿,结果你非得在前面加好多业务逻辑是吧。
先吃饭睡觉啊,吃饭睡觉是吧,然后上厕所就变成了你吃饭睡觉,上厕所完了才能轮到第二个人吃饭睡觉上厕所,你这个时候的效率就变低了,来各位能听懂吗,这应该没有问题啊。
这专业名词叫critical section,临界区就是临界区越小越好,o就是我一个线一个线程单独执行的,这个代码的量越少越好,效率越高越好,ok那大家理解这件事之后,我们怎么解决这个问题。
其实也非也就非常简单了,我们不要在整个方法上上锁,我们放过那些业务代码啊,放过某些那个不用上锁的业务代码,我们在这里上把锁就可以了,if instance等空,然后上锁,然后new对象,这样子就可以了。
好这个小程序能看懂的,给老师扣一,没问题哈,过不错挺好那好,那这个小程序能不能解决,我们多线程访问之下会出现多个对象的问题呢,能不能实验一下,跑一下你就知道了啊。
看这里又输出了一大堆的hash code,你会发现还是有好多个六四结尾的,三二结尾的,六八结尾的,434结尾的是吧,还剩好多个,这就奇怪了,明明我上了锁了,他最后的结果还是不是我想要的好,我告诉你。
这就是多线程编程的比较难的地方,断轴编程难就难在这里,很多时候县城之间开始互相影响的时候,如果你的逻辑稍微有一点点不对,你认为你上了锁,也有可能你得不到你想要的结果,我看这里,那为什么他会不对呢。

为什么会这样呢,我们看这段代码。

同学问我们仔细读这样的代码,虽然说它上锁了,但是我们依然通过刚才那个方法啊,第一个线程来了,判断等空,第一个线程暂停,第二线程来了,判断等空没问题,也是也是等于空啊,第二个线程呢上锁申请上锁锁的问题。
明天我给你详细讲锁的问题叫做原子性啊,那当你理解了这件事之后,上锁上锁成功了,没问题吧,然后呢new了一个对象出来好了,这时候第二第二个线程啊,new了个对象出来,new完了之后呢,第二个线程结束。
注意线程已经new出来了,对象已经new出来了,那第一个线程是暂停在这个位置了,那第一个线程继续申请上锁,能不能成功,可以,为什么第二个线程已经把锁释放了呀,第二线程已经结束了呀,上锁成功哎。
又new了一个对象,这样的我们就溜出来俩,这里就是在代码不对的地方,你会发现呢,为什么不对,其实主要就是指的是我判断完等空之后啊,我在申请上锁的这个过程之中,还没有上锁成功。
其他有的线程已经把它给弄出来了,所以我们要改正这一点呃,所里面在做非空调验,没错是说的非常对,这就是我们最终的代码,大家应该都能理解了啊,这次就对了,没错啊,这种写法就没问题了。
这就是我们啊最终的这个写法,这个写法就没问题了,就是我们首先检查它是不是冷空,如果等空上锁,上完锁再判断一遍,说我在上锁的过程中有没有被其他人改掉,再判断一遍,你是不是依然为空啊,如果依然为空。
把你丢出来啊,那么通过这个呢,我们再来把这个刚才逻辑的跑一遍,一个线程来了,判断等空没问题,暂停第二线程来了,判断等空没问题啊,第二个线程继续往下执行,上锁成功,依然为空,new了对象new出来了。
好第二线程结束好,第一个线程继续往下运行,上锁成功,又进行了一次判断,是不是等空,注意已经扭完了,不等空了,你就不会再用,第二下直接拿来用,o这个东西就是外面一层检查,里面一层检查,中间夹了一把锁。
所以叫双重检查锁,叫double check lock,好这个技巧在各个开源软件里面广泛运用,麻烦你好好掌握,多多的掌握,来这块能听懂的d c l的概念我就解释清楚了。
double check lock,能听懂的老师可以啊,但是关于double check lock,double check lock,听我说它里面的问题还挺多的,其中最常见的一个问题是这样的。
第一个问题是这样的啊,有两个最常见的问题,第一个问题是这样的,比较简单,就是我外面这层检查为什么需要,我明明是可以不需要的,反正我都要上锁检查,我先上锁,然后再检查不就搞定了吗。
我外面那层检查为什么需要分析一下啊,其实我是外面那层检查是不需要的,为什么为什么要外面要写成检查,从业务业务逻辑上讲,我只要上锁,然后检查它等空,反正这段代码只有一个线程,为什么要。
提升并发言说嗯说的很对啊,沙华说性能对,说的很对啊,减少加速次数,yeah that,说很多的啊,细粒度使用跟那个没关系啊,减少竞争线程,省省队员对,说的很对啊,就是我们来思考一下。
如果说外面这层检查没有没有就意味着什么呀,比如说现在有1万个线程过来,我这种智能代码,注意1万个线程要上1万次,所要上1万次,上锁解锁是很耗资源的过程,是效率不高的过程,能省则省,尽量的不要上那么多锁。
听听懂了吗,那如果有这层外层检查呢,如果有一个线程,如果有一个线程已经是把这个对象new出来了,我们只要做一次判断,就省了一次上锁的过程是吧,同学们就不用上锁了,避免了不必要的枷锁,效率大大提升。
你要愿意,你们可以试试啊,你执行个11次,你看看他要多长时间,如果你外面这层检查没有的话,执行11次,看了多长时间是吧,如果说外面可以有的话,你看多长时间,你会发现效率上的明显区别之后就不展开了。
来这块听懂了,给老师扣一,这是第一个问题,但是关键是第二个问题,关键是第二个问题,这第二个问题才是要命的,这第二个问题是说就是一段这么简单的代码,居然还有隐含的bug,ok那这个bug就是美团的第二问。

这就是美团第二问d cl要不要加volatile,什么意思,我们首先分析啊这里面的bug到底是什么,分析这个bug,分析bug之前,我们先复习一下一个对象的创建过程啊,分析一下。
因为这个第一问和第二问是呃,强烈关联在一起的,呃,我们说第一问呢,就是说这个对象的创建对象创建的话呢,首先是吧,然后申请一块空间里面那个值呢所默认值为零,调构造方法得到初始值为八建立关联。
所以它由三部构成,new invoke和a store,注意这三步啊。
系列 6:P29:并发编程底层原理(三) - 马士兵学堂 - BV1RY4y1Q7DL
这个问题现在呢我们依然是这段代码,依然是代码if,因此n次等空,然后上锁啊,我们现在假设有依然是两个线程啊,兄弟们,两个线程看怎么给他摆一下,就就这样吧,我们依然是两个线程好,现在是第一个线程过来。
第一个线程过来执行到这句话,if因斯坦等空没问题,上锁没问题,判断等于空没问题,开始new对象,注意new对象是由几部构成啊,这三步是吧,new invoke a store,好了好了,听我说。
呃我再重复一遍,一个线程顺利执行啊,第一个线程顺利执行,判断等空了,上完锁了,判断依然为空,开始new对象了,注意第一个第一个线程还没有完,还没有完事儿,那第一个线程大家注意,看你你你们你们呃记不记得。
就是说我们开始new这个对象了啊,开始new这个对象了,第一个线程开始new对象的时候呢,它有三部构成,第一个线程开始new这个对象,new这里当然就生出一块空间来,注意这时候的值是几是零,认真听。
当我们new了一半的时候,后面还有两部还没有完成,这两步呢是调构造方法和建立关联,这两步好,我们现在还没有来得及执行,后面两步的时候,后面两步呢换了个顺序,我们讲过这哥俩是可以换顺序的。
你说先建立关联和先调构造方法,还有呢先调构造方法和后建立关联,有什么区别吗,最终结果是不是都一样的呀,反正就是t指向了一个对象吗,再看一遍再看一遍,第一个线程过来开始创建对象,创建了一半的时候。
后面这哥俩换了个顺序,后面这哥俩这哥俩换了个顺序好,这哥俩一换顺序不得了,相当于这句话,这句话跑前面来了哦,这句话什么意思啊,这句话是建立关联啊,兄弟们,也就是说他先建立了关联。
还没有来得及调构造方法好,正好在这个时间节点上,第二个县城来了,大家还记不记得第二个线程的第一句话,是不是判断呀,if什么t是不是等于空,来你告诉我等于空吗,t等于空吗,他10000%不等于空。
他已经指向一个对象了,怎么可能等于空啊,那如果他已经不等于空了,哎我t就直接拿来用了是吧,instance直接拿来用了,我这个时候就用到了初始化了一半的对象,注意这个对象还没有构造完成。
好再看一遍再看一遍,我们第一个再看一遍啊,第一个线程,一个线程稍微把这个缩小一点,第一个线程判断冷空上锁判断依然为空,开始new对象,new对象的时候呢,new了一半,后面这两句话换了个顺序。
先建立了关联,先建立了关联,正好在这个时间节点上,另外一个线程来了,它已经不等空了,直接使用使用了初始化了一半的对象,来各位能听明白的,给老师扣一,这个一定要理解,就是你想进大厂。
这种问题是一定要理解的啊,尤其是,想进好一点的企业,好当你理解了这件事情之后,有的人会说老师这事儿不对呀,注意看我们这段代码是放在了锁里面呀,我们new对象是放在了锁里,看到了没有。
我们这个对象是不是放在了锁里面,放了一把锁里面,是不是我们放在synchronize里面,你放在这里的时候,我们讲过这个锁被锁定代码是什么样子的,一定是一个线程先执行完。
另外一个线程才能执行这段被锁定的代码对吧,那你告诉我说我这个对象new了一半,被另外一个县城给看见了,你这不扯淡吗,我怎么可能会看见被锁定的代码,执行的一个中间状态,这不可能啊,听清楚这个问题了吗。
来听清楚这个问题的同学给老师扣一,这个问题是面试官会继续问你啊,你为什么不可能啊,对不对,你这个的代码放在锁里面的,你溜了一半啊,被别人防到了中间状态,你这不扯呢吗,如果是说我们这段代码。
第一个线程执行的是这段代码,第二线程执行的也是这段代码,那第一个线程和第二个线程,它一定是序列化执行,它绝对不可能说并发执行,一定不可能说我这个里面会读到,你这个的中间状态。
一定是你这边执行完了我才能执行,但是关键的问题在于,比方说我们现在,我们现在有,两个线程,两个线程执行的是同一段代码,关键问题在于不是说你锁定的代码是什么样啊,你要知道的是注意看啊,这是我们第一个线程。
一个线程判断冷空上锁判断依然为空,开始扭扭了一半,我们还没有来得及释放锁的时候,按理说你是不可能能够访问到的,因为你不可能执行里面代码,但是需要你注意的是,外面的这层判断。
这层判断有没有放在被锁定的代码里面,没有注意,是这层判断里面访问到了,你被锁定代码的中间态是这里访问到了兄弟们,能听懂吗,这块能听明白的,老师口音,那么它就意味着我外面没有上锁的代码。
能不能访问到上锁代码的中间状态呢,产生的中间状态呢能不能呢,答案是当然能yes,必须可以,你要不可以的话,你就相当于任何一段代码都上锁了,这个呢我在vip课里面写实验,向大家证明了的好吧。
在这公开课上我们就不证明这一点了啊,你知道这个就可以好吧,ok,这样的话你就透彻了理解的美团的第二问,至少当然人家的问题是要不要加volatile,但是你至少理解了他问这个问题的本质是什么,好吧。
volatile的问题啊,好了,我前面讲过的所有的东西,大家能听懂的,a老师扣一,十点钟我我一会儿呢再给大家讲,为什么加上volatile就不会有问题啊,因为我给大家讲呃。
我已经给大家呢放在了我们枫叶云笔记上啊。

是我们自己做的一个笔记,自己做的一个笔记软件,待会儿呢也可以呃拿来使用,目前免费啊那个,大家呢需要这个这个笔记的,我今天讲的东西啊,我估计很多同学如果你没听过,你会觉得老师。
我觉得我以后写程序我都不敢写了是吧。

都不敢写了,没法写了啊,这两句话随便换顺序是吧,然后缓存行我们看不见的效率损失等等啊,以前有一只同学有这样的想法,这样的感想,但其实我要告诉你的是怎么说呢,就是一般来讲呢,就是你理解一件事情的时候。
当你理解不深的时候,你觉得我什么都懂嗯,我不跟你讲这些东西,你看这个代码看着都比较简单,我给你讲完了你会发现哦,代码原来背后有很多很多的故事,但是不要自欺欺人,你不要认为他真的很简单。
同时人家大厂也会问你它背后的故事,但当你理解了背后的故事,你突然间发现这代码真的不简单是吧,不过呢当你后,随着你后面理解越来越深的时候啊,你会发现山还是那座山,学知识大概就是这么一个过程。
最开始看山就是个破山,有什么可看的,后来发现山里面的故事很多,各种细节特别多啊,看山不是山,当你慢慢的掌握了之后,融会贯通之后,看山还是那座山,只不过更通透了,ok,这个内容呢是我讲的一门课。
就是并发这门课这门课里面的一小部分啊,呃整门课呢它的内容比较多,我们在我们做了一个完整的,关于掌心的整个的序列,这个呢是课程中的其中一部分,那么。

这个序列是一个很有用的序列,这个序列呢我会用最快速的方式,五分钟给大家快速介绍完,介绍完之后呢,我再给大家讲为什么加volatile之后,为什么加了volatile之后,它就能解决这一系列的问题。
听明白了吗,呃这一序列呢我用五分钟五分钟快速介绍完,大概我追求的是全而且深,是大概整个序列是我是,我是我设计课程的时候所追求的东西呃,全体现在什么地方呢,从零开始,从你刚入行开始,一直到你年薪过百万。
大概在我们整个的mca的2023版里头,就全包括了呃,整个的系列的深深体现在什么地方,就是面试所问到的一系列的底层原理,底层的源码都给大家讲到位,这是比较难的,不太容易,很多机构讲课的时候呢是挑容易的。
讲应用级别的啊,教你怎么搭配,怎么配置,配置完了之后怎么运行,怎么调bug,不难,找一份初级的,找一份薪水偏低的问题不大,呃马老师这里呢是追求一个全而且深,不仅全而且深,只有到了一定的深度。
你才能拿到更好的薪资,从咱们入学开始啊,入学的第一课教大家怎么去提问,因为一个优秀的提问可以得到一个快速的回答,到学前的面试指导,学习之前的面试,当我们的架构是开始启航,启航里面呢会讲了很多。
我们计算机系的一些课程,进大厂所必修的计算机课,编程的基础啊,这计算机课程里面呢主要是包括了操作系统,网络组成原理,io编译原理,数据结构和算法,如果你是计算机专业的,你看上去没什么新鲜。
但是非计算机专业的特别多,补补计算机一些专业的专业课,然后开始讲基础项目,web项目常用的工具和软件项目呃,系列的框架,java开发框架,一系列微服务的系列框架,微服务的项目,算法与数据结构的大常客。
工作的软实力好,这篇呢其实叫启航篇,可以认为是入行篇,就是如果是你是零基础,没有入行,靠这一篇入行问题不大,在入弯行之后是提升篇,提升篇呢我们讲java底层的深入知识性能的调优。
好今天我讲的这个呢是属于这部分的,叫java的并发编程,并发编程里面呢呃我们讲了三大特性,就是在这里挑了一些东西给大家讲出来,原子性,可见性,有序性呃,今天讲的有序性嗯,讲了可见性。
那个原子性呢咱们明天讲给大家听啊,拿出这样一小节来做公开课好吧,那么将框架的原理和源码读典型的就可以,我们的一个学生拿下阿里p7 ,就靠典型源码就拿下了中间件的综合运用,实战的项目开发。
然后大概呢有十个左右的项目,供大家写在简历上,那么架构设计的理论,这个到p7 的内容了啊,呃架构方案,架构案例,微服务的专题,架构设计的知道应该叫模式和心法服务保障,service mesh。
新一代的分布式微服务云原生软件测试啊,那么当你到这一步的时候呢,差不多是五六十万年薪,七八十万年薪左右啊,到这篇就完成了,再往后呢说明要掌握大数据云原生重中之重,这没什么可说的,就是云原生的落地状态啊。
这篇文档啊,我希望大家伙拿走拿走,好好读一下,听我说为什么建议大家好好读一下这篇,因为这一篇呢,差不多涵盖了你从零到年薪百万左右,所走过的一系列的路,就是说你到年薪百万应该掌握哪些知识。
都在这里面放着吧,找老师,以前有同学大概跟我们课跟了2年左右,才报了名,实际上你2年前要报的话,他就不至于有现在的这种困境了,他现在是遇到困难了,想起我们来了那个嗯,如果说愿意跟老师学,你就节省时间。
不走弯路,刘老师来帮助你,怎么样快速的找到一条通道,我们去掌心去入行,就算你不想跟老师学,非得要自学,从头到尾读完,你也知道先该学什么,后该学什么,学到什么程度,会拿什么样的薪水,作为架构师。
你可以再了解另外一种语言,go on,作为架构师去了解c k a c k s好,在这个基础之上,我们进入到技术管理的视野,大型团队的管理,产品的管理,生产事故的分享,技术的选型管理。
ok这个呢p7 到p8 之间,如果有人特别着急找工作,我已经被裁掉了,我想一个月之内,两星期之内搞定工作的就业突击,面试指导,服务陪跑,什么叫服务陪跑呀,解问答,应该的课程指导,应该的滚动直播。
我们每天都有,只要有新技术,我们就有直播,陪跑里面还有很重要的一项,就是在在他们就业突击的陪跑,你呢呃面试什么时候遇到问题了,你要说不知道该怎么答,录音录下来找老师,老师帮你解答。
老师对你进行一对一的学习模块的定制和规划,老师对你进行一对一的全程陪跑,会实现非常快速的就业,快速的涨薪啊,项目的系列升级,有的同学呢写项目,你简历上写的不多,没有怎么办,没有项目经验,没没事儿。
来这儿选选项目,写上去,好了这是我们整个的课程可能超了五分钟,我就介绍完了,别的不想多说课程取得的效果啊。

我们就拿突击举例子吧,就拿突击举例子啊。

这是我们面试突击课,年薪涨6万,就是搞定了突击。

其他什么都没动,突击了一下,时间呢其实比较短啊。

我们搞突击的时间一般都建议比较短,1年之中的金九银十啊,这是突击三个月,这个时间已经比较长了。

我们看这个比较短的案例就知道了,这是上海面试突击一个月,八个offer涨薪入职,刚刚的2023年的2月6号看到吧。

突击四个月,四个月就不能叫突击了,正常学习了,武汉突击半个月啊,十天突击搞定,突击半个月啊,这都是突击半个月的。

这个是突击了一个月,16000涨到23000还可以吧。

16000涨到23000,就意味着每年涨了8万多,ok这就是收益呃。

别的不吹牛逼,在马老师这里,你如果找到比我们更全的,找到比我们更深的马老师,这课我就送你了,你找不到啊。
系列 6:P3:GC - 马士兵学堂 - BV1RY4y1Q7DL
ok我们继续在这里面呢,我给交代给大家澄清几个,你们在文章里头经常可能会读到啊,但是特别容易混淆的概念,就是minor gc y d c这个指的是啥,指的是年轻代的回收,如果你在文章上读到的话。
mandc y dc指的都是年轻代回收,什么时候年轻再回收啊,分配不下了吗,分配不下了,你是不是得回收一点,取满了你不就得回收吗,所以这个东西年轻的空间耗尽是被触发嘛,很正常,老年代的回收指的是什么呢。
一般的称之为major dc major,当然另外一个更加广泛的称呼叫做f g c,f的意思是full fdc,全回收,全回收其实指的是年轻代也回收,老年代也回收。
但有的时候在特定语境里指的是老年代回收,无所谓,能理解就行,概念这东西是人类发明出来用来沟通用的,原来的人类在这个在远古的人类,在广阔的无垠的大草原上,看到这么一个东西的时候,他不知道是个啥。
热烘烘冒着热气,后来他们肯定是互相打招呼啊,你过来看看这个模样的这个东西,后来终于有人类发明了一个概念,这个概念叫,说这个东西是个,它是不能吃的,ok互相之间发明出来沟通用的,你理解的东西是什么就行了。
说你非得叫它叫或者叫boopop,或者叫叫叫叫叫粑粑是吧,都都都可以,千万不要在这里咬文嚼字,凡是在这咬文嚼字的,你这个学学学习的方法,都是属于那种孔乙己式的学习,没意思啊,会把你学的特别累。
而且呢还没啥用好了,灵活一点啊,灵活一点,就跟刚才那p 10似的是吧,你承认你就承认他牛不就完了吗,你每年四五百万的年薪拿到了它不香吗,看这里啊,老年代无法继续分配空间。
是触发了新新生代老年代同时进行回收,就老年代满了就触发f g c了,这不很正常吗,刚才不是有同学问吗,你像这样的问题,为什么还要问老师,那我搞不懂什么时候我要清理啊,哎当然就是空间占满了,我要清理。
当然这是一个形象的概念,其实呢它有一些特定的垃圾回收器,每种是不一样的,有的垃圾回收器是占到一定比例的时候,就开始回收了,有的垃圾回收器呢,是需要确实要占满的时候才来才进行回收,而总而言之。
空间不够使了,我预测到空间不够用了,我马上要开始清理了,这个时候开始触发,所以下次你们再聊,这种概念的时候一定给我记着,你们第一次聊的时候,一定得跟面试官聊,我用的是哪种垃圾回收器,各种垃圾回收器。
他用的东西,用的算法以及各种触发的时机都是不一样的,你要这么问的话,就显得你特别业余,o我们再稍微回顾一下哈,我把一些细节先忽略掉,做一个小小的动画总结嗯,这个小动画呢大家看完脑子里存印象,一般来说。
动画的对你脑子里的刺激会要比图片要好,图片对你脑子刺激要比文字要好啊,所以我尽量的选择刺激你更加强烈的地方,ok,当然做动画其实挺难的,我这动画做了俩小时啊,基本上三分钟就给你演示完了,好好听。
当我们new出一个对象来的时候,首先他会在站上进行分配,你记着就行了,有这么一回事,如果你要非要细究这个概念的话,你学过c语言里面有一个struct结构体,你又能理解。
为什么java里面还可以在站上进行分配,在站上进行分配有什么好处啊,如果没学过,你就单独扔一边,不管它,总而言之,java某些特定的小的对象是可以分配在栈上的,在站上有一个什么好处,大家还记得吗。
这站是个什么东西啊,站里面装的战争,每个方法对应一个战争,对不对,哎这个方法里面用到的这些个对象,如果方法结束了,整个战争,背往下一盘,就是就是暂停指针往下一挪啊,这意思,里边这个内存就回收了。
就这么简单,所以如果你要是把对象,把这个对象分配在栈上的话,分配在这里的话,什么时候对象不用了,分弹出去了,给它效率非常高,它不需要什么呀,只需要g,不需要gc的介入,不需要清洁工的介入。
不需要你爸爸妈妈来帮你清理这些小线段,这是在栈上分配,如果能在栈上分配下,分配在栈上站,只要往外一弹,整个程序就结束,这个对象也就结束了,当然如果站上分配不下怎么办,分配不下,看这个对象够不够大。
多大是大,可以自己设置好,如果对象个儿特别大,这个时候直接扔到老年代,而不会扔到年轻代,ok老年代什么时候他才会被回收啊,只有经过fdc之后,那不大不小,也不能在站上进行分配,那这时候分配在哪呢。
这时候分配的一个空间叫t r a b,叫three local cation buffer,全称是这样的,thread,这不写了啊,这很简单,线程吗,local线程本地allocation。
lover好,allocation的意思就是分配的意思啊,allocation我就给你写错了,叫县城本地缓冲区,有同学说这是个什么东东,别着急,你听我解释,如果你在这里能分配一下,或者在这里分配不下。
其实最终都会分配到一边去,所以这个东西呢,呃你知道有这么一个东西存在就可以了,除非你调音调的特别精细的时候才需要调,这个一般用不着啊,一般用不着,t r a b是个什么东西呢,叫做县城本地缓冲区。
什么叫县城本地缓冲区,是这么一回事,当我们往依恋区里头分配对象的时候,我们有好多好多线程,每一个县城都要往里头分配,那就会有县城竞争,我们都要抢抢这个空间,第五个小格,我的我的我的我的。
那么到底是谁的呢,所以我的jvm要管理这些线程的竞争,因此我要浪费好多资源,管理这些线程到底竞争所同步吗,那那好,所以在gbm里面做了这样一个优化,就是每一个线程启动的时候,给每一个线程。
在伊甸区里面分配一个小小的空间,是这个线程专属的,我觉得这个是这个写成专属的,这是线程一专属,这写成二专属,当分配对象的时候,线程一的对象,优先分配在自己单独的这块空间里,不要去抢公共空间。
这样就不用进行线程同步了,效率就变高了,也不知道我说清楚没有听明白,同学给老师扣一,这个叫t r a b,对,象不是分配在堆吗,对你在去学幼儿园的时候,对象就是分配在堆的,你现在讲大学对象。
就是可以在分配在各个位置的,t a b跟sr local有什么关系,没有半毛钱关系,就是不需要加速,你说对了,超tvb是在伊甸园里的e目前是难怪要用线程池,我感觉你的脑洞有点大。
这跟线程池有半毛钱关系吗,好我们继续当一个对象进入一点去之后,经过一次垃圾回收,如果被清掉了就结束了,如果没被清掉,进入到survivor区,survivor区域又经过一次垃圾回收,如果清调结束。
如果没被清掉,看他年龄够不够,年龄够了,进入老年代,年龄不够,进入另外一个survivor,如此循环往复再看一下这动画,当我们new出一个对象来的时候,首先尝试在站上分配,不符合战上分配条件。
嗯符合就在这儿分配不符合,看它个够不够大够大,近老年代不够大,进t r a b t r a b装不下了,进伊甸区,不管是不是最后都是在一定区里,一区你回收一次进survivor 1 slaver。
一又回收一次,看年龄够不够,年龄够了,old区年龄不够,survive 2循环往复k来能get到这个动画的,李老师可以把图装一下吧,老师什么是线上分配条件,你这个太细了啊,s一和s2 互换位置。
他为什么要互换位置,互换个名字不行吗,大哥刚开始这个是空的,它叫做to,下一次那个是空的,那个叫土不就完了吗,每个线程都有一个特t r a b吗,4d,请同学们有点问题,我暂停一小小会儿给大家回答。
大家错了,这个这个这个常见的问题啊,t r a b再讲一下,不能再讲了,l a b再讲一下,讲啥呀,提问吗,经过tvb有什么意义,tvb县城本地的不需要加锁了,好多线程。
如果没有t r a b好多线程往e点去分配,是不是大家得竞争啊,锁竞争多线程嘛,你要多线程技术没有,那那可没法跟你讲了,就那大家不抢吗,谁抢到算谁的,我是不是g y m得花精力,换资源去照顾这些线程诶。
是不是该你了,是不是该你了等等,线程同步,但是如果每个人都有自己私有的一块空间,我要拿到一个对象之后,优先往自己私有空间里装,我需要跟其他人做同步吗,需要跟其他人抢吗,不用不用,我是不是效率就提高了。
是的,可以关闭t r b e s,还可以用cs,你这不废话吗,近战条件是什么,近战条件叫做可以进行标量替换,以及不能存在本地逃逸,也就是说要进行逃逸分析和标量替换的分析啊,怎么定义大对乡村的max。
什么什么什么什么size threats hold,你搜搜一下,一搜就搜到了一电车,什么情况,直接到end,年轻代啊,年轻得回收,清完把它把它都清了,不就end了吗,t l v d和县城站有什么关系。
没有半毛钱关系,stop the world good,什么时候t l b放不下,装满了就放不下了。
系列 6:P30:并发编程底层原理(四) - 马士兵学堂 - BV1RY4y1Q7DL
呃对于课程有疑问,要下面我们回到技术继续来聊,怎么样才能解决乱序的问题,ok下面这段还比较难啊,你认真听,来准备好的同学给老师扣一,下面这段还比较难,认真听,好听我说听我说。
嗯我在这里给大家简单画图讲解,仔细听,就是同学们你们认真想啊,说我们现在的多线程的情况下,引起问题的麻烦的原因,其实原因就在于这两条指令呢,你不能够控制它换顺序,或者说你不允许他换顺序,能不能做到呃。
我们先讲最底层的,去限制两条语句换顺序的这个逻辑好吧,我们先讲最底层逻辑,它跟语言无关,在这呢你忘了各种语言,不管你是学够学java,学学c,学c加底层的呢,它都是一样的,掌握底层就掌握一切啊。
仔细听就是同学们,你们想一下,这里来了两条语句,这是第一条,这是第二条,我如果想阻止这哥俩换顺序,你该怎么办,从底层上讲,就好像说我们排队去买咖啡,我我我必须阻止,说这哥们儿呢插队插到前面去。
怎么阻止他,就是我把这两条语句之间,或者两个人之间给它射度强,能听懂吗,就是我把这个这个已经执行完了,我这堵墙我才放开,我再把这墙拆了,再让再让第二个人过来,这样他就永远换不了顺序。
所以呢所以呢实际上是在这里啊,兄弟们,这两条语句如果想从底层来讲,不想让他换顺序怎么办呢,我们在它中间插一个插一条特殊语句,他也是一种语句,这种特殊语句呢起到一个一个强的作用。
好这种语句呢一般我们称之为叫屏障,叫内存屏障来这块能听明白的,给老师扣个一,建个墙,对,不是阻塞沙皇加锁,我勒个去,你为了换两条语句,你可以加个锁,你累不累啊,而且加锁。
你能你能限制得了他这个语句的顺序吗,你每条语句都加个锁啊,你想啥呢,那那那程序你还怎么执行,是屏障指令,一般呢它是称为叫屏障指令,这个屏障指令呢比较特殊啊,这第一句话,这是第二句话。
我不想让这样换顺序怎么办,加一个屏障指令,屏障的一般我称之为叫barrier是吧,嗯或者叫fans fans呃,篱笆barrier啊,篱笆大概都都就是这个意思,屏障好,这个屏障指令呢请大家记住不同的。
不同的cpu有自己不同的屏障指令,我们是没有办法给他统一的,ok这个屏障指令呢,呃你在如果你涉及到了不同的这种这种这种cpu,不同的硬件,你会做,你会看到它屏障指令不一样。
你比方说像那个英特尔的air fans,load fans读屏障,这个m fans写屏障是吧,modify修改,还有s fans,对不起,这个应该是全屏障啊,fence是save,是修改的意思等等。
反正我忘了啊,就具体的指令也就意味着当我们cpu执行的时候,执行的,只要看到这种凭证指令的时候,他就前后两句话就不让他换水去了,来各位能听明白的,给老师扣一,这是底层的逻辑,这是底层的逻辑啊。
啊这会大概能听懂,那老头还能还能跟上吗,这个难度还能往上加一点点吗,能跟上,我就在难度里稍微加一点点,每次讲到后半截,我我争取给大家解释清楚,因为我觉得我讲的东西啊,它再难,老师还是能给你解释清楚的啊。
呃只要你认真跟上就可以,除非你基础贼差贼差,那就有点够呛啊,仔细听,那么这是底层,我们说不同的cpu有不同的解决方案啊,这是底层,ok好,下面我们来再往上挪一层,这层是这一层是哪的,这一层是jvm。
就是虚拟机,这层java虚拟机,那在java虚拟机这层里面呢,虚拟机啊就是一台虚拟的机器,一台虚拟的机器也有它自己的指令,这个我相信大家都能知道你你实际当中的机器,实际当中cpu有自己的指令。
那么虚拟的机器呢也有它自己的质量,当然当我们得到这种指令的时候,需要翻译成为下面不同的指令,才能具体在具体的硬件上运行,那虚拟机里面的这种屏障指令是什么呢,注意啊,这个并没有一个cpu支持啊。
听我说目前没有cpu支持,因为它是虚拟的,是软软的模拟出来的啊,那jvm要求的虚拟的,你你谁要是给我写一个jvm软件,你必须给我实现这种指令要求的,虚拟的指令长什么样呢,在jm虚拟指令里面呢。
大概有四条指令好,后面的呢你就能听多少是多少了,因为呢这个大厂也就连大厂都很少考的东西了,目前为止只有一个同学去面那个阿里国际,一共面了七次面试,阿里面七面面进去才考到了这种深度啊。
所以呢你就大体理解理解到什么程度算什么,算什么程度就行了,好吧,我只是讲给你听啊,能听懂就听,听不懂就算了,就是jvm级别的屏障啊,大概是长这样,跟happen before没有半毛钱关系啊。
目前还没有关系,jvm的屏障大概长这样,注意看,它有四条屏障指令构成,这四条呢叫load load store,store,load store和store,load叫load load,load。
store,store,load和store store,其实就这么简单啊,几个的排列组合而已,有同学说了,老师我想这太难了,一分钟给你解释清楚啊,老师只用一分钟时间解释这四条指令非常简单,对一个数据。
如果你前面有一条读指令,下面这条也是读指令,你不想让这俩换顺序,中间加一个load load,这哥俩就换不了了,听听明白了吗,好剩下的还需要我解释吗,想一下下面这些还需不需要我解释,来听懂的给老师扣一。
啊不用一分钟是吧,搞定那store store指的什么,解释一下吧,你看看大家伙,那个那个是不是学到了上面一条store,下面一条是store,如果中间不想让这俩换顺序怎么办,store store。
ok就这么简单,那好了,这是我们的jvm级别,那我们再上升一层,刚才呢我们解释了最底层,解释了jvm这一层,我们再上升一层,上升到我们源码这层,java这层。
因为java编译完了class交给jvm执行,jvm再翻译成为本地的是吧,大概是这么一个执行过程吗,好,我们来了解java这一层是怎么样,不让语句换顺序的,好java层不让语句换顺序是怎么做到的呢。
很简单,加一个volatile就可以了,ok,从语句上来说,大概就长这样啊,你找找一下语句吧,看这里,如果你你不想让他换顺序,刚才不是由于换顺序,构建过程之中的顺序调换引起的,是不是。
因为他这个换顺序引起的各种各样的麻烦事,你不想让他换怎么办,好对这个变量做一个修饰符,写volatile搞定,好了,这就是解决方案,可是有同学啊,如果你进行认真思考的话,如果你认认真真思考这件事啊。
还还在吗,兄弟们还还在跟着我的思路走吗,还在的给老师扣一啊,越到晚上的时候,你越得越得给我点反馈啊,可是你认真思考这件事的时候,这件事很吊诡,吊轨的点在于什么地方啊,吊轨的点是instance是个变量。
你只是给它加了个形容词,你可以这么加了个修饰符嘛,就加了个形容词,这个变量是一个volatile的,就是就是这么一件事儿,居然阻止了对它构建的时候,以及其他方方面面的时候的这种顺序,这不是很吊诡吗。
而且这个volt还可以修饰简单变量,你说修饰简单变量他都没有构建这个过程,你怎么阻止对这个变量的访问,前后不能换顺序,这事儿是怎么完成的是吧,同学们,所以这里头中间还差了一个环节。
就是当我在java源码里面写了volatile,它翻译成为jvm的时候,jvm的class代码的时候是翻译成为什么样子的,好各位同学认真听他翻译过来,大概长这样,这块呢能听懂就听,听不懂就算了。
没有什么关系啊,关系并不大,应该说好吧,使劲儿听就行了,大概是长这样的,就是当我们用volatile去修饰一个变量的时候,那么对于这个变量的任何的写操作。
前面都会加一个store store store store意味着什么,写这个变量先写完,我在写,后面对于这个变量再加一个store load,我写完别人才能读,这就是对于修饰变量的时候。
对于修只要是任何只要是volatile修饰的变量,那么对于这个变量的任何的写操作,前面有屏障,后面有屏障,别人写完我再写,我写完别人再读,你不能随随便便的给我改顺序,对于这个变量的任何的读操作。
我读完别人才能读,我读完别人才能写,好了,这个图呢能记住就记住,记不住就算了啊,基本没人考,好吧,就到这ok,呃这样的话呢,我就从那个底层,java层加volatile,volatile翻译做的变量。
在我们jvm这层会给我们自动的加屏障,而这些屏障只是一个虚拟的屏障,这些屏障最终会被我们翻译成为底层的屏障啊,这些屏障呢才是真正的具体的实现好了,这块能跟上,能听懂的,给老师扣一。
其实嗯还有一些更深入的博克就不这么深了啊,没有这个必要了,好吧好,讲到这里的时候呢,呃你翻回头来再来看美团的题。

你就会觉得比较透彻啊,清晰明了很透彻,一夜就具备了去拿一个50万年薪的想法了,至少,好同学们嗯,我大概的内容呢,我基础上的内容,今天我就讲到这儿,笔记里面我做了详细的记录,关于笔记的内容呢。
同时呢我也对我们课程的这种达到的效果,我相信课程的深度你应该能理解了啊,基本上都是这种深度,这也是就这种深度,再加上我们老师呢是为学员们一对一的定制,学习路线,因为有的人掌握了a没掌握b掌握b了。
没掌握c,有的人快速要进行业,有的人呢是要快速的涨薪,有的人呢是快速要回到行业,其实每个人的追求的内容是不一样的,所以呢我们做到内容全非常全的,同时200多门课啊。
我们整个mc呢是提供了目前是200多门课。

mc目前提供200多门课。

从第一节开始,我们大概提供了是200 229吗,我记得是啊,大大小小229门课程,涵盖了绝大多数程序员所需要的所有所有内容,然后呢在我们老师的指导和定制之下,可以进行一个优先先学哪部分,其次再选哪部分。
然后再选哪部分,我们进入到行业或者转完新。

接下来进行系统化学习这么一个过程,来各位听懂的给老师扣个一啊,c加加做内存屏障,c加做内存屏障,使用汇编语言做的啊,这如果要是感兴趣的话呢,明天我给大家可以打开来看看,其实我们也是能读到的嗯。
这个达到的效果呢,大概在我们这个公开性的网页里,这里的网页里,你看到的所有的内容都是不给你p,非常真实的信息,除了隐藏了一些隐私数据之外,其他的全都是非常真实的数据,我目前我有学员呢。
这里头给大家展示出来的1500位学员,这里是1500位学员的数据,兄弟们,这些数据呢到目前为止三个月左右,基本就达到效果,达到效果呢当然跟自己的追求不一样。

它达到效果就不一样,有的是拿到offer 3个月,有的是涨薪水8000,涨15000。

有的是呃原来的年薪33万,然后呢到达了年薪40万,而且呢这个还是在咱们近期不好找工作的前,提之下啊,嗯最终也是按年薪40万算13个啊。

名义上那么多,实际也是惨淡断嗯,涨了20%吧,呃有的是大龄的乘以二,这个呢也是我们的一个特色,好多大龄都搞不定的,咱们这儿搞定了一大堆。

总之呢就是那会儿我我我创建这家公司,做这些课,其实呢一个核心的想法是,让程序员的生活过得更美好一点,没有入行的能方便他入行,入行的多赚点钱,年龄大的我教他怎么样去进行养老,怎么样去进行这种更长远的。
能做到退休的这样的规划啊。

方方面面吧,这是ood的嗯,找几个薪水略高一些的,这是秋招,多数达成最终入职压力了啊,年年报是47万,算签字费,这是很嗯非常就是最近的数据啊,短期的是吧,这是咱们的一个大龄的女同学。
这个大连的女同学是从50万涨到了75万,这事呢给他内部建议的一个过程,呃其实我就这么跟你讲,为什么建议大家伙要报名马老师的课,如果说这个课程只给你提供了一些硬件的东西,教你a b c d e啊。
教你一些应用知识,那我觉得这个课程的有有有价值,但价值没有那么高,我觉得我们还有很重要的一个价值,是帮大家梳理好整个职业生涯,就是有的时候你遇见难题之后,你可能自己不知道,不知道该怎么解决的。
你过来找咱们比较有见的老师来聊一聊,你就会发现李老师过去从山顶上下来的经验,一两句话,可能能让你就像这种的年薪涨了25万,这是一个什么概念。

每年涨25万,在以后的20年里,每年25万凭空多出来500万,把牛逼两字给我打出来好吗,这种案例不在少数啊,不是少数好吧,这个嗯,我们呃近期2月份的报名活动。

也就很快截止,就是今天是26号了嗯,今天是26号,对26号,27号,28号我们就截止了,我们在整个活动期间,2月22号到28号结束,我们进行了学费的补贴,然后报名的同学降了价,作为完整的一门课。
马老师这里提供了一系列的老师来为大家服务,这个应该也是大手笔了,就是有很多很多的机构讲一门课,其实就那么几位啊,两三位老师已经讲完了,但是我认为呢一是我们讲得非常的全,在所有机构里是最全的。
大概是排名第二的机构的课程内容的十倍十倍,兄弟们,这不是闹着玩儿的,我们价格比其他人最贵的,也就比他高个百分之几十而已,但是我们内容是它的十倍,为什么我们价格要稍微高一点。
因为我提供的老师数量比他的要低要多得多,我们现在有多位老师来陪跑,大家,多位老师帮助你进行面试突击的提升,多位老师全程指导你项目的实战,如果你需要录音分析的找咱们老师,如果你需要内推的,找他们老师。
这就是我们提供给你的服务,这个活动呢后面可能会打折扣,可能会随机分配,ok可能会你有有限的进行自主的学习啊,因为我们扶不过来了,要啊每个月的人数,我们现在呢逐渐开始设定限了,抓住咱们22号和28号的。
整个的活动期间好吧,有同学说老师哎呀,太卷了,卷的我搞不定啊,其实卷这个词我觉得是另外说,说白了另外一个那个层面就是努力嘛,卷呢其实就是有一个人努力了,其他人没有跟上,人家搞定了,所以其他人又想努力啊。
但是人家更努力啊,大家一块努力的这个过程,卷十十都有随时存在呃,不仅中国目前很卷,国外现在也开始面慢慢变卷,美国的大厂也开始玩命裁员了,这个大家可能了解过啊,所以呢现在的机会在于你是不是掌握的更深入。
是不是掌握的更细致啊,你的简历呢是不是更牛,你的技巧是不是到位,你是不是有一个优秀的导师指导的,你听懂了吗,到9月好找工作吗,你这个是预测啊,这个不好说,但我觉得呢与其你担心大的形势,是不是好找工作。
我觉得你不如把你的精力用在提升自己上,就是我们俗称的一句话,你呢不要用为那种改变不了的东西而烦恼啊,我就问你一句话,你说这个说外面的大形势不好,你能你能改变吗,你肯定改变不了,对不对。
那你改变不了的情况下,你就不如改变你能改变的东西,就是你自己的水平,机会就算少,是不是卷的更好的同学,掌握更深入的同学拿到的概率就越高,所以提升你的概率就可以了啊,不淡定,小青春怎么报名。
到官网上找我们咨询老师报名,或者在这里扫码报名,报名的话终生能有老师教学,你这个不能聊终生啊,现在就是各种广告上都不能聊终生呃,我这么跟你说,潇洒天下呃,做线上培训的,有一些机构倒闭了。
基本上都是玩终生的,你可以去了解了解玩终生的,我不可能说,因为你付出了这点成本,我覆盖你终生的成本不可能的,如果谁这么玩,最终的可能就是卷钱跑路捞这么一结果,所以没有终生,但是呢马老师这里呢。
就是说你你呃交完学费之后,如果后续有更新,比如说我们每年都在进行直播吗,直播的内容在不断更新,更新的内容,我们是这么定的,188亿年,正常的我们是收1808亿年,因为我们更新内容非常多啊。
我们更新一个内容,很可能是排名第二的机构的,所有的内容,知道吧,就就就更新的内容,就是这样,就一个增量就可能干过他所有呃,所以你申请这个188亿年,这句话的意思就是说,当你报完名之后。
1年之内你是收到了这个,如果你第2年继续想听我们更新的课,交一个流量费,因为我们从服务器上传上去,到下载到你手机里,这个流量很大,目前整个网站的流量,每天的数据流量大概在五个t左右,五个t。
这是对我们来说是一个巨大的费用啊,兄弟们,所以呢我们就收一个流量费就可以了1年,所以你不要跟我聊终身好吧,当然说你说那个嗯在后面,你比方说你你学完1年之后,你还有什么大的问题需要问老师的,这个没有问题。
你放心啊,只要咱们老师在你有什么问题的话,你都随时可以问,可以等有钱付款吗,先学这个不行,想先学后付款的,到马士兵教育的线下线下我们接受,因为我们见到你真人,确定你的信用能力没有问题啊,你确定你呢。
我们培养完你之后,你可以赚到钱,我们能接受你先学后付款,但是线上不行,要给情人说最近简历投了没反馈,是想饱和了吗,你怎么不在你自己身上找问题呢,为什么你不是说你你你简历不行吗,大哥要给情人。
你要是愿意的话,把简历发给他们一位小姐姐,你打开来,我给你看看简历,简历没反馈,很简单,是你的简历问题啊,跟人家市场关系不大,我也是没有反馈,刚工作1年一样的问题,永久这个说法大部分是骗人的。
对你认识到这一点的时候,你就离韭菜远了一步,4月份换工作,这个过程来的几步呃。

一个月时间我给你看几个一个月的案例,你就知道他来不及来不及了,走突击啊,我需要你走突击。

知道吧,这是突击一个月的效果,我不知道你现在的薪水是什么水平。

我给你看几个一个月的案例好不好。

你看这有88个和一个月有关系的,这是这是报名血迹的啊。

一个月涨薪涨了三三千五,不多啊不多,这是一个月涨了4000,虽然不多,1年5万不是白来的吗,白来的啊。

被裁了一个月,搞定两个offer了,就回到行业的,短期一个月在成都这边涨了4000,24岁的大专生,好吧。

呃这是突击一个月,然后45万年薪,一个月找到工作的,1113的,合肥的涨了3000的,整体涨了32%,1230的一个月,找几个一个月吧。

随便找一个啊,这是一个月涨了8000,跳槽上海。

涨薪是一定的,就是你用一个月的突击,注意是突击啊,兄弟们,突击的学习方法和我们刚才讲的,从头到尾的系列化的学习方法是不一样的,这个由老师来帮你把控就行了。

让我们来看看,老师我之前是制造业的,今年34了,学过1年半python呃,欢乐赛道,年初入职o d云数据库开发,起薪比低,我不满足现状,通过学习掌心有什么建议,职业规划不太清晰,首先首先选择哦。
你34岁了,34岁,你34岁相对麻烦一点点,你认真听啊,550q,如果你年轻的话呢,其实就是从头开始规划,换比较好的赛道就行了,但是呢你刚刚换了赛道,做o d云数据库开发呃。
你这个的话呢怎么去找这个薪水,你认真听这个比较难,就是你首先要了解这行里头薪水比较高的人,长什么样,听我说,这行里头呢大概是入行的时候,基本上有两种入行的方式,如果从后只单纯的后端来讲。
第一种是用java后端入行,第二种是用大数据入上big data这两个方向,然后呢沿着各自的路线发展,初级程序员,中级程序员,高级程序员,然后拿到一定的薪水之后,突然间都会遇到天花板。
想突破这个天花板的时候,二者合二为一,成为一名优秀的技术架构师架构,这就是咱们mc课在这里,那么成为一名优秀的架构师之后,你的薪资啊就可以大幅大幅度突破,听懂了吧,然后这是技术序列。
然后这个技术序列如果说做不太好,不是不能说做不太好吧,就是技术序列,还有一个选择就是管理序列,技术管理,技术管理,技术管理一般要求的是整个的呃技术的宽度,这宽度意味着什么呀,宽度意味着。
因为你要将来是带领完整团队的宽度,意味着你要对完整产品的,整个技术链条上的东西都要大致明白,包括前端,后端大数据,云原生ui设计测试运维产品,大致明白这个东西呢,我们用一个完整的项目教了大家。
叫咱们的马士兵严选,这个项目呢是我们大概花20 20多个人开发,来研发完成的,在这个里面涉及到了不同的团队怎么配合呢,在这里面讲的很清楚啊,如果你想了解这一块的话呢,到这个项目里面去了解,听明白了吧。
那像你的话呢,其实我觉得啊你可以你现在是走云的呃,云的话呢。

我不知道你现在所谓的云数据开发,指的是个什么,是只是写sql语句吗,如果你只是写sql语句,那就啥也别说了,那肯定薪水不会太高,天花板也比较低,很容易到天花板呃,如果是云的话呢,你你你你呢。
你打开咱们网站之后啊,你仔细去看。

仔细去看这部分就是容器云。

云原生架构师这部分,这里就是容器云这款,其实容器云这块呢呃所涉及到的东西还挺多的,就是虚拟化和云计算这块啊,以k8 s和docker为核心,然后进行一系列的开发和配置,当然也包括了运维开发的一体化。
云计算的技术啊,呃怎么说呢,你呢如果以sl为核心,还有一个方向,还有一个方向云的话呢。

可能有点偏韵味,这个不一定你想要的,还有一个方向是这里就是大数据。

就是你以云数据库为核心,大量的数据的处理过程啊,这块的话也能提升你的,这就是你的你的薪薪水的涨幅。

听懂了吧,大概这两个方向啊,你可以你可以跟可以选。

不知道说清楚没有,15k到20,咱们学突击也可以达到吗,可以,基本上问题不大啊,刚工作1年,12k本科二本三小时突击能到多少,二本本科1年不要跳槽,我告诉你后面怎么进大厂呃,突击的话呢。
你就别突击一下了,你就别突击一下,因为空白人生你还在吗,空白人生在不在,空白人生在的,给我扣个一,你还在听吗,给我扣个一,因为我想多跟你说几句,空白人生,你还在不在,你不在了,我就不想说了。
说起来就比较远了,不在了是吧,不在了不说了啊,没有意义了嗯,185 32岁,java后端13k入职,后期怎么规划,那个185你还在吗,给我扣个一出来,人还在不在,1853是吧,好认真听啊。
185我不知道,你现你现在你现在给我再敲几个问题啊,就是第一个呢你现在是在哪个城市,在哪个城市啊,给我敲出来好吧,第二个呢你告诉我你的学历是一本二本大专,985211什么什么的,你告诉我一下好吧。
把这两个告诉我一下嗯,185是在乌鲁木齐二本,其实你乌鲁木齐的话,据我所知薪水还是偏低啊,你32 32岁,13k我不知道在乌鲁木齐是一个什么水平,这个你在那个招聘网站上应该能看得出来。
如果是一个正常水平,那后期怎么规划呢,其实很简单,听我说你应该重点围绕我还是那句话,记住以大并发量和大数据量这两个核心点,围绕这两个核心点展开的系列下的系统化补充,在我们的课程里面的一个项目。
就会把这两个点全给你弄出来,就是大并发量和大数据量,然后围绕展开的点呢,我前面列了一下,简单跟你说过,我不知道你还记不记得大病发量来讲的话呢,就是高弹高扩展呃,各种的中间件分布式相关的理论。
微服务的落地与原生的落地,这是以大病发量为基础,而大数据量为基础呢,打开我们的大数据课,你从头到尾读完就行了,大数据的存储,大数据的清洗,大数据的调度,大数据的处理,大数据的实时计算。
p two p计算数据湖数据仓库,其实这两个核心,这两个核心点拿下,我这么跟你说,以你的学历和年龄,你应该在乌鲁木齐叫恒汤,啥意思啊,就是乌鲁木齐只要有机会,不管他的薪水是多少。
老师都有办法能让你拿到这个面试机会啊,当然能不能面过,是取决于你学习的深度细节程度,但是呢肯定能让你在乌鲁木齐横汤,这是没问题的,围绕这两个核心点听懂了吧,二三线仍是恒康啊,这个肯定没有问题好。
我看看还有没有其他同学有问题的,这东西有问题找老师问,我们家有12分钟,12分钟老师就下播了,不客气啊,150嗯,啊12分钟啊,12分钟老师就下播了,看有没有同学有疑问的,好如果没有问题的话。
那咱们明天见好吧,准备咱们明天见了啊,潇洒天下,咱们明天见啊,兄弟们,明天我给大家讲原子性啊,see you tomorrow,各位晚安好,谢谢大家,谢谢米斯特,299坦克车,summer出游。
thank you,拜拜。



什么时候潇洒天下,说什么时候能进行简历优化,你是报完名了吗,你报名之后就是你找工作的,大概前两周开始进行简历优化,这个是最合理的,不要太着急。

不要太早,因为如果你太早的时候,你你你简历里面还有很多东西没有没有学完,没有学完,你就写不进去啊,这个时候是最合理的。

不要着急。

答疑怎么办,对于呃我们是多个老师多对一的呃,多对一的意思呢是这样的,如果你有技术问题,你建议你提问,在咱们的问答系统上,正常情况下呢应该很快啊,我们追求的是一个小时,而实际当中呢有工作时间。
一个小时就会有有人回答你呃,如果非工作时间的话,可能要到24小时,最多最多24小时就会有人回答你啊,这是技术问题呃,如果是非技术的问题呢,是我们每一个人都有一个单独指导群,非技术问题呢扔在我们的群里。
老师就会给你指导,你就说一些规划上的问题,发展上的问题,可以简历指导多少次,这个不限不限数,你只要跳槽的时候,一般简历指导是这样的,孑然一身有限制吗,答疑范围啥的,答疑范围没有限制,山药复苏。
但是你要知道的是,在我们课程范围之内的啊,我们是有义务绝对给你答出来,但是在我们课程范围之外的,我们没有这个义务全部给你打出来,但是我们会会回答山药扶苏,听明白了吧,简历知道多少次,这是不限啊。
只要你什么时候有需要,他们说阿里裁员19000,那个我记得今年是哪个大厂,应该是美团还是谁说是裁员2万,但是招人招多少,24000还是多少,我忘了哈,您查一下,大厂都在不停地裁,也在不停的招。
要不然就不会刚才有那个47万进阿里的了,对不对,老师答疑多长时间回复,最长不超过24小时,正常一个小时以内,但我我现在很难保证,你就是说你你在大半夜的提个问题啊,一个小时真的回答你。
正常工作时间一个小时以内啊,如果你提的那个问题,比方说偏难,有的时候我们需要组织老师来研究,你这个问题走,所以这个时候最长不超过24小时,k美团扩招了,扩招1万多,我看小姐姐发美团开招1万人。
要技术多不呃,应该不少啊,具体技术有多少不太清楚,但肯定不少,想去,但是学历不好学,你什么学历啊,孑然一身,马老师这课性价比怎么样,欢迎你多做比较,你要能找出比我们性价比更高的来看,20课都可以不收钱。
送你就讲这个课,我我我们做这个课,很多时候没有太考虑赚钱的事情,就是赚钱的考虑的不多,我们整个整个那个培训的利润利润里面呢,就是说在我们整个呃做做培训的里面,我们是非常偏低的,你想想看。
可以用十几位老师来讲一门课,然后呢课时量呢是排名第二的十倍左右,你想想看它的性价比什么样啊,自己自己琢磨琢磨,美团队学历要求高吗,呃现在你要开发的话,那我估计二本以上就二本,包括二本,大专会难够呛。
然后三本的话呢,嗯偶尔的机会苦中苦人上人,web two太卷了,我three也可,我three也也卷,你不要认为我web three就怎么样,web 3的话呢,目前的工作岗大多数时候集中在什么呢。
要么是区块链方向,要么是那种ar vr这个方向一样的卷,中国但凡有不卷的东西,不是很卷,赚钱还高,你认为中国人会怎么样干,你好好想想,马上扑上去,所以找一个更宽的方向去卷,这个是大家避不开的,正视他。
也许你有冲上去直面它的勇气的时候,其实你就会发现没那么难,很多人是被吓死的,连战场都没有上,不要干这种傻事儿哦,还有问题吗,看看刚才我要下播了,都突然间有有一堆人在这问问题,321好,各位同学再见。
系列 6:P31:Java中的锁是如何实现的? - 马士兵学堂 - BV1RY4y1Q7DL
呃今天呢主要来跟大家讲这个锁的东西,关于所这件事呢,通过一个小的实例来讲,我们就不讲那些个乱七八糟的理论性的东西了,一个小小的案例,这小案例呢喜闻乐见啊,大家肯定是学过或者至少自己敲过。
或者至少了解过叫什么呢,假如我们有一个值n,它最开始的初始值是零,然后呢我们启动了100个线程,这里有100个线程,每一个线程里面呢把这个值给它加1万次o,每次每一个加1万次啊。
那么最终的结果100个线程跑起来,理想的情况下它是100万,但实际当中呢往往不是跑一下看,3万多是吧,嗯再跑一下,ok 30000多,当然如果我们给它上锁。
就是平时我们使用的关键词叫synchronized是吧,ok上厕所跑一下,100万这就没问题,这个原因是什么呀,呃给那些个小白们,基础不是很好的同学解释一下原因,看这里最开始这个值啊是零。
然后每一次对这个值的每一次的递增过程啊,由于呢有现成本地内存,它得把这个内存昨天我也讲过啊,把这内存的一步一步拿到自己的这个呃,cp cccp和cpu核的内部做完了之后再写回来。
所以它中间是这么一个过程啊,一个线程把这个值拿过来,拿到cpu内部零,然后给它加加变成一一呢,再给他写回去是吧,这是这个加加的过程,那这个过程的话呢,为什么我们没有上锁的时候。
为什么我们没有上锁的时候好,他就会造成远远小于100万这个现象,原因是什么呀,原因是如果有一个线程从零这里读过来,变成一好一还没有来得及写,回去的时候还没有来得及啊,然后另外一个线程把这个零六读走了。
他也把这个零变成了一做加加操作吧,然后他也往回写,还没写的时候呢,又有另外一个线程把这个零读走了,所以你看啊加了三次,最终的结果呢全是一是吧,加了三次,最终结果得到了一ok这就是不上所说的情况。
这东西的本质呢,实际上是并发执行所引起的数据不一致,说点专业名词啊,就是并发执行所引起的数据不一致,那什么叫并发执行啊,就是加加这个操作实际上有好几部构成,第一个线程执行加加的时候。
另外一个线程还没等第一个线程执行完,他就进来开始运行了,这两个是并发执行,这两个线程还没有完,第三个线程又来了是吧,三个线程并发最后的结果只得到了一个一,处理这件事情。
想要得到我们期望期望的这个结果该怎么办呀,最简单的办法是把这个加加操作呀,给它变成序列化的,就是我中间不让它并发,什么意思啊,听我说,就说我这个加加操作必须是这个线程执行完了,我加完了写回去。
写完了写成一了,来,你下个线程再继续,你读的时候一定是从一读回来改成二,然后你下个线程再继续二,二回来改成三,也就意味着啊从这个加加操作呢,从原来的这种并发性的,好多人同时在执行这段代码。
变成同一个时刻,只有一个线程执行,执行完了之后,另外一个线程才能执行好,这里面也上一个概念呢,叫做原子形,昨天我给大家讲了可见性,给大家讲的有序性,今天的重点就是原子性,什么叫原子性啊。
其实就是说这个操作,我把它视为一个不可分的原子,当然你还可以写第二句话啊,只要写在这个sychronized内部的,都可以视为一个原子,这个原子的意思就是说只有一个线程执行,执行完了。
另外一个线程才能执行,所以呢这线程的执行会变成序列化的方式,它会变成这样的方式啊,有呢这是第五个,然后才是第四个啊等等,但是从时间角度的话呢,一定是第一个完事了,第二个,第二个完事儿,第三个。
第三个完事儿,第第五个,第五个完事儿,第四个,所以从时间角度它是序列化执行的,这就意味着呢我的中间的这个任何的操作,它是具备原子性,就是不被其他任何线程所打断,不被打断的意思就是说我在执行的过程之中。
另外的线程不能执行好这个概念,大家听懂了吗,能听明白,老师扣个一来嗯,没问题吧,嗯ok ok好,比较简单啊,比较简单呃,这入门入门级别的小程序啊,你们学java的一定是学过学别的语言的,也一定学过好。
下面我们来解析这个synchronized,它的本质是什么,有没有其他的方式,我们能完成原子性操作,保证整个数据的一致性,我可以不保证原子性,但是我要保证数据的一致性,可不可以,完全也可以啊。
好多种方式,我们首先来解析什么呢,一个非常基础的概念啊,就是说这个synchronize,这东西到底是个什么样的东西,大家都知道这个synchronnet写法往往是这么写的,我们在这写啊,随便给一个吧。
o object o等于new object,我们这样写synchronize o是吧,然后呢诶下面一大堆操作,这样的话呢,我们下面这些操作呢就是原原子性的操作好,这个o会帮会被我们当成一把锁来使用啊。
这就是锁的最基本的概念,什么是锁呢,这玩意儿呢就是我们经常用的一种锁啊,这个o就是那个那个锁啊,在java里面任何对象任何对象我再说一遍,任何对象,都可以被当作锁来使用,你随便哪个对象好吧。
都可以被当做锁锁的概念呢,我们日常很容易理解啊,比如说某个人想进厕所干点事儿是吧,然后那个一定是进去之后呢,这就是我们那把锁,本质上来讲,就是这把锁保护着他整个干这个事的过程,如果没有这把锁的话。
他干到一半的时候,没准其他人进来,两个屁股怼在一起也是有可能的,听懂了吧,所以说这把锁保障了我们他干这件事的原则性,只有等他干完别人才能干,你不能说这边正干的时候,中间就进来了啊,这不行。
所以日常生活中这把锁我们很容易理解,但是java java语言里面这把锁呢,大家理解起来可能稍微困难点,就是任何一个对象都可以当成一把锁,在这把锁上执行的任何的方法,同时只能有一个线程,啥意思呢。
比方说我在这里写了一个scho,我在另外一个方法里,另外一个地方,假设别的方法里啊,static的方法,我们呢,锁的只要是同一把锁,也就是同一个对象,看这里,我简单写啊。
比方说在这里他写的又是synchronized o,然后又写了一段其他代码,那么这两段代码能不能够同时执行啊,当然是不可以好吧,等在同一把锁上的这样的代码,同一个时间点只能有一个执行,一个执行完。
其他一个才能执行,这点大家能理解吧,好那这边锁的本质是什么东西呢,它是怎么实现的呢,今天给大家做一点简单的小实验啊,让大家认识一下,就是说java里面是怎么运用这把锁的,好吧嗯好。
刚才讲这里这这这一小段大家能跟上吗,能跟上给老师扣一栏,没问题啊,这样啊我我我带大家做一个小小的认知,这个我不知道大家了不了解啊,就是一个对象在内存中的存储布局,到底长什么样,这什么意思。
就是说当我们new出一个普通对象的时候,这个呢大家应该知道啊,就是当我们new出一个呃普通对象来的时候呢,这个对象它在内存里面分配一个空间,这空间呢到底有多大,结构是什么样子的,他问的是这个问题。
也是美团的祁连问之一,一个对象在内存中的存储布局呢,在hot sport的它的实现里面是这是长这这样啊,它一共有四部分构成,这四部分呢是面试的重灾区,尤其是大厂面试的重灾区,往这看,首先呢这是第一部分。
第一部分呢它的名字叫mark word,中文翻译过来叫标记字,但是我觉得你们就别记这个中文名字了,就叫mark word,记住就行,它的大小是八字点八个bytes,记住啊,大小是八个字节。
第二个呢叫做类型指针,就class pointer,class pointer的意思是说我new的哪个对象,它指向这个对象所在那个类,比如说啊我们new的是一个object。
那这个class pointer是个指针,它指向谁呢,指向object。class啊那个类型o,然后使它的实例数据就是它成员变量,最后一个叫对齐,关于对齐的概念呢,很多人老是尤其是没有计算机基础的啊。
老理解的特别费劲,简单说呢就是对得整整齐齐的,由于前面的各种数据对起来呃,有有可能呢比较乱是吧,最后要求就是整个对象的大小能被八字节整除,能被八字节整除,听懂了吧,我简单说。
就是前面你比方说前面这三部分加起来,如果只有12个字节,它不能被八整除怎么办,后面放上四个,这几个概念大家能能能能跟上吗,再重复一遍啊,第一个mc word macworld,我一会给大家讲。
这是面试重灾区,重中之重,第二个呢是class pointer,指向这个对象所在那个类啊,第三个呢是它的成员变量,第四个是对齐,所以整个长度要被八字节整出嗯,加四倍八整除。
废话我说的是12 12+4不被八整除吗,呃那个美团里面有一个小问题啊,就是美团的美团的那个七连问啊,曾经有一个小问题,大家来读一下,看一眼,可能新单位的第一个小问题啊。
就是说看这个啊叫object o等于new object,在内存中占用多少字节,哈哈这是他的一个小问题,好我们通用小工具呢来认知一下,看这里啊,我在这里呢new了一个object,我教大家使用一个工具。
这个工具的名字叫j o l,这是它的全称,全称叫java object layout是open jdk提供的,随便百度1下就能知道它的用法,在maven里面引入进来,就能用这东西用来干什么的。
用来查一个对象在内存中长什么样,看这里plus layout pass,instance,pass是解析,instance是对象,解析某个对象解析哪个对象,解析o这个对象,two principle。
把它转成可以打印出来的格式,再把它打印出来,来认知一下一个简单的小对象到底长什么样,好同学们讲到这儿还能跟上吗,能跟上给老师扣一来,搞点反馈啊,咱们小直播间的没人跟得上吗,只有麦田一个人吗,跑一下。
假如有人跟着费劲呢啊那个反馈出来,这个工具会让我们看到一个对象,在内存中的真实真实的布局。

这你能看到它的零和一的布局,看到了吗,这就是你的内存之中把一个对象new出来之后,它就长这模样,一个object对象长这模样,八位八位八位八位八位啊,前面零特别多的这八,这八这八个八位就是八个字节。

就是我们的什么呀,就是我们的mark word标记字,这八个,这四个这四个啊,这四个这四个这个加起来就是我们的mark word,那么后面这部分是什么东西啊,后面这部分是class pointer。
还记得吧,那么它指向谁,是一个指针,指向谁啊,指向谁,指向object。class,呵呵对没错,然后最后这四个呢,前面一共是12个字节了是吧,记住啊,类型指针四个字节,mark word是八个字节。
加起来是12个,我们讲不能被八整除怎么办,后面补四个,这里后面是补的四个啊,嗯比较简单啊,不太难,这样我给大家做一点小练习吧,看看能不能够理解的了,我们随便定一个class t。
我在这里写t小t等于6t,我们把这个t进行分析来,谁能告诉我这个t占多少个字节,告诉我一下,思考一下这多少个字节啊,16个对没错啊,说的很对,往下看,还是那句话啊,就是我们看啊。
就是它前面那八个字节永远是mark word,后面这四个字节呢永远都是class pointer,12个不能被八整除,它也没有成员变量是吧,它内部没有成员变量,所以呢再给它补上四个,让他被八整除就行了。
o,来看这里,ini来同学们告诉我,如果我这个时候把这个题弄出来,它占多少个字典,为啥要把被被八整除,对齐之后,管理对象比较好好好管理,如果你实在理解不了,你就想往一艘船上使劲的装袜子。
大米各种的东西这么散着装好,还是把它装到集装箱里,比较整齐地堆放好,好,好啦,这里是多少多少,8+4+4,怎么还有20的呀,咱们说一个对象的大小,它至少应该被八整除,你你给我写20是几个意思。
还有写32的是几个意思,一个int类型是多少,int类型是四个字节对吧,认识一下啊,它前面八个字节永远是我们的mark word,中间这四个字节永远是class pointer,一共是12个嘛。
12个呢,这12个一般被我们称之为叫对象的头部,叫object header啊,然后int类型多多少四个字节,对不对,所以一加正好16个默认值,看到了吗,零所以,16个字节比较简单啊。
好我们再来做个小练习啊,lol来告诉我一下这个对象new出来多少个字节,首先你想想看一个long类型占多少个字节啊,露脸雄这八个字节对不对,原来16个再加八个,24个嘛。
你这个为啥又被八帮助我解释过一遍了啊,你不认真听,你老老让我重复说,这顶得住吗,嗯漏了就是八个字节啊,看这里啊,我们再来一个啊,来一个稍微难一点的,来哪位同学知道我这个对象应该占多少个字节。
有人说是32,我们看这个小直播间,有人说吗,32,24加八三十二,跑下看看是不是32,好看这里啊,呃前面那四个加四个,再加四个什么对象头是吧,这个不说了啊,不重复了。
四个字节的i8 个字节的l一个字节的布尔,也就是说在java面呢,布尔类型实际上占一个完整的字节,那加起来是24,加一是25,不能被八整除怎么办,后面补七个,补到32,看懂了吧,比较简单。
来再来一个终极难度,这个对象占多少个字节,嗯32 40数吧,数什么数,这个字符串长度吗,这是jdk几有关系吗,只有指针嗯,32啊,大多数同学还是比较明白的,我们跑一下看看这里啊,string有三个常量。
吃三个字节,我也是醉了,看这里啊,首先12个字节的头八个字节,mark word,四个字节class pointer,这不说了,接下来呢四个字节的int,八个字节的long,一个字节的布尔。
三个字节的对齐,注意我们这个s占多少,string类型的,这是一个引用类型,是个指针,这是一个指针,后面的这个字符串,并不真实存在于我们这个t对象内部,也就是说我们new出这个t来的时候。
在这个t内部只有谁呢,只有i有l有b有一个小s,这个小s指向常量池里面的字符串,http哈马上变点com指向这个串,这个串并不真实存在于我们这个对象内部,也就是说,你只要知道这个指针的长度是多少就行了。
这个指针长度是多少呢,指针长度是四个字节,在默认的64位虚拟机开启压缩的情况下,它的长度是四个字节,所以看懂这布局了吧,这样的话呢美团的这个关于布局的问题,你就应该能理解了啊,好讲到这里。
这块没有问题的啊,给老师扣一,我们继续好吧,我们主要是讲锁的,我不是跟大家讲这个布局,就顺带着给大家补一补一补啊,下面我们把这把这些复杂的东西全去掉,我们把这个最简单的东西当成一把锁来使用。
当成一把锁来使用,本质上是个什么东西呢,我们做一个小小的对比实验就可以了,往这儿看,t小t等net,这是他刚刚new出来的时候,内存的布局情况,接下来我们给他上把锁,就是把它当成一把锁来使用。
而且锁定它,然后我再把它的布局再打印出来,看锁解开之后再把它的布局打印出来,看跑下看,我们跑跑看做个小小的对比,对比一下这三种情况,看看有什么区别,来各位同学自己自己仔细做对比,这是最开始的时候。
对象刚刚new出来。

这是这把对象被锁定的时候。

被当成一把锁来使用,并且我们锁定它,看出区别来了吗,兄弟们,这是这把锁被释放了的情况,这三种情况你自己做对比,能不能看出区别来,头部一样断着,所以在java里面呢怎么实现一把锁呢。
这把锁的信息记录在什么地方呢,我相信你就应该有答案了,mark word的作用非常重,要,就是在我们整个对象的脑袋上呢,这部分内容,对象脑袋的这部分内容啊,这部分内容就是mark word这部分。
这部分的作用特别重要,我们平时讲说呃,我们把一个对象当成一把锁来使用,我们讲的很简单,那这把锁怎么来使用它啊,实际上在这把锁的内部呀,记录着是谁,你说哪个县城,哪个县城的id,他锁定了我持有我这把锁。
比方说你进厕所之后啊,脑门上写了名字叫小壮,这个小壮啊,就把这个信息记录在这把锁的脑袋上,记录在mark word里面,听懂了吗,然后呢,当别人去申请这把锁的时候,发现这把锁已经被小壮持有了。
他怎么办呀,等待等着扎扎实实在旁边好好等待,所以呢在java之中啊,关于锁的信息,它是记录在对象的头部,头部什么地方呢,mac word里面,这小这个小知识大家听明白了吧,只用四个字节。
对目前他只用了四个字节就够了啊,呃mc word比较复杂啊,它里面呢有三大类信息,一类是关于锁的,一类是关于垃圾回收器的,这个就更复杂了,我就在这就先不展开了。
那个这个主要跟那个呃坑这个这个这个cm s,那个垃圾回收器有关系啊,呃然后那么第三个呢是关于他的hash code啊,这点可以给大家做个小实验啊,就比较好玩,你这个你自己看看就就就就就可以了。
大家看这里啊,呃同样的我们打印这个小t的信息,最开始的时候呢是这样子是吧,我们只要调用一次它的t的hash code,只要只要调用它一下啊,然后呢再打印一遍,好接着看,诶你对比一下结果你自己做对比。
这两个你会发现呢,我没我虽然没上锁,但是我掉了还是扣的,诶,它内部也发生了变化,说明什么呢,说明他的hash code也是记录在我们的mark word里面,因此这mc word有三个作用。
第一个呢是记录垃圾回收器的信息,第二个记录锁信息,第三个呢记录hash code的信息啊,ok嗯关于microworld的简单认知,我们就认知到这,今天我们主要讲,所所以呢呃我们当我们讲到这里的时候呢。
关于synchronize这把锁的一个基本的构图啊,基本的影像我们就给它勾勒出来了,相当于什么呢,相当于这里确实有个有个对象扔在这儿,然后呢我把这个对象当成一把锁。
我sychronized锁定它当成一把锁的时候,比如说我上来之后呢,夏鹏飞啊这个线程,然后呢持有了这把锁,他会把自己的信息啊记录在mark word里面,把这里改一改,说这这把锁归我了,各位兄弟们。
然后夏鹏飞呢就开始去里面干事去了,大便小便是吧啊啊这个吃饭外卖啊等等,在里边呢干一大堆的事儿,那么在他里边干这些事的时候呢,这把锁由于一直被他持有,其他的人来了之后呢,是不能够进去干这些事的。
是不能够去执行这段代码的,那么其他人得等什么时候啊,得等夏鹏飞把这把锁给释放了,后来人一看哦,ok这把锁发现没有人占用了啊,那下一个人继续来,这会儿能听懂吗,嗯这会能听明白,给老师扣个一来比较简单啊。
这是java里面经常使用的一把古老的锁,的内部的执行执行执行方案,但是这个听我说,这里面呢其实还有更复杂的过程,我再讲下一个比较复杂的过程,之前给大家讲了另外一种,保障数据一致性的解决方案。
大家看这里啊,就是说我们还拿这个小程序来举例子,这小程序呢,每一个线程给它加好多好多次,然后呢还要保证它最后的结果呢是没有问题的,是吧,呃除了除了我们使用我们传统的synchronized。
上锁的这种方案之外,其实还有另外的解决方案,下面我我我教大家呢另外的解决方案,这另外的解决方案是什么呢,就是这玩意儿啊,这我不知道有多少同学用过,就是atomic类,有原子类。
这些原子类呢是来源于j u c这个包啊,j u c这个包java有体力,有tility的concurrent,这个包简称g o c,atomic atomic energy。
比如说如果我们有一个数值int类型,最开始的初始值是零,我们就直接new一个原子类型的int类型,原子类型int类型一,正常的情况下呢,我们对这个数值呢进行多线程的加加操作,比如说我每一个线程。
100个线程,每个线程呢都去执行这个m方法,这个m方法呢对我们这个值加了1万次,这家的操作叫count。increment get,这是它内部的方法啊,本质上也是一个加加操作,但是在这里头呢。
我们会发现这种写法完全可以保障数据一致,因为它本身就是原子性的支持原子性,它的所有的方法支持原子性,它的中间呢诶被别人打断了,也能得到正确的结果,它本身是支持原子性。
所以最后我们一定能得到100万这个结果,但是我们就想了说,你既然能得到100万这个结果,你内部是不是使用了一些这上锁的操作呀,是不是使用了那个sychronized,是这样的吗,来我们点进去看看好不好。
count their increment get,ok,我们点进去看一眼,看看里面有没有啊,哎走你好,这里它调用了on safe这个类,get and add int,我们再点进去跟着走啊。
跟着我跟着我思路走走,你哎你会发现它调用了unsafe这个类的,什么呀,compare and swap int掉了这个类,哎,到这里的时候已经是native了,已经是c和c加代码了,哎你跟到最后。
你其实没有并没有发现那个synchronized是吧,你最起码没有发现java里面的synchronized,没有发现,所以这玩意儿他没上锁,你发现没有没上锁,它居然最后也能保证原子性,诶。
这是怎么实现的呢,这是另外一种实现方式,另外一种实现方式,ok好讲到这还能跟上吗。

系列 6:P32:CAS - 马士兵学堂 - BV1RY4y1Q7DL
再回顾一下,由于有些人对这类可能不太熟啊,这个类呢就是一个原子类型的类,他的加加操作呀,本身就支持原子性,它是怎么支持的呢,我们去探究一下啊,我们探究了半天,我们发现它本身没有上锁。
没有上锁是怎么完成的呢,面试中另外一个重灾区,本质上可以认为是特殊的,所叫乐观锁啊,叫c a s compare and swap,int c a s,讲一下c c a s的本质,这是另外一种锁。
也可以认为是无锁啊,好多人认为是无所,知道了。

我的图图去哪里了,看这张图吧,呃我下面我们来聊一下这个cs的本质,就是它是怎么完成,怎么操作的,听我说啊,关于cs这件事呢,面试里头问的也是贼多贼多的,我希望你能掌握呃。
cs呢它的全称呢叫compare swi,或者叫compare and set,比较并设置比较便交换或者叫什么呀,或者叫compare and exchange,比较并交换都是指的一个意思。
它的执行的原理是这样子的,长这样,认真听认真听,这是我们最开始那个数值是零,然后呢我们有一个线程的拿过来在这里改成一,然后再写回去,另外一个线程,我们说保障数据一致性的话呢,等我写回去之后。
另外一个线程再继续就能保障,但是c s操作并不保证说,我中间不被其他线程所打断,那么这个时候完全有另外一种可能性,在我写回去的过程之中,它已经变成八了,它是怎么保障我的数据一致性的呢,它是这么来保障的。
好好听他做了一个操作,做了一个比较并交换的操作,这个比较并交换的操作呢是这么做的,这是原来那个零,我这线程把它读过来之后,改成一,我一往回写的过程之中做个操作,看看你是不是依然为零,依然为零。
那如果你依然为零,说明你没有其他的线程把这个数值改变过,那我就直接把你改成一就可以了,所以就是可以这么可以理解为,当我们往回写的过程之中呢,我们做了一个判断,说if你这个值啊是不是依然为零啊。
如果你依然为零啊,那就把你改成一,这就是比较一下,并且再重新设置,是这个意思,那个同学可能会说了,那老师他他已经被别人改过了,怎么办呀,他已经改成八了,改成八个没有关系,就说明我们这次递增的操作失败了。
我就把这个八读过来,读过来,改成九,往回写的过程中判断,哥们儿,你是不是依然为八,如果你是依然为八,我就把你改成九,那有同学又改成100万,别人改了,我把这100改过来,改成101。
往回写的过程中判断你是不是依然是那个100,如果是那100改成101,如果不是一直操作到有一次成功为止,一个死循环,一个while循环啊,跟着你不停的循环,哎哥们儿,你是不是原来那个数,如果是改回去。
如果不是,来再来一遍,听明白了吗,来这块能听懂的,给老师扣个一,就是乐高所的本质对,是的,比较并交换对,这就是他的,这是怎么保障那个数据数据一致性的,就是这么来保障的啊,当然关于cs呢面试的重灾区嘛。
他一定问的问题不会这么简单,当你理解了原始的问题之后啊,他首先会问你第一个问题,就是cs里面著名的a b a问题啊,什么叫a b a问题呢,就是说你看啊有一个零,然后被一个线程拿走了。
改成一一往回写的过程之中,他看到的依然还是一个数值为零,但是这个零有可能是什么呀,有可能在他拿走改的过程之中,这个零被另外一个线程改成了八,又被其他线程改回成了零,所以这个零确实是那个零。
但是中间经历了一个过程,就是从0~8又回到零的过程,这是有可能的,这是a b又回到a的问题,叫aba问题,这块能听懂吗,比如说这是如果这是这是一个简单数值,所以呢只要它是那个零的值就无所谓。
那如果是一个引用类型呢,原来只像一只猫,一只黑猫,然后中间它指向了其实指向了一只狗,做了很多操作,回回来又指挥成了一只猫,这个时候就有可能引发你程序的不一致性了,所以a b a这个问题。
你是需要想办法去解决它的,你可以解决它,也可以不解决它,取决于你实际当中的运行情况,呃,那么如果你想解决它,前两天才问是吧,看292945说对,如果你想解决它,怎么解决它呢,解决它办法呢非常的简单。
就是给它加一个版本号啊,再加一个version version,理解这件事情很简单啊,这是你的男朋友boyfriend啊,你要出差了,你担心他出点什么事,你在他脑门上给他写一个一点,然后主持人走了。
回来了之后呢,你看一下是不是你依然还是那个男朋友,如果你发现他脑门上一点没问题,就是如果你发现他脑门上已经写上了,99点,那么说明在你离开期间,一定他经历了某些事情能听懂吗,就是给他加个版本号就可以了。
ok嗯懂了是吧,对这个版本号这个版本号啊有两种方式啊,就是第一种是使用数值,比方说一经历过一次就是二,再经历一次就是三,就是你不钻递增,这是一种,第二种呢就是你你你你可以用布尔类型啊,你在他脑门上写。
当你离开的时候,你写true啊,它是true,然后当你回来的时候,如果它变成了false,至于中间多少次,那就不管了,这是另外一种java本身提供,嗯这比较简单很容易理解啊。
java本身它是提供现成的类的。

比如说我们看这个叫atomic stampreference,这个stamped所代表的就是版本号的意思,好吧,atomic stamp reference k使用布尔类型,中间两个线程改了怎么办。
那我说了,你使用布尔类型代表你自己不在乎多少次,只要有人改过就变就变成false了啊,变成非处了,这种呢是是是是带版本号的,那么另外一种呢atomic markable reference。
那么这种呢是布尔类型的好吧,布尔类型啊,initial mark可以是true,可以是false,所以你来这块大家听明白了吗。

怎么怎么解决这个aba问题,这是第一个问题啊,就是aba的问题,就是加版本号就可以了,就这个代码是我们的vip的代码,这个代码是不给的好听,我说第二个问题会非常容易被问到的,第二个问题关于cs的。
认真听这个问题才是致命的问题啊,很多时候问到这个问题的时候,对cs一知半解的人就开始就开始犯傻了,犯糊涂了,cs呀,他就问你,他说哥们儿,你这个最后一步呢,c最后一步是什么,我们分析一下。
就是从零变成一,一往回写的过程之中呢,判断一下再再进行修改吗,就是if哥们儿,你是不是依然还等于那个零,如果还等于那个零,才能把你变成一,那么假设我在判断完了,我已经判断完了,确实你为零。
我还没有来得及把你改成一的时候,你这个值被其他的值修改成八了,这不就又出问题了吗,听懂了吗,兄弟们,这个问题o我再重复一遍啊,就是说他会问你,他说你这个cs最后一步的操作。
不就是说我判断一下你是不是原来那个值,如果你还是原来那个值,我就给你改成新值,如果不是原来的值,我就再来一遍,不就这个操作吗,那我判断你这个值是原来那个值,我还没有来得及改成新值的时候,被别人打断了。
同学们这个呢就需要cas操作这一步操作,这一步操作他自己要保障原子形,中间不能被别人打断是吧,同学们好,那这个那这个他是怎么完成的呢,底层还是上锁,对这个要看它的底层的话呢,呃后面你别走神儿。
有决心往下挖掘一下的,给老师扣一,我带你稍微的挖掘一下,这个稍微有点麻烦,别走神啊,没关系啊,就是跟不上这个过程的,可以最后把结果记下来好吧。


大家仔细看啊,嗯当我们要探究它背后的执行的原理的时候呢。

一般的情况下我们去分析它的代码对吧,分析它的源代码,它源代码是什么样呢,就类似于像这个atomic integer这样,他本身用的cs,那么它是怎么完成的呢,我们点进去看,我们点进去看。
我们点来点去呢会发现它进入到了哪个代码呢,进入到了native代码,native是c和c加加写的,那么这个能不能跟进去,答案是可以啊,这个过程呢,其实跟这个native代码的过程比较复杂。
我在这呢就带着你呢简单带大家读一遍好吧,就是我们要知道他最后调用了是一个c和c,加加的compare and swap in的代码,这个类的名字叫unsafe。

unsafe o,如果你能找到,jdk他c和c加加的代码啊,这个open jdk是提供的,你自己可以去找,你可以找到这个类,这个类那叫unsafe。c p p,这个明显它是一个呃c加加的类。
ok然后在这个类的内部compare and swap int,在这里方法在这,你可以理解为刚才那个方法调了这个方法,那这个方法呢实际上又掉了。
atomic这个类的compare and exchange方法,当然这个要跟过去的话,那我就直接跟过去,你就能看到我们本质上的cas,它到底是怎么完成的,就这部分代码。
当然这份代码你要跟起来就相对费劲一些,我带大家呢做一点小小的解析,在这儿能跟到这里的,来跟老师扣一啊,目前还能跟得上的听大概就可以,一般的面试问到这个程度就差不多了啊,认真听认真听。
大家看这里本质上它是由这个代码实现的,compare and exchange l这东西是个什么东西啊,当你看到前面这个标志的时候,a s m什么标志啊,汇编语言对不对,这是汇编语言的标志。
也就意味着这个代码呢是汇编代码,也就意味着我们cpu本身它支持一个指令,这个指令呢就叫做比较并交换,也就意味着这是一颗cpu,这是一颗cpu,如果对我们内存里的某一个数值,进行修改的时候。
这是内存的某个数值x对它进行修改,我可以有直接修改的方式,也可以有cas方式进行修改,把你拿过来改成一个值,改完一个值之后呢,比较一下,你是不是原来那只是原来那只再给你改,不是原来那值重新拿过来再改。
这个大家能听懂吗,没问题吧,所以说呢硬件指令本身就支持cs操作,这是我们的第一个结论,但是各位同学硬件知识的操作,未必意味着这个操作具备原子性,我再重复一遍,即便是你cpu直接支持的指令。
也并不是说你这个指令本身就支持原子性,完全有可能发生一件什么事情了,就是当我第一个cpu在改这个x的时候,我把这x拿过来改成x加一,往回写的这个过程还没有来得及写的时候。
另外一颗cpu把这个x已经改成别的值了,改成x加二了,听懂了吗,完全有可能,所以这个操作本身不具备原子性,那回到了那个悖论了,就既然你不具备原子性,那你cs操作还是有漏洞啊,那怎么办。
所以在这个操作前面最关键的代码在这儿,在这儿叫lock if mp啊,在这volatile,你们跟着volatile是这是c和c加加里的volatile,往这看,他最关键的代码在这啊。
叫lock if mp,那么这段代码怎么去理解它,好记住这条指令了吧,就是说底层指令支持,这是第一,这是第一个结论,但是这条指令本身不具备原子性,我想办法让这条指令具备原子性怎么办。
ok这里呢是一个红操作,做一个替换就可以,这宏操作里面比较复杂,你别的不用看,只要看这条指令就可以,这条指令叫lock好,这个红的叫lock if mp。
他说adding a log preface to an instruction on mp machine,mp什么意思呀。

mp的意思就是multi processor,相当于就是你你多核的,如果你有多个核,我就前面给你加一条指令,lock lock指令,所以最终的结论呢我们就得到了,昨天给大家分享的文档里也有。
你呢也可以打开文档看啊。

昨天给大家分享的文档final。


昨天给大家分享分享的文档也有,在这个文档里呢,呃我教了大家怎么样去跟踪cs啊,怎么样去跟踪cs,从cas读到on safe,从as unsafe呢读到unsafe。c p p,从on save。
cpp呢,找到我们的lock if mp是吧,找到这里,从lock if mp呢我们得到最终的结论啊。

这里是最终的结论,各位同学只要把这个最终的结论记住就可以了。

刚才那段你跟得上就跟跟不上,记住最终的结论,我们所有的cs操作在hot sport这个虚拟机的情况下,它本质上是由这条指令来完成,这条指令叫叫log compare and exchange,好。
怎么理解这条指令,只要现在能都能跟上吗,兄弟们有没有跟不上的,能跟上,给老师扣一,跟不上的呢,你有什么问题直接提啊,下面我们来聊怎么理解这条指令,这条指令怎么去理解它呢。
首先呢后面这条指令呢我刚才讲过了,你应该能理解了啊,这是一颗cpu,这是一颗cpu,通过这条指令可以cs操作去改某一个数值x,然后呢,前面这条指令是关键点,前面这条指令的关键点是说。
当我执行后面这条指令的时候,不可以被其他的cpu或者其他线程所打断好了,这是一条lock指令的含义,lock的含义听懂了吧,当然我讲到这儿,很多愿意刨根问底儿的小伙伴,他肯定不开心。
老师你告诉我他是怎么保证这一点的呀,怎么保证他不被打断的呀,各位同学,保障一条指令不被打断,从硬件层面上来讲,它有好多好多的方式和方法,这里面它内部升是一个升级的过程啊,我就在这就不展开了。
它有哪些方式和方法,第一个呢叫关中断,如果你学过微机的原理,你就会知道,我们所有的操作都是通过中断来完成的,在我们的操作系统这个级别上啊,cpu这个级别上都是通过中断来完成,就说我执行这段代码的时候。
我根本就不想用任何中断,你任何人都可能不可能打断我,所以第一个叫关中断,第二个呢叫缓存锁,昨天我讲过缓存的概念,就是把整个缓存行x所在缓存行全部锁定,我改的过程中不允许任何人进行任何修改。
这个可以不可以,完全也可以,但是有的时候x可能数值特别大,都超越整个缓存行了,你这时候怎么办,所以第三种第三种叫什么,第三种叫锁总线,锁总线,什么叫锁总线,就是我把这个通道给锁住。
当我执行这个操作的时候,只允许我这颗cpu去访问这个通道,其他谁都不可以怎么锁,拉高芯片上的北北桥芯片的一根一根电平,往上拉高就可以了,好了就讲到这里啊,再往下讲的话呢,我觉得给你探究硬件了。
还能跟上吗,兄弟们懵逼是吧,懵逼就算了啊,我们回顾一下啊,把前面把前面这部分稍微回顾一下,稍微回顾一下,梳理一下,我们再继续往下o,什么意思啊,认真听我们所有的语言。
所有语言虽然说我以java语言来给你举例子,但我讲的东西不限于java语言,c和c加加本质是一样的,他的所有的说呃,内部的这种语言,所synchronized的什么什么什么什么。
实际上呢是把任何对象都可以当成一把锁,在某个位置,在java里面是在他的mark word上记录着这个锁的信息,是谁持有了这把锁,我我把它释放开了之后,另外才可以,这是我们日常使用的锁。
一般我们把它称之为叫悲观锁啊,就是上来之后二话不说,我先把我名字记上,先锁住啊,我其实你想想看,有的时候你进门上厕所,你是不需要上上锁的,是吧啊,你在家就家里就你一个人,你不用上锁,对不对。
但是呢我们上来就给他上锁,表示自己很悲观啊,我我我管他呢,我悲观的认为一定会有人来,所以我上来先把锁锁上,这叫做悲观锁,那么第二种方式呢就是cs,它是乐观锁的一种实现方式,本质上他认为呢在我改的过程中。
不会有其他人对他进行修改,那么如果有其他人进行修改了,我就采取补救措施啊,我零已经被别人改成八了,没关系,我把八拿过来改成九啊,写会计的过程中,八又被别人改成100了,再拿过来改成100。
一直到有一次成功为止,那么它的本质实现实际上也是悲观所实现,所以就是说所归根结底只有一种就是悲观的啊,这个没有办法啊,它的本质实现呢我们一层一层的跟下来之后呢,你会发现它掉了unsafe。
unsafe下面呢它掉了c和c加加的on safe,对吧,我们会发现了一条指令叫compare and exchange,表示它cpu级别直接直接支持一条指令,但这条指令本身不具备原子性。
我们怎么保证它原子性啊,在硬件层面我们加这条lock指令,这条指令就可以保证,这条指令内部是怎么实现的呀,一共有三种方式啊,这个内部是一个升级过程,太复杂就不展开了,ok基本上我以前遇到的面试。
就问到这个程度了啊,没有比这个更深了,好讲到这里我们可以继续的给老师扣一了,大家可以从笔记里头找到老师的这个跟踪过程,好吧,虽然说你可能不知道怎么去搞那个,hosport代码之类的。
咱们v i p呢是有一些hosport代码,讲给大家听的啊,比较关键的代码呃,有就是那个那个满足,有一部分呃,比较想深入了解底层的兄弟们的胃口,是这个意思啊,但是对于大多数人来讲呢。
你跟跟着我差不多走一遍啊,然后记住结论基本上就可以了,呃大多数面试官呢基本上就就搞不定你了,听懂了吧,嗯好嗯,ok ok好,那你理解了这件事情之后,当你列了这件事情之后呢。
下面我们来看另外一个理解了这件事,我们就可以深入的理解synchronize的关键词了,就这个文件字啊,就synchronized,大家平时都老用老用老用,现在你明白这是怎么使用的了。
但是synchronized的内部是有一个所升级的过程,这也是面试的重灾区之一,就是c synchronized的内部是怎么进行所升级,也叫所优化的,我们讲一个锁呢,如果你上来二话不说。
就拿一把锁挂机关注之后就开始用,那么它效率一定很低,原因是什么呀,原因是同一个时间点啊,这个坑只能一个人用吗,对不对,我想提升整个锁的效率,我该怎么做,它内部帮你做了一系列的提升哇,这个又又又又又复杂。
有的讲了啊,好看,这里读没必要锁毒没必要,锁也有,有的时候也有必要,你读的过程被别人写了怎么办,锁呢有好多好多种啊,讲了基本的悲观所,讲了基本的乐观所,实际上在我们没有j u c这个包之前。
大多数因为用的锁就是synchronize,也没有其他没有其他可以选,但是我估计应该有很多人了解过啊,实际上j u c包了出来之后呢,有好多种其他的锁了,就比如说reentrance log是吧。
这个就是用来替代synchronized,还有什么呀,countdown latch门栓,ok它的本质也是用c a s来实现的,ok还有呢sec liberrier栅栏是吧,per阶段同步器。
ok刚才有同学说读不用上锁,本质上都是有些毒是需要上锁的,万一被别的鞋所改变了呢,你读的不是一个中间值了吗,就成了对吧,所以呢read riot读写锁,ok还有summer信号锁。
还有呢exchanger是吧,交换器以及呢比较好用的这个lock support啊,所支撑,还有呢stem lock啊,这种的是不可重入锁呃,steplog呢是唯一的一个不可重入锁啊。
其他的基本上没有不可重入锁啊,呃j o c提供了很多很多线程的锁,你可以直接拿来使用,j o c呢也提供了自己的那个锁,构建锁的基础要素,你也可以愿意的话,可以自己构建,比如说你自己写一把锁啊。
em lock我就是星期二上锁,其他的都不上锁,哈哈也可以的,本质上你都可以用自己的想法来实现好吧,这块呢也是面试的一个重灾区,但是今天我们就没法展开了,我们今天先讲,先讲所的本质好吧,相比讲所的应用。

系列 6:P33:锁的升级:偏向锁未启动 - 马士兵学堂 - BV1RY4y1Q7DL
下面呢我们来聊什么呢,就面试中常问的另外一个问题就是锁升级,索隆提是一个很很细节的过程,今天我给大家聊一个初步的脉络和梗概,大家看这张图,记住这张图就是synchronized的内部,所执行的流程图。
synchronized,当你new一个对象出来,刚刚开始new出来的时候,它会是一个普通对象,如果你偏向锁打开,它会是匿名偏向,如果是偏向锁打开了,第一步锁定的是偏向锁,第二步锁定的是轻量级。
第三步锁定的是重量级啊,中间有一个升级的过程,好了来,下面我们要准备对这幅图进行细节的展开,准备好的同学再给老师扣一,嗯嗯好的,大家认真听,偏向锁概念相对复杂一点,我们先扔一边。
下面我们首先首先来理解什么是轻量级,什么是重量级,好各位同学听我说这个轻量理所呀,就是我们刚才讲的这个cas的概念,ok,这个清掉你所就是cn的概念,也就意味着在synchronized的内部。
执行的过程之中,实际上它有一步呢是在做这个轻量级锁的操作,现在你所的意思就是说啊,我们还拿那个上厕所来举例子啊,哥们儿有一哥们在里面上厕所对吧,现在你所是怎么操作的呀,轻量级锁的操作是这么操作的。
有一个人已经进去了,然后呢门上贴着他的名字是吧,这门上是叫铜墙铁壁,然后如果有人来了,用轻量级锁的方式来热竞争,cas循环不停的循环,while循环怎么循环啊,简单理解为就是拎着裤子跟着原地转圈。
每转一圈看看锁开了没有,每转一圈儿看看锁开了没有,什么时候发现锁开了嗯,比如说,来比如说这上面坐着的人是铜墙铁壁是吧,然后来了一个人叫夏天,夏天就开始拎着裤子跟他转圈转一圈,哎,哥们儿你出来没有。
哥们儿你出来没有,然后又来一人l b p也跟着拎着裤子转圈儿,哥们儿你出来没有,你出来没有,什么时候发现门一旦开了,或者锁被打开了,这两个人一拥而上,看看谁先抢到,谁先抢到。
比如说夏天抢到了夏天进去干事,lb hero在这里继续拎着裤子转圈,唉,转每转一圈开了没有,每转一圈开了没有,直到开了位置啊,听懂了吗,这就是那个轻量级锁的,用cs实现了一个简单简简单的理解啊。
就是这么来理解,ok来这块听明白,老师可以啊,好这是轻量级锁啊,下面我们来理解什么叫重量级锁,各位同学,重量级锁这件事情呢相对难一些,理解重量,你所就需要理解另外一个概念,认真听啊。
我发现需要补的基础概念,大家伙应该是比较多,没办法给大家补一补,稍微,就是线程模型啊,我们讲这个线程模型啊,好大家看这里看这里啊,我给大家画一下图就行了,那么这是我们的操作系统dos大家都知道啊。
我们的虚拟机啊是跑在,我们的虚拟机呢是跑在操作系统里面的是吧,我们我我们虚拟机啊,这是我们那个jvm,这个m呢是跑在操作系统里面的呃,关于对于cpu的各种调度,对应的操作系统啊。
其实就是操作系统里面的线程,这是操作系统的线程,操作系统限制操作系统线程好,现在问题是呢,大家都知道我们在jvm里面,我们也可以写自己的线程,对不对,在jvm内部啊,我们也可以写自己的线程好。
这是jvm的线程,现在我问你的是呃,jvm写一个线程应该大家都会写吧,thread等于new thread就new出来一个线程,对不对,下面我问你的是一个jvm的线程。
对应操作系统的是一个操作系统线程吗是吗,就说我在jvm里面六个线程出来,我的操作系统是不是,真正的会给他new一个线程出来,是吗啊,有人说是,有人说不是啊,答案是yes,记住答案是yes。
目前呢大多数的jvm的实现,就看具体看哪个哪个jvm实现啊,兄弟们具体看哪个jm实现,目前大多数jm实现都是这样的,一比一的关系,这里起一个,这里就起一个,因为他偷懒儿,明白吗。
如果我要自己去管理整个线程的调度,我需要单独写算法,写起来很麻烦,所以jvm呢从开始就偷了个懒,我把我所有的线程的调度,线程的管理交给谁,交给操作系统了,我这里有一个交给他去管理。
new一个交给他去管理,然后呢他再把结果反馈反馈回来给我,ok这是dvm。

那么和这个形成鲜明对比的是另外一个语言,是另外一个语言好这个语言是什么呢,这语言是go,go on的虚拟机,go on虚拟机长什么样呢,go on的虚拟机呢,记住在go里面,它的名字叫不叫县城。
叫携程啊,或者叫先城,这里面它起n多n多的携程,或者叫n多n多的线程,那么对应我们的操作系统起多少个呢,其实最多就起那么十几个,这里是一个m bn的关系,o这里面它里面执行的所有的任务。
最终是由我们操作系统的十几个线程,或者几十个线程来完成的,而这个里面的携程可以起多少个上万个,ok这大家能听懂吗,这就是虚拟机的线程模型,每一个模型有每一个模型自己的好处,并不是说go的一定好。
并不是说java一定差啊,也不是说java一定好,go的一定差,go on是这么设计的,go on呢起一个协程非常简单,一个关键词go就可以搞定了,对不对,好各位同学,这里面就意味着有一个本质的。
有一个本质的这种这种区别,这种区别是什么呢,就是我对于自己内部现成的管理,说这两个线程之间,他们之间如果想做数据同步的话,由谁来管理啊,注意是要交给我们的go的虚拟机直接管理,那对于jvm来说。
如果两个线程冲突,他们有一个做一个数据的一致性的这种呃,比方说等待在同一把锁上的这种一致性的啊,调度调度管理啊,轮到谁不不轮到谁这样的管理好,这种时候交给谁啊,交给操作系统老大,各位听懂了吗,兄弟们。
来这块能听明白的,给老师扣一,一比一究竟是一个还是还是还是两个,当然是一个呀,本质上所有的东西,所有的最终都要通过操作系统的线程来完成吗,最终就是操作系统一个线程嘛,所以你看你攻你。
你自己看你的眼神钉在哪个层次上,ok好,各位同学认真听啊,那么回回过头来,我们来看这张图。

来看这张图,这张图的重量,你所意味着什么东西,请大家记住,如果是在轻量级锁这个层面,在轻量级锁的这个层面,java虚拟机自己就能搞定,while循环吗,反正well,你not open。
我就跟着转圈就行了,是不是很简单,就在这里,java虚拟机自己搞定,不需要经过操作系统,老大,接下来如果你要交给,说我管不过来了,交给谁,重量级锁的概念,就是交给操作系统老大帮我管理。
这是重量级锁的概念,这部分我自己管,这部分交由我的上级来管,所以它比较重,中间加了一层操作,得我的老大给我反馈回来,我才能得到结果,这是重量级锁的概念,各位听明白了吗,来这会儿大概听明白的。
给老师扣个一,所以轻量级自己搞定,重量级老大搞定o,那下面的问题是,老大搞定和我自己搞定有什么区别,听我说啊,就是这个老大呀,它内部又是一个复杂的过程,这部分也是一门课,叫操作系统吧。
学过这门课的就容易理解,没学过这门课就不容易理解,不过没有关系,我给你讲一个典型的场景,典型场景是什么样子的呢,典型场景是这样的,这个重量你所管理的时候经常有一个操作,就是让人去等待。
各位同学有没有调用过这个方法,叫older weight。notify,这句话的本质是什么意思呀,这个大家知道吗,weight,进入这把锁所关联的等待队列,仔细听啊,这不是让他进入等待状态。
是进入这把锁所关联的等待队列,让这个线程一个人来了,使劲儿转圈儿,转圈的人实在是太多了,我都转不过来了,我cpu都忙不过来了,怎么办,交给我吵醒老大,我操醒了,怎么管呢,让它直接进入等待队列。
来了之后呢,这是那把锁,这把锁所关联呢有一个等待队列,一个队列,这个队列呢让这个人直接进去排队就行了,什么时候轮到你了,什么时候把你拎出来,什么时候轮到你了,什么时候把你拎出来,听懂了吗,只要等待队列。
所以呢轻量级锁和重量级所它的区别,现在就呼之欲出了,这也是面试的经常问的问题,问轻量级锁和重量级所有什么区别,呼之欲出,轻量级所示,所有的线程都活着,原地转圈儿,消耗cpu。
while循环能不消耗cpu吗,重量级所示,很多线程进入等待状态,什么时候叫醒,什么时候再执行,不消耗cpu,各位听懂了吗,这是轻量级锁和重量级锁的区别,来我上面讲完的,能跟上的,给老师扣一。
嗯有点反馈啊,确认你还在听好不好,这边就只有那个小记号还在跟着我听是吧,其他的就不跟着听了,嗯雷雨嗯,ok 7371,good,好认真听认真听好,接下来那它中间这个升级过程是怎么升级的,为什么要升级。
这里面又隐含着一个面试题,就是到底轻量级锁好还是重量级所好,有了清道理所为什么还需要重量级锁是吧,有了轻量级,为什么还需要重量级,ok y哪个锁更好,答案是各有各的好处哈哈不然的话那就没必要。
其中有一个就没必要存在了,对不对,在什么情况下我们使用轻量级,什么情况下我们使用重量级,那么你想想看,如果有这么一种情形,这哥们儿呢叫伯伯峰,肠胃不太好,吃的又多,进去之后一干就干半小时。
然后外面等待的人又特别多,1万个人在外面等待,各位同学告诉我,这时候用轻量级好还是重量级好啊,轻量级轻量级就意味着什么呀,轻量级就意味着这1万个人在那拎着裤子,玩了命的转圈。
每转一圈消耗cpu cpu发现这都是活着的现场啊,不能让他们得不到我的cpu的时间,这个也不行,对不对,所以得让他们得到时间片执行,那就意味着光线程切换就消耗了很多cpu了,效率反而不高。
而且呢我转半天圈也得不到锁,为什么,因为波波峰这哥们儿,他这个时间太长了,是不是,所以这种情况下,我们一定是让这1万个人去排队,让伯伯峰什么时候完事了,什么时候再拎出另外一个人来,再进去就行了。
这样的效率反而变高了,ok所以我们得出结论是什么情况下呢,一般来讲我们干的这件事儿,专业名词呢叫做critical section,叫临界区,临界区的这个操作,也就是你干这件事啊。
大大个便这个时间特别长,与此同时竞争又很激烈,什么叫竞争很激烈,就是等待的人很多,这种情况下不适合轻量级,直接升级为重量级,其他时候都是轻量级,这块大家大概听懂了吗,呵呵好大题,明白之后呢。
我看刚才有同学问啊是吧,老师那什么时候清量级升级为重量级啊,这玩意儿比较复杂,你们想听的看,我其实有的有点懒得跟你们讲啊,这会儿还能跟上呢,还可以往细节里揪一揪的给老师扣个。
一来就是说在什么具具体在什么情况下,轻量级升级为重量级,好吧嗯,反正就是你大概理解就是轻度竞争的时候,我们使用轻量级就可以了,现在机搞不定的时候才会升级为重量级,听懂了吧,那具体什么时候升级呢。
这里面是有它的一个指标,这个东西呢,我在那个笔记里给大家写的很清楚啊,所以说呃我是推荐各位学习呢,不要追求说我就一定上来之后,所有细节全掌握,你应该先掌握这张图的大概脉络。
然后呢再去慢慢的去探究这里面的细节,这样来学习啊,不要那个上来学一大堆细节,所以我有的时候呢还给大家讲太多的细节,主要是因为这种学习方式效率其实并不高,呃如果有兴趣去读这话。

各位看这里啊,如果竞争加剧,在这里在这里,因为这里面涉及到另外一个东西,就是呃jvm的u调优啊,就是你需要指定jvm参数,如果竞争加剧是这样的,在以前的老版本的情况下,线程超过十次自选。
就是在转圈转了十次都没轮到他,或者说自学的线程数超过cpu核数的一半,比如说你那个有有十个和十个盒,然后呢这时候数量已经有六个线头了,在这里转圈了,好这个时候呢升级为重量级,但是呢jdk一点六之后。
他加入了自适应自旋转圈,a dance of spinning,adaptive self spinning啊,跟我读啊,adaptive self spinning。
ok adaptive self spinning,这时候由由谁来控制呢,jym自己控制就行了,你不用再管了好吧,不用再管了就ok,所以这个如果你要愿意管。

你也可以自己指定啊,但是一般不建议管这事儿了,简单说呢就是这事不要不要你管了,他自己管,自己判断什么时间生,他不生来这块听明白了吧,啊关于这块我就大大概给大家讲清楚了,就是轻量级锁什么意思。
重量级锁什么意思,k所谓的轻度竞争是什么啊,什么时候转成重量级好,我们我们我们给大家讲一个比较难的概念,偏向锁好吧,嗯来准备好的同学和老师扣一,这个偏锁呀,它比较特殊,是不是从重转为轻,转不了啊。
没有没有往回的箭头,这东西只能往前走,好变t啊,这个偏向锁呢它这个概念呢比较特殊啊,这个也就是存在于面试里面,其实呢你掌握它不掌握它,我认为关系不大,为了就是有些同学的刨根问底儿。
给大家讲一讲偏向锁的概念,偏向锁,偏向锁,严格来讲并非一把锁,啥叫偏向锁,讲这个电阻呢也可以顺带着教大家,你看清楚你现在的锁是哪种锁。

呃实际上我们是可以通过一个观察,一个对象内部的结构,能够观察出来我们现在用的是哪种锁啊。

这我教大家一个小小小技巧,看这里,比如说,那刚才那个小程序来举个例子啊,比如说t小t等于6t是吧,我上我给这个小t上把锁synchront,然后呢把它给里面内部再解析一下,跑一下,大家看这里啊。
就是说这个时候啊,是我们被锁定的那个对象的内部状态,如果你想知道他现在上的是哪种锁,你只需要对照老师给你画的那张表就可以了,我们把那张表调出来,刚才那张表啊,就这张表只需要跟这张表做对照。
从哪里做对照呢,从这几位这几位做对照。

ok你看啊,你读这几位,这几位目前是000。

对不对,如果这几位是001,对应的是无所啊,我们我我,我们看那个我们那个小程序刚刚new出来的时候,是不是零一看了吗,这时候是没有锁的,等于是没有人锁定的,所以他怎么判断是没有人锁他呀。

只要判断这几位就可以了。

好我们翻过头来,那么如果你这里写的是幺零,幺,对应的是偏向锁,听懂了吧,如果这里是零零啊,我们现在就是零零,对应的是轻量级锁或者是自旋锁,或者叫无锁啊,那么如果这里是一零,对应的是重量级锁。
ok如果这里是一一,就是表示呃这是我们垃圾回收器,那这样来回收这个对象,来这块儿大概能看懂的,给老师扣一没问题吧,就是你看啊我们上来之后上的就是轻量级锁,对不对,那有同学可能会说老师。
那什么时候我能看到那偏向锁呢,看到偏向锁呀也很简单,就是你只要干这么一件事就可以了,thresleep 5000,我们只要上来先睡五秒钟,这里稍微等一下,因为他睡五秒,睡五秒之后。

你发现我们上的锁,我们看到这个对象上完锁之后呢,和原来就不一样了。

刚才你还记得吗,他是零零,是不是现在是什么,现在是101,那101什么是什么状态,对比一下101在这什么状态,偏向锁是吧,就是睡五秒钟之后啊,你发现你那个对象就变成偏向状态了,哈哈好。
下面我们就开始讲这个偏向锁的概念啊,也顺带让大家理解为什么睡五秒钟它就变偏,就变偏向了啊,后两位还是三位,两位或者三位吗,不都一样吗,仔细听仔细听这个片索呢,其实他还挺有意思的啊,挺好玩的。
给大家讲一下偏向锁,那到底什么叫偏向锁呢,各位同学偏向所最基本的理解就是一个标记,他甚至呢本质上都不是一把锁啊,它就是个标记,比如说我再举个例子啊,我拿我拿谁来举例子呀,我看看谁正好错的,错的是龙舞啊。
龙舞太不雅观了,ok龙五呢觉得很不雅观,所以呢他上锁的时候上偏向锁,偏向锁的第一个概念叫做偏向第一个线程,厕所开门了,第一个过来的人是龙舞,好了,这把锁就是龙舞的,那这个偏向锁怎么上呢。
龙五把自己名字写上龙龙五,ok把门往往门往上往上一贴,说哥们儿啊,这把这个坑归我了,进去干事好了,这个标记上面贴着的这张字条就是偏向锁,从专业角度讲呢。
就是龙舞把自己的线程id直接写在mark word里面,表示这把锁归我啦啊这就叫偏向锁,那偏向所有什么好处呢,大家都知道县城是执行一会儿休息,一会儿执行,一会儿休息,一会儿,听从线程调度器的龙五。
在持有了这把偏向锁之后,它是由于他是第一个来的,第一个来的,所以呢这把锁是偏向他龙武的,就给他写一名龙舞,不会写别人的名,只会写第一个过来人的名字啊,那龙舞呢就是你的,就是这个他的初恋对吧。
刻骨铭心的记录在这里啊,只会偏向第一个,后面的都不算,这有什么好处呢,好处在于龙舞这个线程暂停之后再回来的时候,只要他回来,发现上面写着我的名字,龙舞直接进去继续干事就可以了。
没有必要进行所竞争这块大家能听懂嗯,就是他省了很多锁竞争的过程,ok这就是偏向锁的概念,那下面我们来讨论,如果又来了第二个人怎么办,假如第二个人来了章鱼,和铜墙铁壁,这俩人来了,这俩人来了一看,哥们儿。
你你不对呀,就你一个人把坑全占了,这不合适啊,把龙武的名字撕下来,然后这三个人开始轻量级锁,拎着裤子转圈,竞争是竞争上谁就是谁的,这块就升级到了那个轻量级锁了,好吧,什么时候撕,只要有第二个线程来了。
就直接撕好,这是这个过程啊,我们再重复一下,就说第一个人来了呢,把他名字往上一贴,然后如果他再回来,就不用有所竞争,上面看就是我的名字,直接推门就进,那这个时候如果第二个人来了,我们要进行锁竞争。
谁哪有这把锁,谁才能够在里面干事儿,就把这个名撕下来,然后他们三个人开始自旋锁竞争,拎着裤子转圈,一一往往的具体的实现呢也是优先偏向龙舞啊,就是即便升级为轻量级锁龙五,也是第一个进去的啊,一般是这样的。
就偏向哦,好各位认真听啊,认真听,那么这个时候呢这把偏向锁有什么作用呢,就很奇怪啊,那有一个人来了,我直接让他去进行锁定增生,不管甭管是轻量级重量级不就行了吗,干嘛要设计这么一个标记。
设计在这里有什么用,这里面有它背后深刻的含义,各位同学,这个深刻的含义我是尝试讲出来,看能不能理解,这里面呢有一个小小的调查,就是在我们日常工作的过程之中,虽然说我们用到了某些带同步的方法。
比如说synchronized的各种各样的方法,你可能没有意识到,其实你一直在用,但是在绝大多数情况下,我们用这些方法的时候,实际上只有一个线程,在百分之八九十的情况下。
我们在使用synchronized方法的时候,实际上只有一个线程在用,有同学说老师不理解,我给你看一个最粗浅的案例,你就理解了,大家看这里,我们日常开发之中经常这么写,is out。
hello world,好,我们看了我们写了这句话,这句话里面有几个线程告诉我有几个线程,几线程,一个主线程就一个,对不对,那么你这里面用锁了吗,有没有用锁,你可能不知道rain line。
这里面就有synchronize,看到了吗,所以他实际上已经使用了锁,ok,那假如说我大多数县城,只有一个线程在使用这把锁,我有没有必要启用那种复杂的锁竞争机制,啊我判断一下谁是什么状态,该轮到谁了。
下一步是谁的,这把锁是谁的等等,有没有必要我再重复一遍,在绝大多数情况下,我们可能自己知道不知道的时候,我们就已经使用上锁代码了,那使用这个上锁代码的过程之中,的绝大多数情况只有一个线程。
那只有一个线程情况下,我们有没有必要启用一个复杂的锁定成机制,有没有必要,没有必要了,那没有必要的话,那干脆就给他设计一个偏向锁就算了,所以在你一个线程使用这个synchronized的时候。
它内部就是一个偏向锁,就偏向你这个线程,你如果没有别的线程,你在重回的时候,重入的时候永远不会有锁定争,你的效率就提高了,这就是偏向所的设计机制,来各位听懂的老师可以,那好那我们回头再来看啊。
那为什么这个偏向锁,向左为什么是最开始没启动啊,我睡五秒钟才会启动啊,为什么会这样子呢,刚才我们实验过,对不对,我们上来睡五秒,然后我们就观察到了那个偏向锁是吧,synchronized。
然后synchrono,这时候我们就观察到那个偏向锁啊,为什么我们在这时候会观察到它的原因是什么,嗯那我们反过来问一个问题,就是说当我明确的知道是多线程的时候,我们说大多数情况下是一个线程。
所以我们设计一个偏向锁,但是当我明确知道,我非常明确的知道我下面用的肯定是多线程,一定是多个线程,我有没有必要启用偏向锁,骗子组还有没有用啊,没用,反正你出来之后也要也要被人撕掉。
撕掉的过程是不是还得费一部手续,效率反而低了,一个虚拟机启动的过程会启动好多好多线程,大概十几个,明确的多线程,听懂了吗,什么垃圾回收线程啊,背后分分配的线程啊,找操作系统要资源的线程等等等等。
它会启动好多个线程,明确的是多线程,还有没有必要启用偏向锁呀,没必要,所以虚拟机启动的过程是这样子的,在最开始它不会启用偏向锁,什么时候会启用啊,默认配置四秒以后,四秒以后启用偏向锁。
这个结论呢在老师给你的笔记里,也记得非常清楚啊,各位同学,如果你要愿意,你也可以使用jvm调优的参数来自己设置,这把偏向锁什么时候启用或者不启用,这些都可以听懂了吧,看这里可以用这个参数来修改它。


这个参数呢叫biased,lockjof daily啊,跟着我读,biased就是偏向的locking锁,start up,启动delay延迟,你可以把它启动延迟设置为零,那就刚开始虚拟机启动。
它就启动了,默认四秒,好了,偏向锁我就讲到这儿啊,大体的概念我就讲清楚了吧,应该这个图看翻译出来看看,还有什么不明白的吗,一股子咖喱味,好我们再看这张图,看是不是能看明白了,来关于这张图。
还有没有谁有疑问的,好不要聊聊英语了好吧,英语浪费了我们中国人。

系列 6:P34:锁的升级:偏向锁已启动 - 马士兵学堂 - BV1RY4y1Q7DL
现在有点懂了是吧,ok我估计好同学呢可能还不知道呢,这个匿名偏向是什么意思,匿名偏向的意思呀,就是当我们new一个普通对象的时候,看这里啊,嗯你看啊,我们如果不睡不启用偏向锁,也就是说不睡这五秒钟。
这时候我们new对象普通对象啊,注意看普通对象走,你,好一会把它给输出出来啊,that's layout as essence to prinable s,把输入出来,记得结论就行了,啊。
这是咱们一个偏向所,没有启动的时候的一个普通对象,记住它长这样,下面呢我们来看偏向所启动之后的普通对象,让偏向组启动跑一下,比较一下,来比较一下,有什么区别,你看看这个对象上来。
是不是就自带着偏向锁的标记啊,101这里是什么零零有,对不对,也就是说当我们偏向锁机制没有启动的时候,我们这个对象啊就是一个普通对象,001呃,如果偏向锁机制已经启动了呢,它自带偏向锁标记好了。
这个对象就是匿名偏向,因为他上来呢还没有人给他上锁,还没有人还没有人锁他呢,也就是说他还没有偏向任何一个人呢啊,所以他叫匿名偏向,是这个意思,听懂了吧,很简单好,嗯关于这个图啊。
大概就是这样的一个小的升级的过程,我都讲清楚了,里面呢还有好多好多小小的细节呃,我都在那个笔记里头给大家记得比较清楚,vip里面会讲的比较详细,公开课呢我们就讲到这里好不好,还没上锁,咋偏向不是。
所以还没有偏向任何一个县城嘛,所以叫匿名匿名的吗,地名偏向意义是什么,没什么意义,就是上来之后呢,他已经把脑袋给你设设计好了,你不用再从普通对象转过来了,意义不大。
老师聊一下synchronized底层是怎么实现的,synchon底层我在笔记里给大家介绍的比较清楚,它本质上也是用log来实现,synchronized的底层是用log来实现的。
昨天我已经分享过了这个笔记的地址,找咱们任何一位小姐姐去找她要一下就ok啊,一我想现在呢我估计有一些那个大厂的面试题,你就应该能答得出来了,我瞅眼看看有哪些你能答得出来的,仔细从头读到尾。
这些都是百度阿里美团,什么顺丰,都是一些大厂的面试题,都会明天就送外卖嗯挺好,去美团送外卖,嗯在这儿呢再给大家拓展一些小小的细节啊,后面内容呢能跟上就跟,跟不上就算了,好不好。
嗯今天呢由于跟大家拓展的知识面比较宽,有一些呢其实大多数都是涉及到一些,计算机系的基本的这种基本的这种这种这种课,呃,这也是为什么,就是老师呢在这里给大家在我们的课程中呢,给大家设计好多这种基础课的。
原因就是基础课你搞定了之后呢,基础不牢,地动山摇,搞定之后呢,你就会走得比较高远啊,比较长久,基础打牢了,这里面有好多计算机系应该要玩的,一些基本的内容就是操作系统,计算机组成原理,io和网络。
计算机网络,然后那个linux系统算法,数据结构,今天听课的如果是有一些非计算机系的同学们,时间够的情况下,优先要把这部分内容搞定的,听懂了吗,补一点那个这部分内容的基本的基础啊。
今天今天是不是有人是那种非计算机系的有吗,有没有有的老师扣个一的,有应该有啊,因为咱们国内呢呃,搞编程的程序员其实很专业的并不多,当然他现在的要求会变得越来越专业,但是听不懂,你听老师的课就能听懂了。
你听我的课听不懂吗,我跟你讲这些原理,你听不懂吗,我们回到那个美团的面试题。

美团面试题呢,他就问你说那个一个对象,在内存之中的存储布局,那么各位同学啊,呃这里面其实有一个很好玩的地方,就是我讲的比较清楚,我说mark word是多大呢,是八个字节,对不对,指针类型是多大。
指针类型是四个字节,对不对,这就比较好玩了,各位同学,我不知道大家了不了解啊,就是你们的使用的虚拟机,它是多少位的,一般来说我们讲虚拟机这块呢,都是说你是多少位的虚拟机是吧,你是多少位的机器。
你们知道自己的虚拟机是多少位的虚拟机吗。

这块怎么查呀,挺好查的是吧,64位的对呃,怎么看呢,你敲一个命令就能看出来啊,看这里啊,我就敲java,这玩水就行了,这里写得非常清楚,64位虚拟机好嗯,你比方说你的操作系统。
你的windows是多少位的呀,64位的对吧,如果以前的话,实际上什么windows xp啊,还有32位的等等好,那么各位同学你们了不了解。

尤其是哪些非计算机系的,这个64位意味着什么,32位意味着什么,谁能告诉我这指的是什么东西什么的,什么东西的长度,什么东西的长度啊,寻址的宽度对啊,寻址的对没错啊,寻址呃,机器字长。
这跟机器字长应该关系不大啊,就寻指的宽度,指针的长度简单说就是指针的长度,就是我在里面一个指针,指针记录的是某一个东西的地址嘛,对不对,那记住这个地址的时候,这个长度到底是多少,这个长度呢64位的机器。
这个指针的长度就应该是64位,32位的机器,这个指针的长度就应该是32位,那么以前的xp呢大多数时候是32位,32位就意味着它的寻址空间,寻址空间呢,就是说我用多少个这么长的长度。
来标记我们整个内存地址,比如说我如果有一位,我就只能访问内存的两个小格,零或者一是吧,零或者一,如果两位呢,那我就能访问四个小格,对不对,01101100对吧,我标记四个地址,那如果是三位呢。
那就我能访问内存中的八个小格是吧,那如果是32位呢,那我就能访问二的32次方个小格好,如果每一个小格代表的是一个比特的话,我能访问多大的内存,二的32次方是多大的内存,各位兄弟,多大内存。
这个大家知道吗,了不了解,4g,所以,在原来的xp,你在这这种32位的xp的机器上,你装超过四个g内存,有没有用,有没有用,一点用都没有,因为再大的空间他已经访问不到了。
所以前的xp不知道有没有人还有印象,它最大内存就支持三个座机,因为它还有一些其他限制啊,识别不到对,那么现在的机器多数都是64位,唉你看我就知道有人64位,不就是八个g而已吗。
来各位同学有没有人嘲笑他一下,二的32次方是四个g,二的33次方是八个g,你自己给我算二的64次方到底是多少个g,我已经无语了啊,我买高科技,好好好,我们讲这个并不是为了给大家讲讲内存啊,主要看这里啊。
就是我们java虚拟机啊,现在是64位虚拟机,64位虚拟机,它的内部的指针长度应该是多少,是64位,各位同学,64位,可是我们刚才所看到的任何的对象啊。

刚才我在给大家演示这个对象大小的时候,大家都看到了我们看到的任何的对象,它的指针,我们说这个指针这个指针是多少四个字节呀,这就开玩笑呢,您您您老人家64位的机器,结果你弄一指针出来四个字节。
这是以前有面试官问过的,why,这四个字节四个byt,为什么好,各位同学,这里是压缩过的啊,这点你要知道这是压缩过的,还有我讲过,我说在t里面,我们看这里啊,没有,我们还是用这个t啊。
三回头来给大家补一点,这些基础知识,因为如果真的问到这里,其实就能问出来你到底是计算机系的,还不还是不是计算机系的,我就这么跟你说啊,作为面试官来讲呢,他判断你到底是计算机专业还还是不是。
就问你这些基础知识啊,t小t等于net,我们说如果t里面有一个string s,各位同学它的长度是多少,按理来讲,您老人家是64位的机器,是不是64位的,加入虚拟机,你这个长度必须得是64位。
八个字节才对,你说对不对啊,同学们,可实际上实际当中是什么样子的呢,跑一下看,它是多少个字节,四个字节看了吗,它的指针是多长,他这个脑袋上这个指针是多长,指向那个class的指针还是四个字节。
ok这玩意儿就就有点有点过分了。

原因是什么呀,原因是你需要理解java里面有一些好玩的参数,我们把这些参数让你给他展现出来,java conversion,要么更,print come on lying flags。
老师的记忆力还可以啊,princeline flags,就是把那个命令行参数自带的那些,全给自己敲出来了。

conversion,大家看这里,这里头呢有一些这是java自带的参数,看了吗,concurrengc threads,这就是有多少个gc的线程是吧,一起就11个啊,所以说我们讲这版本启动的时候。
有好多好多个线程启动,这里面我们主要看这两个参数,这里我们用的是g y g c k,我们主要看这个参数,这是其中的一个,这是其中的另外一个这两个参数啊,这两个参数呢就是去。
就是决定着你到底是压缩了还是没压缩在这里,这是它默认的参数,呃这边调优课呢,主要讲这些参数怎么来进行运用,什么意思啊,读一下,理解一下,compressed as sponders compress。
压缩的class pointers类指针类指针进行了压缩。

所以我们这里看到的,我们这里,这里看到的这个指针,这个指针它就是四个字节,因为它开启了压缩,那么后面这个是什么意思啊,o p s的全称呢叫,ordinary。
ordinary object pointers,好就不写全了啊,普通对象指针,ordinary object pointers,就是普通对象的指针,什么指针,这个指针这个指针它也是压缩了。
还有同学说老师我能够打开它这种压缩吗,打开压缩呢有两种方式,第一个呢你的内存足够大,就是你使用的内存足够大,你这外面使用内存一般来讲,超过32g压缩就不起作用了,如果你jvm管理的内存超过32g。
压缩自动不起作用,各位听懂了吧,这是第一个一个结论,第二个呢我们可以使用参数来把它打开,我们来看一看参数打开的状态好不好嗯,到现在还能跟上吗,各位兄弟们能跟上老师扣个一来。
就后续我真心希望你们扎扎实实的跟着老师,第一好好训练训练基础,第二呢顺带着把java虚拟机怎么优化,各方面的内容也都掌握住,多线程内容掌握住,这样的话呢,最起码很多很多的那种基础型的大大厂的面试。
你就能搞定了啊,我们我们跑一下这个还是这个小程序啊,我们跑下一下run,我们指定它一下,just test edit,指定他的vr motions program arguments o。
指定他的vm options on gram xx,加号就表示开启,减号呢就表示关闭,等着我们关闭掉,use嗯,impress o o p s,就是我们把那个普通对象指针给它关闭掉好吧。
apply run,跑一下,看,好各位同学仔细看,现在我们这个,我们这个普通对象的指针s变成了什么,自己看变成什么东西了,o,八个字节是不是啊,同学们好,大家看到了吗,看懂了吧。
嗯当然我们可以把这个也打开,这个时候呢我们这个指针就变成了八个啊,这是,一些小小的基础补充给大家听啊,运行的时候再解压缩,是的是的嗯,好这块内容大家听懂的,跟得上的,给老师扣一,下。
面我再问你一个触及灵魂的问题,一个触及灵魂的,涉及到计算机基础知识的问题,这个呢比较难答,我想问你的是,这个压缩的时候是把八个字节压成四个字节,按理说这四个字节它最大能够管理的内存,我再说一遍。
一个四个字节的指针最大管理内存是多大4g,可是我刚才明确说过,jvm什么时候这种压缩它会失效,超过32g才会失效,那这事儿就很神奇了,一个压缩完成之后,只有4g能管理四个g的这么多的地址的。
这样的一个指针,他居然管理着32g内存的,是y y32 g内存之前他都可以用压缩的啊,这个你们自己去实验就知道了,这儿曾经有一个忘了某一个厂子的面试官,问的啊,物质是由原子构成。
现实只允许操作到分子水平ab 8哈哈,虚拟定位说的很对啊,就是说说的很对,说的很对,没错啊,这其实呃这两位同学他都是明白的,说的是对的,仔细听这个很简单,就是说在java里面操作任何的数据的。
基本单位是一字节,一个字节,也就是八个八个位,有时候我一个地址啊,我不4g一个地址吗,二的32次方4g个地址,我一个地址啊,代表着是一个字节,而不是一位听懂了吧,所以这里头呢是4g乘八,一共是32g。
32g内存,32g内存之后压缩才失效,ok,好讲到这里,其实还有一点扩充的知识也可以补充给大家,这块儿大家还能跟上吗,能跟上,我就稍微的扩充一点点好不好,对一些基础稍微好的同学,我扩充一点点啊。
不能跟上就算了,给老师扣个一来,我们看要不要再再再再扩一点,ok好看看多少啊,00976还在听呢,jack夏天铜墙铁壁,这些都是变变变得很久的人,好小柳马上马上成功,大家可能了解就是一个jvm的虚拟机。
它的垃圾回收器呢有好多种是吧,垃圾回收器呢原始的有那个serial serial两种是吧,serial serial,young serial old就年轻代老年代有两种。
两种cereal两种parallel两种并行的,这单线程的是多线程的是吧,然后c m s和他加那个po啊,这两个配合的是吧,这是六种,一共是六种了,这是两种这两种这两种,那么背后呃。
现在我们用的比较多的是g one,叫gabbage,first k g one,那么g one之后呢,我们又又有又有两个是吧,这这两个分别叫叫什么名字,大家知道吗,叫shannon da,谁能懂。
这东西是一个那个美国一个公园的名字啊,还有一个呢叫zgc,这个呢是下一代的垃圾回收器jdc好,还有一个是什么,还有一个是appellent,这东西是用来做测试用的啊,这个用的很少,大概一共有十种。
在这时钟里面呢,下一代的垃圾回收器,就是它z dc效果效率非常非常高,高的原因在哪里,他在指针上做文章,大家知道64位的指针,它可以寻址的空间极大极大,实际上是用不完的。
后来呢整个jdc是在64位指针的基础之上,一共用到了48位,在启动在这个基础之上叫颜色指针技术,叫color red pointer,color red pointers设计了非常漂亮的垃圾回收器啊。
这个垃圾回收器呢color pointers 64位的这种指针,其中用到了其中的四位o很好玩,总共用到了48位,实际上没有用用用特别多啊,如果大家会有兴趣,可以去钻研一下。
向面试官展示你知识面的宽度深度,以及你对技术的好奇心,好吧,cdc会大面积普及吗,我这边m调优不是白学了,在你普在大面积普及那一天,你也没有白学,好多时候你能讲出原理来,讲出历史来。
在面试官的印象要比别的人要深得多,大家可以去研究一下那个color pointers,那里面又牵扯了很多底层的这样的技术,挺好玩的嗯,细节我就不展开了,因为这块的话呢,估计大多数人是不了解这方面知识。
以后都用这个k 11了嘛,这无所谓,看你们用什么,好那个我今天的技术内容我就聊到这里好吧,昨天呢我也给大家介绍过咱们自己的课程,咱们课程呢还是那句话,是从零基础开始,从零开始一直到百万年薪的水平。
在一两门课里有所体现,一门课呢是入门,就是整个课程的,其中有门课是入门,就是java后端工程师啊,这里面呢适合小白,刚刚入门的同学入行,这里面是最大值,在里面集合里面我可以给你调最小值。
这样的入行的话呢,你会非常非常的快啊,快速而明确,在入行之后的提升呢是另外一门课,这门课呢叫架构师呃,在这个教育师课里头呢,整个内容呢大概100多门课程啊,我们教这100多门课的时候。
也并这是一个最大值啊,还是那句话,我提供给大家的是最大值呃,真正你学习的时候呢,可以先挑最小值来学,再慢慢进行体系化学习,这是我所提倡的,先赚了钱,涨了心,跳了槽进了大厂,然后呢。
在真正的慢慢的跟老师进行体系化的训练,你这时候你会发现,你后面的职业生涯会越走越好,越走越强,这个这个学习路线呀,这个学习路线呀我也给大家展示过啊,崭新的学习路线是吧,这也是比较全面的学习路线啊。
你像在这里面的话,老师给你画好路线之后呢,你就可以挨着牌的一条路线,一条路线的一门课。

一门课的跟着往前走啊,操作系统是吧。

你像,呃这样的话呢就会能做到,咱们的学习效率比较高,高到什么程度呢,绝大多数的同学寻求涨薪的,三个月之内就搞定了,寻求入行的3~6个月业余时间就搞定了啊,如果你要想快速入行的全身心投入的话。
有可能是两三个月就搞定了,这就看你每天投入的时间,因此呢不要看咱们课程多,课程多呢给大家的素材多,但并不意味着你要把所有东西一口气全学完,一口一口吃台阶儿,我们一个一个卖,慢慢的。
我们迈向薪水比较高的那个台阶上去就行了,vip课呢目前有直播和录播两个部分构成,我们直播完成的东西,它就一定会形成录播课,我们直播的内容,大家也可以在咱们的网站上直接查询呃,直播课呢向大家负责任的讲啊。
后面由于是那个端午节,所以这个呢今这周的直播课会相对偏少,但是你看上周的直播课,你就会发现咱们直播课的内容超级多,那个我们直播课的内容大概相当于其他机构的,至少是三倍以上,直播课完成之后会形成录播。
避免有同学你错过之后呢,唉没有办法再继续学习这个意思,所以是直播加录播嗯,这是咱们整体的课程的量以及课程的特点,定制化呢是咱们最大的课程特点啊,呃因为这样的话就能实现每个人的情况不一样。
那么他的学习路线就完全可以做到不一样,他的学习效率就和其他人比较高很多,如果你在线下学习,咱们内容全是一样的,我学这个,我明天讲这个,你听不了,别的线上不一样,我想让你听哪一块,你可以优先听哪一块。
这是线上所带来的好处,而且在我们大量的素材的前提之下,我可以帮你定制各种各样的快速的路线出来呃,在这里呢在咱们的整个细胞里呢,大家自己去可以也可以去了解一下,绝大多数同学啊,三个月搞定快的话。
学了半个月涨薪10%,10%,虽然不多,在疫情的情况下学了半个月而已,也还可以吧,俩月原公司涨薪4k一年5万多也还可以吧,这是学的时间比较长的,十个月薪资从10k涨到17k,1年涨了8万多。
这是学了俩月12k offer继续提升,刚入行的应该是,这是毕业半年让他涨薪涨了50%,这是花旗和微软的两个offer,这是面面试突击的课,跟着咱们学完,年薪涨了6万啊,整个课程内容的话呢。
从咱们入行开始,到很多人不愿意讲的这种底,非常底层的基础的内容啊,好多机构其实不愿意讲这块,因为它很枯燥,但是它又很重要,它是我们的易筋经,是我们基础中的基础,尤其是关于算法这块,关于算法这块。
这是这只是入入门级别的整个算法的内容啊,在咱们整个课程体系里面也是很大的一块,那个算法这块呢是咱们嗯左成云,左老师啊,大概呢讲了九个阶段,不能这没有点开啊啊,小姐姐们帮我反馈给咱们的技术,这块没有点开。
我不知道是什么情况,我我直接反馈吧,反馈一下,诶老师你看一眼那个数据结构和算法,那个大纲那里面的那个图片是点不开的啊,阶段一阶段二,看一眼,看一眼技术那个是怎么是怎么回事,呃算法内容是咱们的重中之重。
这里面大概包含了新手班的学习体,系班的学习,然后刷题班的学习面,常见的面试题呃,精品这种高频的面试题啊,算法的押题的内容基本上呢,每周啊基本上都在更新,这是咱们正在更新中的是吧,4月第四周嗯。
5月第一周,ok这些都在更新之中,好,呃有了这些内容呢,就是底层基础你会打的比较牢靠,当然了,还是那句话,就是说在你时间不足的情况下,你也可以先补补这些知识啊,老师可以帮你找到一条。
比较快速的升职涨薪的路线,然后升值展现完之后呢,再慢慢的进行你的基础化的训练,今天讲的很多内容呢,是来源于咱们并发编程的部分啊,大家打开大纲自己去进行查询,rpc的通信原理主要讲jk double。
然后消息中间件我们主要讲rocket卡夫卡,poser rabbit,active缓存的中间件呢我们知道叫memory catch和redis,软件设计的基础,u ml设计模式,软件工程的发展。
高并发相关的分布式的架构的实践,高并发高可用的部分啊,e t c d h a proxy key lives zk,通信和调用呢我们主要讲这个restful thrift,nt double。
缓存中间件主要讲redis存储中间件比较多啊,fs dfs,ht,fs mango,tedb neil否认ob click hospute等等呃,分布式锁各种实验方式,分布式事务,各种实验方式。
链路追踪的实验方式主要是step walking,预警监控,普罗普罗是吧啊,ok其他的各种分布式的东西,这个完成之后,我们主要来聊回复,两大体系,微服耐飞微服,阿里巴巴啊,这个完成之后呢。
我们主要来聊系统的性能优化,这是你简历中呃增光添彩的一方面,jvm调优,mysql调优,tomcat调优,alex调优是吧,高并发大流量的服务的调优的实战案例化,海量数据的处理存储搜索。
我们对于大数据这部分啊,e l k cloudoris啊,new ycle had to flink,这些网络基础设施建设运维层面,我们主要讲dns相关,cdn相关啊,全球同服的问题啊。
多级缓存资源静态化落地的问题,服务保障device,现在我们开发开发之中,所应用的最多的开发模型,软件测试的部分赠送大家一期一期课啊,only one service mesh呃。
如果你用go语service mesh是经常使用的,用来实现微服务的方式好了,这块呢就是咱们整个的基础点的内容,搞好技术点之后呢,要学会下一步的设计过程,指挥技术点,不会设计不行,好去聊理论基础。
去聊基础算法,去聊原理和源码的剖析,这块是你跨越落地奔向设计的要跨越的一,一站在这个基础之上,学习设计理论,高性能的架构,怎么设计分流,怎么设计并行并发,怎么设计缓存,存储可靠性,怎么设计。
应用保护怎么设计,在这个基础之上,再用各种各样的案例来帮你做实践,电商秒杀怎么设定红包,怎么设计微博互关百万级的并发,这种票务的联网系统,12306怎么设计弹幕系统,全链路压测的方案的设计。
零零丢失保护方案的设计啊,大数据相关的各种设计专题等等等等,最后我们用亿级流量这样一个完整的项目,来让大家完成一个比较完善的互联网,三高级别的架构师设计啊,这两个完成之后呢,基本技术方面你就搞定了。
好吧呃我不能说到头了,但也差不多了,在这些基础的基础之上呢,我们去学习云原生相关的啊,这是我们未来架构的重中之重啊,现在呢全球来说就是不管是大中小,各种各样的厂子都在上学,原上没有不上云原生啊。
从各种各样的那个软件及服务是吧,基础设施及服务平台及服务等等,一直到后端及服务啊,b a s云基础云架构容器容器的编排监控,devops持续集成,core sphere。
easter terrifensable,公有云,私有云到混沌工程呃,这种东西呢可以这么说,在中小的那种城市里面,二三线城市里面,你可以吊打很多人还掌握不了呢,常见的半个处理专题。
这东西呢主要是提升你们面试的时候的这种嗯,技术水平,说出来的内容比较高大上,薪资会比较高,那么从技术角度再往上就是要进行团队管理了,咱们的皮班老师,他是原来的真正的p8 管,100多人的。
教你怎么进行大型团队管理,咱们的p9 老师,原来是管理200多人的p9 团队,ok教你怎么运用产品管理好吧,ai送大家一个入门,这样大家做一个入门,ok中台的构建领域驱动d d d带大家学习好。
学习好啊,好整个技术的体系我就介绍完了,除了技术体系之外呢,我们另外的就是项目体系,项目体系就不一一介绍了啊,就是咱们可以写在简历中的项目非常多,解决大家伙你简历中项目没得写的问题,两大项目介绍给大家。
第一个呢是咱们飞机出行新版的2022,从项目的介绍,组织方式,整体设计开发规范,整体的技术栈的选型,到用户端到api的服务层,到service的服务层啊,各种各样的服务,健全订单消息网关地图等等派单。
然后到项目怎么测试,到项目怎么部署,怎么扩展,再教你项目怎么怎么拿这个项目去面试,如果以前只有c r o d传统项目的,搞定一个飞机出行,互联网级别的高并发的项目,你就有经验了,那么第二个呢。
是我们自己现在正在对外运行中的,你可以直接下单的啊。

咱们的马士英严选,在咱们的严选的里面呢,又是一个大概老是投入了呃,不到30个人吧,前后啊,前后不到30个人,为大家研发了这种大型项目架构,这这这个课是一个真正的呃,开发出来也在实际当中运行啊。

你也可以了解咱们整个后台架构,也可以在里面下单的真正的一个项目,也有咱们的pc端,也有咱们的h5 端等等,严选的商,这个咱们严选商城来讲的话呢,内容呢牵扯内容会更多一些啊,有各种各样的内容会更多一些。
我建议大家要过去,因为你会读到一个完整的稍微大型一点的项目,它到底具备哪,是哪些团队来做的,是由哪些技术选项,要选的是由哪些架构要构建的,从前端架构到后端架构,到运维架构,到各种中台的设计。
到应用架构的设计原则,容容量怎么估算,服务怎么设计各种的服务,然后到中台怎么设计到测试,怎么样进行自动化的测试,怎么性生成报告,怎么进行微服务的治理,怎么进行链路的追踪,怎么进行可视化的监控。
怎么进行容器的管理,好吧,怎么进行多租户的管理,包括我们开发的整个过程,开发运维的一体化是怎么实施的,ok呃我们搜索的过程ef k是怎么完成的,项目的规范是什么样子的,呃读完这个白皮书呢。
你可以自己带一个小团队尝试,就可以自己带小团队了,ok至少能你读完之后呢,别人问你,你说你们项目有多少人,你在里面做哪个哪个哪哪哪个东西,你能够完完整的说得出来啊,这是咱们的一些技术的选型啊,前端的。
后端的,pc端的h5 端的后台管理的,后端的架构的嗯,水同步用什么配中心,用什么网络用什么,然后这个是咱们后端后台的那个整体的运维架,构长什么样,这是咱们自己进行的飞马系统的框架设计,可以用。
大家也可以直接拿去用,我们也是准备开源的,这是咱们后面的架构的设计是怎么做的啊,这是咱们中台的设计,这是咱们i m的中台,这个是支持上亿级的那种并发的i m啊,它不是一个很小的就简单的聊天系统啊。
那个是拿不拿不出手的啊,这是咱们支付中台是怎么设计的,ok搜索中台怎么做呃,很具备参考性,各位同学可以拿去直接应用。

在你们现实现实项目里,我们直接把它放到网上。

你们下单也好,或者是学习也好,都可以拿来用好吧,ok,整个大概的这个内容的介绍就介绍到这里啊,最近呢咱们在搞我们的报名活动,典,报名的同学呢可以享受咱们的抽奖,一等奖是苹果板,二等奖是iphone。
三等奖是pad,四等奖是无人机啊,五等奖是曼卡顿音响,那么,整个课程呢呃还能享受的其他的一些优惠,呃,我觉得一门好课,给你带来的是你的整个职业生涯的颠覆式的,你收到的收获和收益啊,这个是很大的啊。
各位同学可以从咱们的就业里面,能够找得到这其中的蛛丝马迹,这里面呢没有任何一个聊天记录是给你p过的,只是隐藏了一些隐私信息,没有任何一个聊天记录是假的,好吧,你像,三个月入职涨薪70%就学了仨月。
一般情况下想涨薪的话,三个月足够啊,除非你水平特别差好吧,可以优惠几千吗,问咱们小姐姐吧,ok,现在有的公司是不是都拆中台了,有的是这样,但中台这个概念呢,其实你也不要把它想象成是一个。
你可以理解为我们中间的一层api层啊,你不要把它完全理解为说,马云原来提出的这种中台概念,那个是好多人都拆了啊。

这是应届生嗯,欧克原料14x18。

呃各个层面跟咱们学的同学,其实最后都得到了他们想要的结果,干哪种类型的项目对自己提升比较大,马士英严选这个项目要要完白皮书,你就知道了,你把它搞完,上上次有一个同学就是说搞完这个项目啊。
他突然间发现了他所有的全通了,就是所有知识全通了,你能理解这意思吗,如果我们平时学的某一个点啊,redis卡夫卡啊,spring spring mvc,什么mysql等等,这些都是一个零件的话。
你会发现咱们严品项目把这些零件全穿起来了,穿起来了之后呢,你会有那种感觉啊,就是有那种一体化的感觉,整个知识体系全建立了,然后再去看这些知识点的时候也就比较通透了,所以呢项目驱动很好的学习方式啊。
推荐大家使用,我咨询小姐天天睡到下午才起床,回信息,因为咱们咨询小姐姐,每天晚上12点之后才下班,所以咱们是下午上班,这个是哪位小姐姐,你可以再找她一下,你专门在这里,我专门跟她说一下好不好嗯。
最晚报名,明天抽奖,明天晚上是咱们抽奖的最后一天,明天晚上咱们周年庆典的活动就结束了,大家对于技术也好啊,我仅仅讲到了各种各样的技术,或者对于工作形势前途,职业发展课程有任何问题的,我们聊会儿聊天儿啊。
咱们准备11点吧,好吧嗯,物联网是不是不怎么好,不是不怎么好啊,就物联网呢他也是一个很大的行业方向,它里面的需求的人也挺多的,嗯物联网的多数是跟那个什么有关系呢,嵌入式跟这个关系比较大。
呃他的薪资呢确实不会像互联网后端这样高,他是这个意思啊,但是也谈不上说不怎么好,所以你得定一下,你这个不怎么好是什么意思啊,没有什么不怎么好的,挺好的啊,我们前20名报名的同学呢有500的返现。
有咱们白金的vip卡,这我稍微介绍一下啊,就是说有这张卡的好处呢,在于咱们后面的升级的内容,ok你可以用很小的代价就可以听,呃,你像我们目前每年升级的内容,目前每年的升级的内容呢大概是几百个小时吧。
几百个小时后面还会多啊,还有好多好多其他的内容啊,文字的内容,音频的内容,视频的内容都会有,像刚才给大家看到的直播啊,或者说咱们的科研更新,你在这里都能看到,就是说我们有哪些更新计划,什么时间再更新。
什么时间再更新,哪些的更新都在这里写的非常清楚,就是咱们更新的内容呢,有了张白金的vip卡,你只需要付一个流量费就可以听了,什么叫流量费呢,大家都知道啊,就是我们现在对外提供的这个平台,我不知道大家。
你很多人学习课程是在咱们手机上,手机上下载咱们的这个,app啊,这是咱们app,你下载完成之后呢,直接打开点开课程就可以学,比如这个鸿蒙鸿蒙的基础课,鸿蒙克是吧,嗯打开来。
再看这里你直接就可以进行学习啊,那么这个里面呢是我们要付给那个嗯云厂商呢,呃流量的费用啊,我我希望你每年负担一个流量的费用,老师呢就可以把课程免费的送给您,能理解的意思吗,就是咱们更新的内容啊。
你付一个100多块钱的流量费就够了,1年,马老师,请问张一鸣老师为啥不讲了,您得问张老师去啊,张老师有他的想法嗯,老师鸿蒙有前景吗,我认为有前景,但这东西呃预测未来是有风险的啊,我比较我喜欢啊。
我喜欢鸿蒙挺好的,因为当你到达某个层次之后,你会发现所有的东西,所有的脖子都在别的国家的手里头掐着你,你会非常非常非常的难受,我告诉你啊,我觉得任何一个系统,哪怕他现在不是很成熟,不是很好。
只要能够愿意打破这种垄断,我就喜欢去推广它,所以很多那种培训机构没有的课,这里有一堆,主要是咱们老师的一些情怀,那个从mc体育课里面我就能看出来一些啊,就说有一些课呢,你可能听都没听说过的。
比方说我刚才跟你讲过java语言和go语言的区别,他者的区别呢,是携程,但是java里面有没有携程的解决方案,当然有java里面携程的解决方案,colin的自带那个kim,阿里就用过用它来做解决方案。
这是我专门请的,阿里用kim做过解决方案的老师讲给你讲的,其实从这你就能看出来,就是老师选课的时候,一个就选老师也好,选课的时候一个讲讲究的程度,我毫不夸张的说,很大多数机构做不到这一点。
因为呢我我我是能够动洞洞察到,就是说我们需要哪些东西,你有可能会需要将来流行的地方,到底是有哪些提前的,就帮你把内容准备好了,kim是阿里的,这个以前用携程去做一些高并发处理的时候,使用过的解决方案。
好吧,这里面也有携程,你像整个mc里面,我们为什么要讲go浪,各位同学就mc叫架构师,架构师实际上是跨越语言的,后面呢我是想把整个架构师的呢,慢慢的升级成为java加go双语架构时。
这些个升级对于咱们现有的报名的同学来说,是免费的啊,当然我们真正升级完成之后,我们整体的课程价格是一定要往上调,一调的内容变得越来越多了嘛,嗯呃也就你也就不用再纠结了,我是走java还是走够了,没关系。
我一个课里都给你包含了啊,你选哪个,看你实际当中需要哪个,ok这个还可以吧,觉得还可以的,老师扣个一来认可一下是吧,打个牛逼出来啊,双语架构师啊,我们准备要退出了,也就嗯。
计算机语言一点不懂内容来学java吗,你原来所有人都是从不懂过来的啊,没学历寸步难行,没学历补学历啊,你学历差到什么程度,中专初中大专感觉白扯了,大专是绝对够的学历啊。
但是我个人虽然我个人提倡你还是要补到本科,但是大专学历,在很多时候呢,其实是已经非常非常的完全够了的,这是菲律宾从大专那边转成java的,涨了7k还,这是大专二线城市薪资直接翻番了。

这是大专,武汉四个月涨了7k一对啊,19年大专毕业生跳槽,直接涨了5k大专的应届毕业生,直接让他拿了21k能想象吗,这就是咱们的课程啊,非全大专一样的啊,这个大专本质上都差不多啊,就是不是非全没有关系。
你既然学了非全大专,我就建议你再补一个非全本科,听懂了吗,大专你好一点的,甲方费劲,这个呢是你的技术不行,不要怪学历,给咱们讲那个bug课的就是一大专生,他原来在京东,现在新浪,你跟我说费劲。
只能说是你技术不行,java python都学时间够吗,没必要都选一个架构师呢,了解语言的特点,带领下面的团队就足够了,没有必要把所有细节全掌握,逍遥说专升本没有学位证,大厂可以进吗。
本身这个是这怎么说呢,就是说你有些大厂是不在乎的啊,但是说你的技术得特别特别大的,比比其他人强才行,就是我一个很粗浅的例子,一个是大专生,一个是本科生,如果你们俩的水平是一样的,那我一定选本科。
比如说你的这个水平,一定要高于这个本科生的水平,你才有自己的竞争力,能听懂吗,所以付出自己的努力啊,有有一些大厂是并不在乎你的学历的啊,比较典型的京东阿里都不是很在乎你的技术,非常到位的情况下就可以。
厉害想知道他们的成长经历,这是逆袭,没有什么成长经历,跟着我们学课程,把基础锻炼好了就成了呀,你搞技术的,你只要把技术锻炼好不就完事儿了吗,嗯阿里学历差的别人不行吗,听不懂你在说啥。
我有好几个学生专科实践的案例,但是筛选简历根本不行吧,除非内推,我们所有的国内的一线大厂都有内推,前提,你得水平够,你不要跟我说,那我水平不够啊,我又是专科,你就得给我内推,那不扯淡吗,所以呢学历不行。
技术来凑啊,赶紧你,你如果学历不行,技术又不行,我不知道你的长处在哪里,别人为什么要看好你,多大岁数就不建议学,一般我是建议32岁,如果你还没有入行,就不建议入行,不一定对啊,这个只是个人的一个看法。
只是我现在补了本科挺好的呀,补上,我们明天明晚就抽奖了啊,今天晚上可以说报名的最后一个晚上了,大家走过路过,不要错过我们这次最大的活动,这次活动一定是他的力度,是超过咱们618的啊。
这个是给你一个承诺啊,不会比618的活动的力度更低啊,不会有科大讯飞那推岗吗,还真有啊,这个由咱们的严老师直接可以给你推进去,杨老师,原来科大讯飞出来的,他选妃本身不是个特别嗯特别牛的场子。
系列 6:P36:程序中最难调试的BUG:野指针和并发问题 - 马士兵学堂 - BV1RY4y1Q7DL
我告诉你程序之中最难调试的bug就来源于这里,程序之中最难调试的bug,一个是野指针,一个是并发问题,这两大问题是程序之中最最难以调试的bug,好解释一下什么叫野指针,野指针的意思是很简单。
同一个对象释放了两次,好这是什么意思,不能说呃,sorry,不能说,释放了两次,就是同一个对象,同一个对象,两个指针一个释放了,另外一个不知道还拿来用,或者说虽然是同一个对象,是是可能是同一个指针。
或者说是同一个指针,不同位置,其中一个七这个对象已经释放了,但是另外一个指针的另外一个位置的指针,不知道,另外一个线程里面的指针不知道好,它依然还在使用,这个是野指针,就是不再指向任何对象的指针。
这就是著名的有一个异常叫now pointer exception,呃如果你原来学过c语言,c加加语言,经常的这种东西会引起内存的崩溃,我告诉你,这是所有语言所面临的最难调试的bug。
包括java这个东西是怎么产生的呢,非常简单,给大家看看这张图,所以大家再稍微画一下,大家看这里简化一下,同学们听我说,呃,我不管你是任何的语言,假如说我们有两个指针,ctrl c trl v。
要o了要p吧,好看这里假如这个o和这个p这俩哥们呢,同时指向的是同一个对象,那么如果我们程序执行的时候,比方说我在main方法里面要把这个对象给干掉了,或者我在m方法里面把这个对象给干掉了,给他删了。
那我问你main方面的这个小o,它指向的是个什么东西啊,指向的是什么东西,java叫地址,没有指针,java叫引用,本质上就是指针,好吧,我们谈本质啊,不要谈那个那个那个你你不要咬文嚼字。
你不要学孔乙己,非得跟我矫情,回字有四种写法,这个东西没意义,理解什么意思就行好吧,玩文字游戏是最没劲的,嗯这就是这时候就变成空值了,对不对,更有甚者,你这块删了之后被别人给占了,你想想看会发生什么。
会发生,你指向了别人的对象,也许你操纵,我告诉你,你拿到了别人的这块内存里面的东西,以前啊在内存里面偷别人密码,就是这么干的,嗯好听,我说这是程序史上最难调试的bug,就是野指针。
这个指针指向了它不该指向的东西,他特别严,这个这个就叫野指针,不知道我说清楚没有,c和c加加里面呢是永远你要面临这个问题的,也许一不小心你这边删了另外一个指针,还在使用它。
也许你这不小心这边删了其他的程序,或者说其他的程序的部分内容,又又又又占用了这块空间了,那么这时候你另外一个指针指向了它,不该指向的内容,好了,我现在并没有聊java语言,我现在聊的是所有语言。
就是无论是什么什么语言,都要面临这个问题,你要正确的删除这块空间,不能多删一次,也不能不删,还得保证你删完之后,所有人都用不了,好吧,这是非常非常难的啊,我告诉你,这是第,这是第一种特别难调试的bug。
历史上这种bug呢维护起来超级超级难,你知道go语言是怎么诞生的,go语言是原来google为了替代他们以前写过的好多,c语言的程序,c语言程序写起来也许比较容易,但是维护起来超级麻烦。
bug调试起来特别特别困难,所以他们开发了go语言,go语言呢,不再用手工的方式去维护这些内存空间,而是调也跟java一样啊,引入了gc,当然这是最难调试的bug之一。
那么第二个最难调试的bug是并发问题,我觉得这个问题稍微一说你就明白,就是多线程,访问同一块儿,内存空间,如果这个并发问题,再加上野指针问题结合起来的话,你调试起来就更麻烦了,这里只是一个县城站。
完全有可能我还要来,另外,另外的一两个这个是非常有可能的,你想想看,行了,这图不太好画啊,这这图呢不太好画,缩小一点,这哥们放这边来,完全有可能发生一种什么情况,我这个县城站里面啊,也有好多好多的指针。
好,我指向了这个对象,也许是我这个线程把这对象给删了,也许是我这个线程访问的时候,我俩同时开始写,造成了数据的不一致,好了,我告诉你,像这样的问题,调试起来是最最头疼最麻烦的。
不知道大家有没有这方面的体会,当然有同学说老师我天天写cr o d,我是没有这方面体会的,那就没招了,这也是为什么你呃,你你你你你你,你不应该不能只关注c r u d的原因,因为面试里面好多好多的问题。
都要牵扯到这方面问题了,好吧,嗯所以所有的程序啊,最难调试的bug基本上就这两个,这是最难调试,一个叫野指针。
系列 6:P37:站在巨人的肩膀上:且看语言的发展史 - 马士兵学堂 - BV1RY4y1Q7DL
可以这么说,在最开始的语言的发展的历史上,都是沿着对这种bug来来来,更加容易调试的这个方向不断发展,像原来c和c加加的话,大家应该知道这种是什么事实,怎么怎么管理这块内存啊,怎么管理这个指针的呀。
叫手工吧,手工管理,不知道有多少同学是学过c或者是c加加的,有没有有的话,老师扣个一来cba里面分怎么分配一块内存,a memory allocation对吧,当然他有好多好多函数都可以分配啊。
这其中一个reallocation的意思,我就是开始诶,在我们的内存空间里面找了块内存,但是你总得释放它呀,你怎么释放free这个函数就可以把它给释放了,但是我告诉你啊。
也许因为程序里面充满了各种各样的分支,循环啊,各种各样的不同的岔路,它并不是说只有一条路线,所以只有一条路线的话就简单了,我这边分呃memory allocation完了之后呢。
后面马上就把它free掉,可是在很多情况下,我是需要判断的,在这种情况下我要把它删掉,在另外一种情况下,我不要把它删掉,我告诉你,这就造成了各种各样各种各样麻烦的bug,所以手工管理内存。
无论是c里面的memory allocation,或者是c加加里面的new和delete,本质上他这这这哥俩是一回事儿,这两段是一回事儿,都是需要你进行手工管理。
手工管理最麻烦的事情就是你不小心忘了删了,你知道吧,这空间你分配好了,但是你不小心给忘了,你把它给忘了,忘在这了,这时候会会产生什么,告诉我一下,忘记删除,忘记释放,这个呢叫memory lake。
这叫内存泄露,不要不要叫内存溢出,大哥他没有溢出,它只是泄露了,泄露是什么概念,泄露的意思就是这块空间呢虽然说留在这里,但是所有任何其他的程序不能去访问它了,不能使用它,他留在这儿,他没用了。
但是别人也不能用,这就叫泄露了,如果泄露越来越多,会发生什么,泄露的越来越多,泄露越来越多,会发生一种现象,就是当新的内存空间要申请的时候来了,我需要申请这么大一块。
我突然间发现这里面充满了一个一个洞一个洞,而且中间我找不到一块连续的内存,来为我这块内存分配空间了,完蛋这个叫内存溢出,泄露过多的时候容易产生内存溢出,但它本身不叫内存溢出,保存memory。
当然这种的还算是不是不是很严重啊,大不了我重启一下是吧,你又能跑好长好长时间,所以调优jvm调优最重要的一点叫做重启,每两周重启一次,玩过游戏吗,有的游戏是不是就这样,各位指挥官。
我们的游戏服务器将在五分钟之后启动,进行维护,在此期间不得互相攻击,good,你们已经学会了第一种调优的常用的方式,当然你不能跟面试官这么说,做过调优吗,做过怎么做的,重启面试官一个大嘴巴子给你抽上来。
哪凉快哪呆着去,这是第一种有可能会产生问题的地方,叫旺季是吧,第二种是什么,第二种叫做,释放多次就是你释放了一次,你delete了他的一次,由于有分支判断各种各方面的情况存在。
也许有可能你free了好多次,delete了好多次,这个有同学说没问题啊,这块空间我不是干掉他一次,没关系啊,我再干他一次吗,不就是尸体让我又干了他一次吗,鞭尸而已,没错你只是编了个诗的。
问题倒是不是特别大,但关键是当你干掉他第一次的时候,有另外一个人已经把这块空间给重用了,人家已经又放上有用的空间了,结果呢,你第二次回来又把人这个有用的数据给干掉了,结果另外一个线程就会发现莫名其妙的。
你发现没有,莫名其妙的,你的数据就没了,所以这是为什么说我们多线程这种bug,特别难调的,原因就在这里,你的线程好好的没bug,你懂吗,甚至说你的进程啊,如果是进程之间共享的话,你的进程没bug。
没有毛病,你的程序也没有半毛钱毛病,可是很不幸的是,由于有别人家写的bug的存在,他会很容易的把你占有的这块空间给你干掉,你找谁说理去,好了,这个叫释放多次,产生,极其难以,极其难以调试的bug。
一个线程空间莫名其妙被另外一个释放来,写过c和c加加的人遇到过吗,遇到过的,给老师扣个一,对装装备你莫名其妙的就没了没错,后来呢后来啊就是谈gc呢,开始聊语言的发展历史,我们我帮大家梳理一下这个语言呢。
c和c加加呢它运行起来的效率非常非常的高,呃但是呢它的开发效率很低,有的时候呢有的人呢是片面追求运行效率,但是听我说呃,现在呢有一些大规模的软件,它并不是追求你的开。
并不是追求你的你的你的运行效率有多高,也许你运行效率稍微慢一些,我拿那个硬件给你怼上去,我能接受,但是你的开发效率特别低,我就不能接受,别人用python语言,用java语言,用go语言写一个程序。
仨月写完了,你拿c c加加写,你写1年,等你推出来的时候,市场都没了,黄花菜都凉了,有用吗没用,所以后来产生了很多很多的,对内存管理比较友好的,知道吧,方便内存管理的语言,它方便方便在什么地方呢。
大家注意它方便呢并不是方便,在说那个多线程的情况下啊,没有不会产生什么不一致了,没有野指针了,不是这么回事,它呢主要方便在引入了dc这个概念,这里的dc呢指的是garbage collector。
garbage collector的意思是说哎我说哪儿错吗,garbage college是叫垃圾收集器,垃圾收集器是什么概念呢,我给大家举个形象点的例子,就是我们平时写写一些小程序啊。
就是在这块内存空间里面不断的分配对象,分配对象,然后删除掉,删除掉啊,再继续分配,再删除,这个对象呢有可能指向另外一个对象,这个对象的成员变量有可能指向另外一个对象,好在内存空间里面不断的扔这种小线团。
这小线团之间的建立各种各样的关联,也许它上下面有好多好多的成员变量,建立建立好多好多的关联等等,会形成一颗对象树,这个对象树呢在不断的动态的产生变化,如果站在内存角度来看这幅图的话。
这个图景就是这样子的,原来我们必须得小心翼翼的管理,说这块没用了,我就得小心翼翼的把它删掉,不能多删,不能不删,但是像这些语言,java语言,python语言,go语言。
以及原原来老早的这个list语言啊等等,他呢引入了一种gc的概念,gc的概念就是说我自己这个程序,我的业务程序我自己不去维护删除这个过程了,我只管分配,只管分配,那么就有必须得有人负责帮你删除。
不然你的内存不就很容易就被占满了吗,好我引入另外的另外的线程,另外的功能好,这个功能叫做gc,叫做gbletter,叫垃圾回收器,java python go都有这个这个功能,它的程序一起来之后。
它并不是说只启动你的业务线程,它会同时启动好多线程,这里面的线程就包括垃圾回收线程,ok这个垃圾回收器的功能是什么,就是你不用你再也不用管这个,你你你只管分配内存啊,应用写程只管分配。
垃圾回收器负责回收,当然这是一个很复杂的过程,因为垃圾回收器回收那些线条,不是你自己分配的,你怎么知道他什么时候就不用了呢,所以你首先你得首先找出来谁是垃圾,然后再采用各种各样的方式去回收它,我这么讲。
不知道大家能不能理解,能跟上雷老师扣个一,然后像这些程序写起来就比较简单,你就不用去管这些特别难以调试的bug,这些呢特别难以调试bug呢相对难难以产生,当然多线程的麻烦就在于。
不是说呃你这个指针被别人删掉了,这只是其中一种办法,多线程还在于说我们去共同访问的时候,数据的不一致性,这个了解过多线程的,应该我一说你就明白啊,并不是说他会把所有的这些问题全部给解决了。
不是这么回事儿,呃因此呢这些语言一旦诞生之后就开始流行,为什么,因为它开发效率非常高,大大的降低了程序员的门槛,java语言诞生之后很快就流行呃,原来学c的,学c加的很多都是转向java了,为什么。
因为它简单,在这个方面,起码在这方面比c和c加加简单的多好,这是这些语言的诞生,当然呃,每一种语言都有它自己的垃圾回收的内容啊,都都不太一样,我呢在我们的vip课里讲过,java是怎么样垃圾回收的。
讲过go是什么,垃圾回收的python相对简单,python就是使用的这种这种叫叫引用计数啊,它它的算法相对简单,但是讲到这儿呢,我也得朝我们我们我们是讲到了现在,从过去讲到了现在。
现在的这些语言很流行,但是呢这些语言有很大的问题,他也没有解决什么样的问题呢,就是java空指针的问题依然没有解决,你能保证你传给java的任何一个引用,它不是空指针吗,很难保证你有一个参数。
你接收过来之后,你是不是在java程序里面还得跟那判断判断啥,if你传给我的参数不等于空,怎么怎么办,就说这个你依然不能保证它是不是控制针,虽然java呢呃有各种各样的什么option啊,什么什么呃。
对于空指针的这方面管理的类啊,但是他依然没有解决这个问题,就是野指针的问题,依然会存在也指针问题在java里面依然会存在,ok,python里面go里面我告诉你依然会存在,这是第一个,第二个呢,同学们。
你们拿大腿想想看,作为我来说,我只管分配有另外一个人来帮我回收,那么他回收的时候一定会占用cpu的执行时间,一定会占用cpu cpu资源一定会的,所以它的执行效率相对低,所以我们说java写的程序。
python写的程序,go源写的程序相对于cc加加来说,你放心,没有人能超过他,他们的效率在长时间运行的时候一定会低,当然这些语言都自己都自己都会吹牛逼啊,说我java采用了g i t是吧。
just in time compiler啊,叫及及时编译器,采用了之后呢,我跟c和c加加差不多,你废话,你采用了之后就就是那么一小段程序和cc下,这差不多好吗,并不是说在比方说我7x24小时。
365天不间断运行的这种服务器程序上,你总体算下来,1年算下来和c和c加加的执行效率差不多,不可能好,第二一个呢,python那就更不提,更甭提了,go语言呢号称啊我是替代c的,所以我的执行效率特别高。
我比我比java还高,扯淡,go也有严重的这种垃圾回收器占用的时候,停顿时间叫s t w,就是我垃圾收集,垃圾收集起,开始干活的时候,你其他的线程都得给我停住,生产环境之中。
有人遇到过的go语言的垃圾回收,停顿时间长达数个小时,所以大家千万不要迷信一种语言,我呢讲东西呢,我是喜欢站在架构师的角度讲,我并不偏向某一种语言,但是我需要用某一种语言来落地,最流行的是java。
现在呢呃有一些地方在开始用购,所以呢我有讲价,我有讲够,其实站在一个牛逼架构师的角度来说,语言呢只是一个工具而已,作为一个结构结构化设计师,哈哈架构是吧,你要盖一座大楼的时候啊,这个柱子该用水泥。
用水泥,这个门该用木头,用木头,然后这个洗手台的该用塑料,用塑料啊,该用化工的其他化工材料,用化工材料呃,如果是从软件角度讲呢,你做你造一个非常非常复杂的软件,你这个地方该用c加加,用c加加。
该用python,python,该用够用够改用rust,用rust,所以我希望大家呢,在以后你的学习和成长过程历程里头,超越语言,站在一个更高的角度来考虑问题,建立架构师的思维。
你的薪水才能够做更高的突破,可以这么说啊,任何一种语言,包括这样的,包括python,你如果只是局限于这些语言的时候,告诉你你的薪水,一线城市目前差不多三五十万到头了,超过这个数的很少。
但是如果站在一个架构师的角度,他的心率会达到多少,120万以上,ok来认可老师这句话,给老师扣个一,java还没学明白,没关系啊,语言这东西呢,你就理解为它是一把大砍刀,你学会用斧子砍柴了。
下一步你就是用菜刀切肉,如果用菜刀切肉,你学会了,下一步你是用水果刀削水果,你说它很难吗,不难很类似,需要,你就是就是熟练度不同而已,好吧,所以这两类语言叫做有什么特点呢。
这类的特点就是它的执行效率非常高,但是他写容易特别容易产生bug,你得手工去管理自己的内存,好这是这类语言,这类语言是什么,这类语言是它开发效率特别高,但是你管理内存的时候。
你你你你你你呢它执行效率就会比较低,这个内存的管理上呢,它就会引用另外一个让别人去管,我自己不用管,我省了很多事好,那么有没有一种语言运行效率又特别高,运行效率超高,对标的是汇编c c加加。
不用手工管理内存,没有dc,ok恭喜你啊,现在它已经诞生了,这个语言叫rust,但是他也有他的毛病,学习曲线巨高,ok,这是rust呃,有同学非常的好奇,说老师这事儿很神奇啊,运行效率特别高。
what跟c和c加加差不多,然后你你你只管自己去往内存里头分配,就可以了,你不用管回收没有g c a哇,他是怎么做到的呢,rose没听过是吧,你罗你太落伍了啊,你是这行业混的吗。
你稍微稍微关注一点最新的技术的发展,大哥希望大家伙儿的学习叫做与时俱进,这词儿呢非常的重要啊,咱们入了这个行业,你要想不学习就能持续不断往前发展,不可能的,那就是温水煮青蛙,把你自己慢慢煮死,好吧好。
大家看这里啊,这个rest呢是比较新的一个语言,它的特点就在于这,它运行效率超高,和c和c加差不多,但是开发效率也并不低,原因是什么,原因是你不用手工去管理内存,你只管去分配就行,你不用管回收牛刀吧。
好他主要是怎么做到的呢,你想听吗,今天其实主要讲jvm的gc的,要顺带着给大家讲一讲好吧,看这里,我我告诉大家一个特别,他特别特别牛的一个概念,他特别牛的概念叫什么呢,叫ownership。
叫ownership,所有权,所有权的概念,这个所有权概念是什么意思呢,所有权的概念就是这里面的每一个值。

rust。

就是这里面的这,这这这个这个这个这个任何一个值啊。

任何一个值都归属于一个变量,就是一个变量代表一个值,一个变量指向一个值,任何一个值都归属于一个变量,然后有且只有一个,不可能有多个,这句话什么意思,我形象一点解释。
我告诉你在这张图里面我们会有多个变量哈,这叫一个变量,o是一个p是一个啊,这里o是一个p是一个,还有多个变量指向同一个值,或者叫同一个对象,在rust里面这件事情不可能发生,哈哈听懂了吗,我再说一遍。
go on的gc,z b c的一种算法,接近于它啊,类似,好大家看这里我再说一遍,重新重复一遍,就是多个变量指向同一个对象,这件事不可能发生,只会发生什么呢,同一时刻只会有一个变量指向这个对象。
这就是所有权的概念,叫做我们这个值的所有者只有一个一夫一妻制,哈哈不知道大家听清楚没有,那有同学可能就会说了,老师这有什么好处吗,来你们拿大腿想一想,小伙伴们,假如我在占空间。
任何一个战争里面的变量指向的这个空间,如果确保是一夫一妻制的话,那我这个我们叫她丈夫吧,她的丈夫消失的时候,他的妻子是不是顺带着就殉情了,听懂了吗,再说一遍,她的丈夫死掉的时候,什么时候死掉了。
还记得吗,他的妻子就跟着殉情,自动就给你回收了,你发现没有,没理解是吧,听我说还记得占空间里面它的特点是什么,占空间特点是当我这方法结束了,我这占空间就不存在了,我这方法结束了,占空间不存在了。
哎我们假设如果这个p你已经确定它不存在了,同时是一夫一妻一妻制,没有任何其他人指向这个对象,你们好好想想看我这个对象是不是可以回收了,方法结束站空间里变量指向的任何空间,跟着回收就可以了,听懂了吗。
也就是说我不需要gc,为什么不需要dc大哥,你你这边你这边消失了,我给你加几行代码,把这个里面关联的编译器帮你自动加的啊,关联的内容ok直接就给你干掉了,所以,这是rust的它的一个核心的设计理念。
rust的这个特点诞生之后啊,同时在和堆叠加了它的这种对于多线程访问的,呃,共共共共享变量,必须你得你得需要采用它特定的书写机制,才能够写得出来,它会产生了一个特别奇妙的东西,叫做你写不出bug来。
好说一下,这是rust语言特别有意思的地方,叫做,ok不知道的,不知道大家听清楚没有,你只要程序的语法能过,就不会有bug,当然他语法非常特殊,这讲着讲着怎么讲成rust了。
逻辑bug是任何语言都存在的,任何程序都躲开了大哥,逻辑bug是啥,你本来让你计算这个程序的一个人的年龄,你给计算成为一计算成为一个人的体重了啊,本来让张三娶了李四,你非得让他娶王五。
那这种bug我你这跟语言有半毛钱关系吗,是吧,所以这个语言没关系啊,咱们说语言层面的bug,rust呢消给你消失,消了很多,除了我刚才说的这个ownership之外,除了还有呢就是在多线程的这种写法。
多线程写法叫做固定的,你知道吗,你就得这么玩,你不这么玩的话,你根本写不出来,你想让多个线程去访问同一个值吗,我告诉你,你只有这种写法,你不用这种写法,你根本就写不出来,所以只要你写出来就没bug。
就是这么的牛叉,啊我不知道我大概说清楚没有啊,但是咱们今天还是还是得说回来啊。

今天并不是讲rust的,不感兴趣对啊,不敢去算了,反正你们对新的东西也不太感兴趣,我们讲老的吧,咳咳咳咳,讲这边啊好了,这是语言的大概的一个发展的历史,你要你要明确啊,现在这个语言呢大概分这么多类。
那有同学说老师那js这种东西是什么,其实这些都是带垃圾回收器的好吧,就js这些啊,还有像什么,还有还有想其他的啊,这colin等等,这不说了,他本身就是运行在jvm上的,所以他肯定是带了就回收器的啊。
还有像什么scala,就老师给你讲东西呢,我希望讲那个层面太低了,我希望你站在更高的角度上来教你认识啊,就整个一个it界的一个发展,还有呢整个语言上的语言层面上的一些东西。
你站在更高的一个角度上建立起来,你的知识体系。
系列 6:P38:JVM的GC历史 - 马士兵学堂 - BV1RY4y1Q7DL
rust有啥缺点,rust缺点就是学习曲线居高嘛,特别高,好同学们讲太多了是吧,嗯已经九点了,what确实是啊,我们来聊聊那个jm的gc的历史啊,疲惫了是吧,嗯a了,已经疲惫了,不会吧,你们还活着吗。
我们可以继续吗,这还没开始dc呢,没开始就没开始吧,就业咋样,就业不怎么样,因为rust刚刚发展,我们静观其变,我是喜欢让我们自己的学员,都站在业界的最前沿,就是你要抬起头来看看整个行业发展。
站在整个业界最前沿,你就能发现更更加优秀的机会,发展机会的时候,你能扑上去啊,做好准备,好看这里我们来聊聊gm的dc的历史啊,就这块的内容呢,我稍微补一点最基本的这种技术上的概念,我们先来说呢。
到底什么是一个垃圾,就是我们刚才说嘛,如果是你呃,采用这种引进垃圾回收器的,这样的一些个语言的话,那你你总得找出来,就是业务线程在这里不停的扔线团,扔线团,扔线团。
线头和线条之间的有各种各样的线来进行关联,好作为垃圾回收线程的角度来说,我得去定位啊,这这这这到底哪个是垃圾,哪个线程是垃圾啊,怎么找啊,这里面的找法呢一共有两种啊,这什么是垃圾,我们先定义什么是垃圾。
这垃圾呢其实很简单,就是你看这你看下面这个对象,这个对象呢在运行的过程中,没有任何引用指向它了,原来的一个成员变量的引用指向它现在没有了,好这哥们就是垃圾是肯定的,没有人没有引用指向它的,好。
它就是垃圾,但是我们怎么定位这个垃圾呢,定位这个垃圾的话有两种方式,第一种呢就是reference count,你看一下,看一下动画就理解,就这个对象呢,我给他做一个计数引用计数法,这叫有三个。
目前有三个引用指向我,我脑袋脑门上写了一三啊,接下来如果有一个已经消失了,变成二,有一些用消失变成一,有一个消失变成零,当它变成零的时候,这哥们儿成为垃圾,python就是使用这样的方式。
这个叫引用计数法,引用计数法有毛病,毛病在于哪呢,我们假如说有一堆垃圾,三个垃圾a指向b b指向c,c又指向a好,所有的对象都有引用指向,但是没有任何其他的引用指向,这三个对象中的任何一个啊。
这叫做三个垃圾,一堆垃圾,一坨垃圾,那么像这样的话,如果你用reference count的方式就找不出来,因此java里面采用的并不是这种方式,怎么定位一个垃圾,java里面采用的是这种方式。
叫做根可达算法,叫做research,这算法一说你就明白根可达算法的意思是,我们从根儿上开始,什么叫根may函数里面,简单理解may函数里面的一个一个变量,这就是根儿就没函数,通过这根线来跟着捋。
捋到谁谁就不是垃圾,它的成员变量又指向了它,它的成员变量又指向它,又指向它,又指向它,好,这几个全部是垃圾,顺着这根线找,找不到谁的时候,树的搜索算法找不到的,这些全是垃圾,这个大家能听明白吗。
有没有同学有疑问的,循环引用不能把引用断开吗,人家业务逻辑就要循环引用,你为什么要给人断开,你断开人家业务逻辑不变了吗,大哥,当然大厂面试的时候呢,有一个问题叫做什么是根儿啊,如果要讲这些细节的话。
我我倾向于讲东西呢是先从很高的层面来讲呃,我建议大家学东西,学学课程也是一定是要什么呢,先建立知识体系,这件事情超级重要,有很多人呢连最基本的学习方法都不会,可以说啊,从小学到大学学了这么多年。
最基本的学习方法没学会,一定要先建立知识体系,然后再去查漏补缺,我讲的再形象一点,你掌握一棵知识树的时候,先把树干给我掌握了,然后再去掌握树枝儿,然后再去找我书页,你的树干和树枝子。
你看你的树干只要是特别稳固的话,你树叶想刮多少刮多少,现在很多的碎片化的学习,都是让你掌握书页的知识,你掌握了多少书页都没有用,因为你没有建立整个树干的体系,了解一个庐山,你得坐着飞机从上空飞过。
看庐山的整个面貌,而不是说你到庐山脚下某一棵树底下,去研究庐山的蚂蚁窝,这种纯属扯淡,听我说我上了这么多年学,我记得我上大学的时候,有一个学期把清华图书馆所有的物理书,那藏书很多的啊,大概得有几万本一。
一个学期我全把它全把它看完了,当然没记得多少,但是整个物理的体系慢慢就建立起来了,呃小伙伴们,你们呢如果不同意这个说法的话,我不管你同意不同意,你采用一下,你试试看,就知道要先要先建立知识体系。
听懂了吗,建立知识体系之后,再去研究那些细节好吧,知识体系的建立呢就是囫囵吞枣,四个字叫囫囵吞枣,有好多人学东西啊,特别好玩呃,他在学习的过程中,假如说这是一棵知识树嗯,他在学习的过程中。
他学到某个节点的时候,它会顺着啊,就每一个细节,比如说别人给他讲dos窗口,你怎么设置环境变量啊,咱们学java的人一般都会遇上是吧,怎么设置环境变量,怎么设置pass class pass。
他就开始研究哇,这dos挺好玩的啊,这dos还能写b a t这这这这个b点,这这脚本语言的啊,我研究研究这个脚本语言怎么玩吧,然后啊这道德窗口怎么产生的呢,研究显卡行行行行,哎呦哎玩玩ps,我跟你说。
完蛋,你要这么学,你的时间就全部浪费,没有用,而是你应该怎么学呢,先二话不说,把整个这些关键的点全拿下,拿下之后呢,再去发散,再去纠细节,我大概就是这意思好吧,嗯那就是想先看完本书呗,行行行。
你这个理解能力我也是醉了,看来我还是我表达不够啊,sorry,好我讲到这儿呢,我是希望大家呢先把这个什么是根,这件事呢先略过,不要着急,因为如果作为,呃官方的非常规范的定义来说,你得去看哪本书呢。
叫jvm,叫java virtual machine specification,那这本书呢是在oracle网站上可以下载,它的全称叫做jvm的虚拟机规范规范大哥,他很枯燥的。
也只有像老师这样特别无聊的人才会去读他,其他人你不用读,所以根来说这本书上给你说的非常明确,它包括这么几部分内容,jvm stack的内容,stack jan native method stack。
又是jan runtime constant prove,运行时常量常量池,steady reference in method area,方法区里面的静态引用,以及我们的class类的对象。
这里面的任何一个拿出来,你不了解jvm底层,直接就把你给看晕了,所以你不用管根嘛,我给你举个最简单例子就行了嘛,main方法里面的有一句话叫object小o等于new object,好。
这哥们就是格听懂了吗,很简单,就是方法整个程序开始执行的地方,最先建立起来的那些对象,这些哥们儿叫歌叫root,专业说它就是gm stack里面的内容,stack站里面的。
我们那边方法里面不是为我们县城站吗,主线程站,对不对,这里面对象get了吗,好我们可以继续吗,先把它略过好不好,所以从根上开始找,本意就是从根上开始找,反正是顺着根儿捋捋捋。
就是我我还是喜欢讲的稍微形象一点啊,形象一点就是你比方说你嗯,你女朋友,你男朋友啊,你们哥仨,你们姐仨啊,甭管是哥仨姐仨,在一个空间里面,内存里面扔小线团,谁是根儿啊,你们仨就是根儿。
你们的手捋着这个小线团,捋到的全都不是垃圾,凡是捋不到的,中间那个线给断了的,全都是垃圾,就这意思,这样的话呢,你就不会给产,就是那种原来像这种互相引用的,但是哎你顺着根,只要找不着他,这根俩就是垃圾。
知道吧,这是第二种算法,叫根可达,非常简单啊,当我们知道了什么是垃圾,当我们定位了什么是垃圾,定位好了之后呢,我们要把它给清掉,对不对,好清除算法从上个世纪60年代开始发明的,到现在为止,几十年过去了。
就这三种清除算法,就这三种,这三种是啥呢,第一种叫mark swift,第二种叫copy,三种叫mark contact,背包就行了,特别简单,仔细看,第一种叫mark sweep,就是我找到了标记标。
把它标记成为垃圾之后,把它给清掉,就这么简,原来ok这哥们是垃圾了,怎么办,打上个标记,说这块空间可用了,可以可以使用了,后面的人可以在这里面分配内存了,搞定,梦洁说什么情况,根部可达,没想出来。
我的老天爷呀,梦洁你是玩语言的吗,object o等于new object好,这里有个小o指向它,我写o等于空来,你告诉我这个o指向谁,这个引用还有没有,贝儿,让我忍住怒火,继续给你们往下讲。
开个玩笑啊,嗯总是有2年没睡了,开玩笑开玩笑啊,我们回一回的气氛,听课听着怪累的,稍微聊会儿,小甜甜k好,我们来看这个标记清除啊,要清楚的意思就是诶我们简单说吧,我们顺着根开始找,找到的全都不是垃圾。
这些找不着的全是垃圾,怎么办,把它们清掉,哎,这就叫标记清除,简单吧,就这么简单嗯,找到的这些全都不是垃圾,没找到这些全是垃圾,怎么办,清掉咔嚓咔嚓清掉好标记,清楚标,清除这种算法嗯,虽然说比较简单。
但是有它的毛病,毛病在哪呢,当我们好多好多次运行,运行很长时间之后,你会发现这也有清掉的部分,这也有清掉的部分,这也有清掉的部分,这也有清掉的部分,你会发现你的内存变成了碎片化,特别严重。
碎片有好多有好多洞,然后这时候你要是想来了一块大的空间,我想分配下去,你发现你找不着了啊,碎片化特别严重,好嘞,当然呃,第二种算法没有碎片化,但是也有它的毛病,第二种算法叫拷贝,拷贝也特别简单啊。
认真看,其实啊就很简单,不管你们家多大,你们仨只能用一半,你女朋友你男朋友好,在里边玩吧,随便玩随便折腾,折腾完了之后呢,我的垃圾回收器进来了啊,你妈妈拎着一把笤帚就进来了,他进来之后干了一件什么事呢。
顺着你们仨开始这根开始找找找找,找出来的东西,整体性的全都复制到另外一半里面去复制过来,同时排列好,看到了原来那个没排列好的哎,都给它排列好,然后把左边这半边整体性的全部回收,ok这个算法也简单。
效率越高,但是我相信你那大腿想一想,也应该知道他的毛病之所在,还用我说吗,浪费内存,没问题吧,很简单啊,我们在聊第三种叫my compact,my comment,什么意思啊,这就更简单了。
就是既然第一种呢碎片,第二种呢浪费内存,干脆呢我就在回收的时候直接把它整理好,什么意思,再说一下你你女朋友,你男朋友好扔小线团,然后运行的过程之中呢,产生了各种各样的垃圾,当我在回收它的时候。
我顺带着把内存整理一下,整理成什么样的,整理成排列的,整整齐齐的排排,坐吃果果,你们仨在这后面的,有用的,在后面跟着好,剩余所有的空间都是可以用的,very good,这叫标记整理,叫标记压缩。
这种算法也很形象,就是你的你的硬盘的碎片化整理嘛,他也没有这种内存的碎片化,它都是连续的空间,但是问题就出在效率很低啊,它是这三种之中效率最低的好,一共就这三种,从上个世纪60年代开始到今天,我告诉你。
就这三种,没有别的,不知道说清楚没有,这块有疑问吗,很简单吧,听我说,所以呢,看这里啊,就这三种算法呀,我的中文呢中文,就这三种算法都有毛病都有毛病,就是说你要是把你的内存当成一整块的时候。
无论你采用什么样的算法,都有它自己的问题,所以垃圾回收器非常聪明,它呢是用这三种算法综合运用,然后同时对内存进行了划分,产生了各种各样的不同的,形成自己个性的垃圾回收器啊,妈妈你爸爸爷爷奶奶。
叔叔阿姨都可以帮你来进行垃圾回收,但是每一种都有它自己的特点,好同学们,下面我们看垃圾回收器总的图,垃圾回收器的总图,未来放在这儿啊,好那这是垃圾回收器的总图,那么大家听我讲啊,这垃圾回收器总图呢。
在jvm从jdk一点零诞生到现在,jdk 14从一点到14,一共诞生了十种垃圾回收器,这时钟垃圾回收器,我一会儿呢沿着历史我慢慢给你捋出来,你就理解了,这时钟来机回收器它到底是怎么玩的了。
每一种的特点是什么,好我们先来把它背过,有同学说老师你这个东西要背过吗,没错你跟面试官想吹牛逼,或者你想把他吊起来打的时候,你就把它给背过,但是它也不难,这几种垃圾回收器呢,你我你先花个几十秒。
先大概看一眼,分成什么呢,分成是把内存分成两部分的,以及把内存分成多部分的,好看这里前面这六种是属于内存分带模型,后面这三种呢属于内存不分带,但是g one呢它逻辑是分带的。
econ是一个特别好玩的垃圾回收器,叫做他是他是什么都不干的垃圾回收器,好听我讲,我一个一个啊,今天是已经9。20了,没关系,我一个一个的给你们捋清楚,好吧好。
系列 6:P4:10种垃圾回收器(二) - 马士兵学堂 - BV1RY4y1Q7DL
一点区是正方形区域吗,服啊science我我我我给你写一个大写的服嗯,我再也不背的时候撒尿了,唬你开玩笑啊,大哥他内存的区域啊,逻辑上的嗯,你可以认为是正方形的,也可以认为是长方形的,矩形的好不好,对。
和站说一下战局部变量,对new出来的对象,好了我们可以继续吧,来可以继续,同学给老师扣一哈哈哈,反正听不懂的同学们先囫囵吞枣听下来,因为你们听不懂,最关键的是因为基础不到位,连战和堆没搞清楚的同学。
这个课呢你今天可以撤了啊,两分钱就等于白扔了,嗯ok好嘞,为什么是八比一比一统计结果你自己可以设,你要愿意可以设,十比一比一,随便你,t v b先进先出还是怎么弄的,t v b是用来分配空间。
它又不是站,它跟先进先出有半毛钱关系吗,这不是不用出,ok ok好嘞好嘞,我们可以继续了吗,嗯好好看这里啊嗯嗯所以呢,由于年轻代和老年代啊,他的那个他他他他他装的东西也不一样啊。
他的这个适应的情况也不一样,算法也不一样,所以呢呃在真正的垃圾回收器组合的时候呢,它会采用不同的组合呃,分类模型从最早开始一直到现在啊,大概产生了六种,在物理上分带的这种这种垃圾回收器。
这个垃圾回收器呢呃我讲起来特别简单,它里面是可以进行各种各样组合的,什么叫做组合呢,就是这次这块撒呀,都是在年轻代回收的,这哥仨呢都是工作在老年代的,那么他们两个呢肯定要进行组合,每每个年代里头有一个。
对不对,那每个年龄有一个什么样的一个组合呢,凡是我画的这些线的地方,全都是可以进行组合的,但是啊听我说这些组合呢非常的复杂,但是但是你听但是就行了,但是往后的一般都比较重要,很简单,常用的组合就三种。
123好吧,就这这这哥俩经常配合,这哥俩经常配合,哎,这哥俩经常配合,对7月与安生是吧,那个嗯路路路路路遥和马力好吧,嗯还有谁嗯,李李李小璐和p p p g one,pg one等等啊,不管总而言之呢。
他们进行互相配合,好jdk一点八默认的这哥俩你给我记住就行了,这边俩叫啥叫parallel,scavenge以及paralleode,总而言之都是parallel,那好到现在呃,我们我们我们继续。
我来给大家解释一下啊,就这几个垃圾回收器,它的一个特点是什么,其实都非常简单,真鞋子呢都在那个j8 虚拟机规范里面都有,那这个垃圾回收器呢,最常用的最早的第一种呢叫做cereal好。
第二种呢叫做parallel,第三种呢叫c m s,这几种呢是在在在在分类模型里头啊,它是一个逐渐的演化的,好我在这先说一个结论,听我说为什么会诞生这么多的垃圾回收器,为什么会诞生这么多。
是因为随着内存的变大,不断的要满足对于垃圾回收器的要求,好这句话的最关键就在于随着内存越来越大,听我说,所有的单机回收器的衍生过程,都是随着内存越来越大,什么叫内存越来越大,哎最开始java诞生的时候。
那时候机器大概就几兆内存,到现在呢上t的内存,它的算法一定是不一样的,你在这个你的内存区里扔线团,扔线团,扔线团,你原来呢就你们家一个小床,这么大个啊,你你你你朋友,你男朋友就都都在床上扔来扔去的。
非常的面积非常小,一进来之后很容易就清掉了,可是后来呢你们开始闹大了,往天安门广场里扔太大个儿了,那我算法还能一样吗,不一样肯定不一样,所以我先说一个结论,就是随着内存越来越大。
诞生了这些不同的垃圾回收器,把这个结论先记住,内存比较小的时候用的垃圾回收器,这是内存最小的时候用垃圾回收器,这个垃圾回收器叫什么呀,这个垃圾回收器叫serial。
当然他工作在年轻代就叫serial young,他工作在老年代就叫serial,old serial的意思,读一下,看能不能读懂,看能不能读懂,嗯大家。
it's done the world coping collection,which uses a jsingle disathread,首先这里面有几个单词,第一个呢叫not the world。
世界停止copy collecture,用拷贝的拷贝算法跟他们分析过吗,八比一比一的拷贝嘛,这里面的拷贝过来拷贝过去,拷贝过来拷贝过去,which uses a single,好,这是关键。
单线程single jc thread gc是一个线程,这个线程只有一个线程,它叫做cereal,所以用图来表示的话就超级简单了,这是你的工作线程,这是你你女朋友,你男朋友在这里不停的扔小仙桃。
玩着玩着就满了,床上满了,怎么办呀,你妈妈进来,你们仨都给我听,从顶上给我站着去,下面由我来工作,他做什么工作呀,清理把该清的东西给你,清,完了好,你们仨继续,什么时候又满了,又进来了,停。
好到我工作垃圾回收机工作,你们仨继续就这么循环往复,ok为什么叫stop the world和这个词呢,在gc里面非常常见,叫s t w简称你在网上读,或者跟你的面试官去沟通的时候,别人说s t w。
你一定要理解是啥意思,为什么它叫s t w呢,是因为垃圾回收机工作的时候,你的工作线程不能干活都得给我停止,所以它叫做stop the world,我感觉是单线程,那co呢还用我说吗。
它叫做a rock the world mark sweep,或者是mark compact collector that uses single gc threat,工作在老年代里的哈哈就简单。
那么大家你拿大腿想一下啊,你们家这个地儿啊,小点的时候还行,你慢慢一个进来,一个人跨机也清理完了,马上你们就可以继续了,但是你家地儿越来越大,你们家地现在也是已经变成3百米的啊,3百米宽度的大别墅嗯。
300x300的大别墅啊,你你你你你们仨在里边扔扔扔扔扔,扔了好长时间之后,扔满了,你妈妈进来好,stop the world,然后他开始清理,你说他得清理多长时间,原来清理一秒钟就够了。
这次一小时以上,才能清理完,那这个时候你们呢大大腿想想,程序会呈现一种什么样的状态,就是你的应用程序,如果你的内存特别大,沾满了,需要stop the world停止,然后进行垃圾清理。
程序会呈现一种什么状态啊,作为用户来说,看上去你的程序就跟死了一样,半天不响应卡顿,所以随着内存越来越大,我想让你来设计,你肯定也能想出下一步怎么怎么优化,来怎么优化呀。
就是你原来一个人我能不能排多个人嘛对吧,所以就诞生了paralyscaveng proof scanders,叫做is dp,the word copy collection with that。
which uses multiple gc threats,读一下,所以他跟那个single的区别,它跟sera的区别,唯一就在于这module还多线程,嗯你爸爸你妈妈对你男朋友的爸妈。
女朋友的爸妈要进来都帮你,都帮你们清理,ok我清理来清理去,当然paralyout也不用我解释了,他说a competing elector uses mul,应该不用我解释了啊。
那现在我问大家一个问题,我的这个垃圾回收线程能不能无限制的加下去,我内存越来越大更大了,操场那么大个儿知道吗,我能不能跟我说加好多好多的垃圾回收线程,能让我的清理速度变得更快,可以吗,绝对不行。
这个问题其实就在于是不是线程越多,它的效率就越高,不是那么回事儿对吧,因为当线程数超过一定数量之后,作为管理者,作为cpu来说,他会把大量的精力花在线程切换上。
线程切换一般我们称之为叫context switch,上下文切换,当然这个概念你要不理解的话,你就想想你管两个人的时候,他们俩干活的时候,你能管的过来,你你管2万人的时候,你要想让每个人高效的工作。
我跟你说累死你了,就所以这是线程调度,他就把大量的工作,使效率的这个资源啊都花在这个调度上了,所以它的效率反而不高,因此在你的内存越来越大的时候,它依然会产生大量的卡顿现象。
这个卡顿呢是在尤其是我们线上系统,多数线上系统所不能容忍的,你不能容忍说你在那玩游戏呢,游戏服务器java写的,你一个子弹打出去,你搁那卡半天,为啥,因为垃圾回收器在回收,这玩意受得了吗。
所以好多好多的游戏服务器,游戏服务器的游戏领域,其实我跟你说,真的好多服务器都需要进行认认真真的,参数的调整和调优嗯,那有同学可能会说,老师他这个万一有了毛病,我我调不过来怎么办。
所以今天我刚才有同学不是讲实战吗,今天我先教你调优嗯,最牛逼的内容啊,这个调优呢最基础的内容哎,就是,好大家学会了吧,有同学说哈哈,这样也可以吗,你们玩游戏的时候,有没有遇到过各位各位指挥官。
那个五分钟之内呢,我们要有服务器进行进行进行维护啊,你们你们不要互相打,来,开玩笑啊,好那呃,当然这种呢不是解决问题的根本之道,解决问题的根本之道在于它c m s好,下面我重点来聊他c m s。
这也是面试的一个小小的重灾区吧,面他的挺多的,为啥呢,因为在g g one没有出现之前,我告诉你,你要想用那种响应比较快速的这样的呃,一个一个程序啊,响应比较快速啊。
没有这个s w时间特别短的这样的一个程序,你还你还只能用它,用不了别的嗯,他是一个承上启下的这么一个垃圾回收器,我一会儿再打一听,好吧好,我们稍微先把前面的简单复习一下啊,就是内存特别小的时候分带内存。
那么这时候我可以用serial和co的组合,当内存烧弹,我可以用para svp s p o的组合,这也是1。8,默认的就是它,那么当呃内存越来越大,我的响应时间要求越来越响应越来越快的时候。
就是你想响应时间要非常短非常短,就必须有响应,这时候怎么办呢,在g one没有出现之前,我们可以用谁用pu和cms好,我们先说什么叫判定panel是个什么东西呢。
pu的意思其实就还是那个parallel啊,pu的意思是parallel,new parallel,它依然是一个parle,你看他那他的那个那个那个是原封不动,在树上摘摘下来的dp。
the world coming collected usc thre,他跟那个p s p o啊没有半毛钱区别好,下面也说了区别在什么地方,他说it defer from para。
para savage in that,is enhancement that it makes you usable with the cas,什么意思呢,就是这哥们儿是专门发明出来和cms配合的。
所以呢cmc的重点,原来的那个p呀和cm s配合不好配合怎么办呢,哎专门发明出来一个新的,也是parala scale venge的一个算法差不多,但是呢有一些详细的小小的参数上。
和cm配合起来非常方便,这个叫他new,超出大部分互联网公司用的是c m s吧,no现在大部分用的都是他,我先说一个结论,所有在座的诸位啊,我不是单独指某个人啊,是说在座的所有人断水流,大师兄说的是吧。
嗯是说在座的所有人,凡是1。8的,现在优先推荐的g one,有同学说为什么推荐g one呢,听我说c m s呢叫做承上启下的,它叫做并发的垃圾回收器,前面不都是单线程的,多线程并行的,还有这种叫并发。
我一会给大家讲并发的概念是什么,但是c m s呢由于它是一个承上启下的,然后他有好多好多的bug和毛病,所以最终就会诞生一个什么现象呢,就是c m s居然不是任何一个jdk版本的,默认垃圾回收器。
就是你必须得手动手动设置它,你像1。8默认是什么p s p o一点九呢,默认g one,但是呃你有没有哪个版本是默认cm的,no没有好,我们我们来聊,我们可以继续了吗,可以继续的给老师扣一大个态度对。
但是他很重要啊,他非常非常的重要,虽然他bug有点多,但是他非常非常的重要,超级重要啊,因为他是一个承上启下的,你不理解cm s。
系列 6:P40:GC的演化过程 - 马士兵学堂 - BV1RY4y1Q7DL
好我们先把这个故事讲清楚,随着内存大小的不断增长而演进,我们大概明白了什么叫做分类算法,对不对,在明白了大概明白了什么叫分带算法之后啊,我们来看看像这个图是先不不跟你们讲了,这图要讲起来就没完了啊。
好看这里你不要讲这一节课,把所有细节全掌握啊,大哥我这讲了好几十个小时的课,你非让我一节课讲完,那也不可能的,好看这里啊呃从内存特别小的时候,内存很小啊,这java刚诞生的时候啊,那会儿内存特别小。
大概就几兆到几十兆,就就就这么少啊,我记得那会儿八兆八兆内存是吧,几兆到几十兆内存,几兆到几十兆,这样一个内存这个内存啊,他的那个采用的垃圾回收器呢就叫做cereal,这cero特别简单,我稍微给你说。
你就明白了,你看这里有个根据jvm,就是java虚拟机规范的定义,cereal是什么呢,叫做stop the world coping collector。
will use this single githreat,说实际上是读一下来要做stop the world,stop the world,世界停止这个词呢叫s t w s t w这个很重要。
你记住这个词以后,就说s t w不要跟人说世界停止,或者说什么什么什么什么乱七八糟的,不要不要这么说,就直接说s w专业显得你特别专业。
ok copy collector would use the single sig sathread,使用了一个单线程的gc gc线程,形象一点形象一点是姜子的姜子低,你们哥仨,你你女朋友。
你男朋友好,在里边扔线团,扔到一定程度满了满了怎么办,好,这哥们儿是工作在年轻代的,满了满了咋办,很简单,你慢慢进来了,哪里来的一根扫帚来了之后的第一件事,你们仨给我停,stop the world。
业务线程全给我停止,停到我了,你们仨给我停住,不许再动了,不管你什么什么姿势,什么什么什么动作不许再动了,因为我要清理垃圾了,接下来你慢慢就顺着你们仨捋捋捋捋捋,捋到的这些全都不是垃圾。
把那些垃圾全都清清除掉,清完了之后说你们仨继续go on,等你们仨又玩了一段时间又满了,怎么办,你慢慢又进来,king stop,然后等他清完,你们仨继续听懂这意思了吗,就一个线程对。
这就叫s t w叫stop the world,进来给我停止,停止之后,垃圾回收器干活,由于他工作的年轻大,所以它叫做拷贝,collector使用了单线程,一个线程就够了,为什么一个线程就够了呀。
为什么有电流就够了,很简单嘛,因为内存少啊,空间特别小,年轻代是这样的,老年代也是这样的,老年代也是单线程,等年轻代回收了很长时间,老年代占满了,产生负利息的时候怎么办,也是单线程,你妈妈又进来了。
他这时候老年代的叫做stop,the world must be compared collection that uses a single dc thread,依然是单线程。
只不过他这时候工作的老年代,因此他的算法是标清楚或者标记压缩,或者标记清除完了,这之后碎片化过于严重了,怎么办,进行压缩可以了吗,同学们很简单吧,来可以继续的给老师扣一,这就是serial的算法。
ok所以这张图啊,我们翻过头来再看图去哪儿了,你看我一下就把这哥俩给讲了好,这是常用的组合,那么下面我觉得我都不用怎么讲,你就明白了,下面叫什么叫parallegvg,这句话什么意思呢。
就是当你的内存越来越大了,同学们内存越来越大,几十兆到上百兆,甚至到一个g的时候,这个没有一定之规啊,就是他跟你的业务是有关联的,什么时候你觉得业务不好玩不好使了,我告诉你。
你这个时候就得考虑所谓的调优,第一步换垃圾回收器,这种垃圾回收器不好使了,同学们,你们想想为什么内存变大,单线程就不好使了,很简单嘛,你原来啊你们家三平米,你妈妈一个人蹭蹭蹭两秒钟就扫过来了,没关系。
停两秒没关系的,很多这种业务啊,暂停两秒钟,卡顿两秒钟,没关系的,可以接受,或者几几十个毫秒就扫过来了,没关系啊,可以接受啊,没有问题,所以在这种情况下,你单线程就完全没问题,但是你们家现在变大了。
你们家现在是100个平方,100个平方,你妈妈一个人要清理过来,清理一次性清理100个平方,要清理多长时间,太长了,半小时,妈呀有没有人能够忍受半小时你的程序不动,你们现在正在进行双11秒杀。
用户下单之后,突然间半小时不动,你的服务器没想要,为什么没想要,因为你们哥仨是不是都在那s t w,都在那蹲墙角呢,听懂了吗,所以这时候单线程不够不好使喽,拿大腿想想优先采用的解决方案是个啥呀,同学们。
多线程吗,parallel,这种叫parala,叫并行,多线程并行,多线程工作在年轻代叫做parallel scavenge,工作在老年代叫parallel old,如果用图来画的话。
就是最开始是你们哥,你们你们哥仨在这里工作,突然间满了满了怎么办,你妈妈,你爸爸,你姥姥,你姥爷一块进来,你们仨给我停,然后他们四个一块儿干活儿,迅速的帮你清理掉整个的垃圾来,你们仨继续周而复始。
这就是cereal和serial,old palace,cavenge和paralleo,它的玩法,讲错误了吧,哪里哪里错了,你说出来,你错了,孙恒达,palace gavin,paralleo。
这哥俩的组合,这是经常用的简称,ps加po肯定我还没讲,你着啥急,我告诉你你你们你们生产环境里头啊,我告诉你1。8,如果你们生产环境用的1。8,你没有换过任何垃圾回收器的时候,恭喜你。
你的默认垃圾回收器就是这哥俩,请你给我记住他,他叫做p加p o叫palace gavage,叫paralo,那有同学可能会说,老师我怎么知道我用的是哪种垃圾回收器呢,严格讲这是明天我要讲的内容。
但是今天呢既然你们问到了,就稍微给你们说两句,可以说两句吗,文章来说,你只要敲一个指指令就可以,什么情况。

java装xx。

当然打一打打打一程序,或者带个version,好这里呢他会把呃你java虚拟机启动的时候,默认的那些个参数全给你列出来,注意看这里面有个参数是什么,叫做use parodic,看了吗,来看一眼。
这是你java启动的时候默认带的参数叫做什么,叫做use parallel c,唉,那有同学可能会说,老师这个use parallegc到底是个什么东东呢,放心像老师这么体贴的难言。
肯定给你做了笔记了是吧,好use paralledc是个什么东东嘞,你找找看找找看,我记在哪了哈。

here,这个use paralledc呢指的是ok,就是parallecovenge和paralleo的组合好了,我们可以继续了吗,可以继续,老师扣一来,然后这个笔记在哪呢,我今天稍微给大家调整调整。
好到现在为止你们听起来应该相对比较轻松吧,也不太难吧,因为你先建立比较轻松的整体性的树干,我们再去追究那些树叶子,还那时候你就轻松好多,ppt给不不给好,我刚才讲了两种组合了。
第一种是cereal的组合,第二种是parala的组合,调优的话呢,我明天给大家讲讲这块怎么调优,因为jdk一点八,只要你没改过,就是这哥俩好吧好,我们继续随着空间越来越大,现在不是几十到上百兆1g吗。
现在空间变得更大了,现在是一季或者几十道到什么呢,到几10g,数十记好,我告诉你啊,到数十级的时候,你会发现,无论你怎么玩,你采用多少个人来啊,你说我采用我调一个团的人来来帮我,parallel吗。
原来原来只有一个,后来我把它变成n个多个,四五个四五个不够使了,我来我来四五百个行不行,我来1万个行不行,这里面就牵扯到一个操作系统的最基本的概念,就是县城是不是越多,它的效率就越高,是不是线程越多。
效率会线性提高,是这样的吗,不一定,明明确说县城到达某一个阈值之后,它的效率反而会降低,原因是什么呀,原因又回到了这张图,刚才我看最开始我讲这张图的时候,老师就就就就就同情,不是说老老有这张图没错。
原因就回到这,又回到这张图,为什么,因为一颗cpu的核或者一核的cpu,同一时刻只能执行一个线程,假如我们有16盒,最多在同一时刻能执行16个线程同时执行,哪怕你使用线程撕裂者啊。
最多也就是说四核八线程,八核六线程,总而言之它是有数的,就算是你16个线程同时在运行,那么你这个时候派了1万个线程过来,你猜猜看会发生什么,会发生排队和切换,什么意思呢,就是我这1万个县城。
我每一个都要让他有执行机会,我怎么办呢,我就执行,你一会儿执行他,一会执行你一会儿执行他,一会儿在执行你的过程之中,把你拿走,把它拿进来好,这个过程叫做线程的切换,线程切换本身也是需要消耗cpu资源的。
如果线程数量特别多的时候,上下文的切换,context switch,这是它的专业名词,好线程切换的所占的资源,就超过了县城本身运行所占的资源,所以cpu会把大量的时间用在线程切换上。
它的效率反而会降低,不知道我说清楚没有,一一个厕所只有八个吨位,最多有八个人往里蹲,在里头蹲着,后来来了8万人,你猜怎么着怎么办,cpu就把这8万人排好队来把你拎进去,顿时十个毫秒把你拎出来。
换另外一个,注意你们哥几个排队协调这个资源,cpu也得管着,所以cpu会把大量的精力浪费在这个上面,因此不是人数越多越好,所以在在你到达一定阈值的时候,到达啊,好几十个g的时候。
我告诉你你再增加多少个线程,没有效率提升不上去了,这时候怎么办啊,这时候就诞生了惊天地泣鬼神的,concurrent的玩法,concurrent垃圾回收,刚才这声音有点太君的味道,太太太,你个头啊。
佘太君吗,是佘赛花吗,这个叫做concurrengc,我告诉你,垃圾回收器里面有哪些是concurrendc呢,here著名的承前启后,继往开来。
历史青史有名的cms concurrent mark sweep,以及和他配合的朋友好,继续,替代cms的g one,后面的z dc,后面的shinda。
这些所有的后面所产生的全都是concurrent,concurrent,好我们先来说明什么叫concurrent,那到底什么叫concurrent呢。
concurrent的意思是是这个here concurren的意思,这个concurren的意思是说,当我垃圾回收器干活的时候,你的业务线程可以继续,what这叫concurrent,知道吧,并犯。
所以所谓的并发,指的是gc线程和垃圾回收线程啊,sorry,gc线程垃圾回收是一个gc线程和业务线程,我主要有没有看你们认真听讲,gc线程和业务线程可以同时在运行,原来都啥样,原来是gc一运行。
业务线程就得给我s t w都得给我停住,stop the world,现在不需要了,现在没关系啊,咱家特别大,已经变成500个平方一栋别墅,你们姐儿仨在里边玩,随便玩,你们的你们在旁边玩着啊。
我们我们这个妈妈爸爸爷爷奶奶姥姥爷,作为摄像师哦,sorry,作为垃圾回收者,就在旁边捡你们玩出来的这些垃圾啊,你们别玩,我们边边捡垃圾,边玩边捡垃圾,你们随便扔了,那这时候就会产生一种什么现象。
这时候产生的现象就是,我的应用程序永远有响应,为什么,因为我业务线程在这里跑着呢,我当然有响应了,所以这是concurrent的本质,你不知道我说清楚没有,来,能get到这一点,同学老师扣一。
当然这里面就会产生各种各样特别麻烦的问题,同学们,你们想想看,我我我往这边一边扔垃圾,你这边一边捡,万一我扔一会儿你呢扫描完这个对象说啊,这个对象是个垃圾,但是万一我一会儿又把它给捡回去了呢,对吧。
他又不是垃圾了呢,你把它清掉不就完蛋完蛋了吗,而且最重要的还有还有一个叫做万一,我比如说我我我我我我我本来这个对象呢,你扫描它不是垃圾,但是我玩着玩着,我已经把他的连线给它剪断了,它又编程垃圾了呢。
你又怎么处理,就给标错了,所以就会产生各种各样的问题,是不是啊,同学们,这是concurrent,我们先来介绍concurrent的这种呃,开天地,开天辟地的第一个就concurrent呃,呃。
sorry调出来呃,concover里面呢开天辟地的第一个,开天辟地的第一个是什么呢,第一个拦截回收器是什么呢,就是我们著名的cm,cms全称的叫做concurrent mark wept。
叫并发的标记清除,它主要有四个阶段构成,我们一块来解释,注意这个cm s是工作在哪个年代的,ok仔细看cm s工作那个年代呢,他工作在老年代,那么和c m s对应的工作,在年轻代的应该用什么垃圾回收呢。
你可以用serial,也可以用pn,他不能用parallecovage,好,我先来再进一步解释cm s之前,我来解释什么叫判定,凡是在这里虚虚的线,注意啊,虚虚的都是可以互相配合的。
但是最常用的配合就三种,cereal palace scavenge以及pu加上cms就这三种,其他的你不要跟他想来想去的,就这三种,不用不用不用多想,好听我讲这个panel是什么东西呢。
can new的意思和parallegivenge是一模一样的,肯定就是工作在年轻代的多线程垃圾回收器,那有同学说了,他为什么不用parallegvg的原因是什么,原因是我们来看判定的定义,你就知道了。
这是判定在oracle官方文档里的定义,他说panel是什么,他说他是一个stop the word coping collector,which uses multiplies friends,来。
do viser i double the world gin collector,which uses multiple gc threats,it's not the wild bglad。
the way using multibushes with thread,okay,阿三口音,他说it diverse from parallegend in that。
inteenhancements that makes usable with the cms,这是它的本质,它说它和telecavenge的本质的区别是什么,它有一些增强enhancements。
让他能够和cm s更好的配合使用,所以它就是paralysa,只不过专门和c m s做配合使用的,特殊的太red了就行了,ok,好我们继续了吗,所以到现在为止,当我们看这张图的时候。
我觉得你们能看一个大概了,你发现没有张图大概就已经产生了,然后你就会发现原来这是单线程,这是多线程,这个是特殊的多线程,它配合cm s一块用,所以到现在为止,作为分类模型。
起码你掌握了一个两个三个四个五个好,下面我讲这里面最难掌握的cms,准备好开准备好开始我们新的征程了吗,老师为什么ps一开始不配合,gms要出判定,因为最开始的ps是和pao的配合使用的cm。
后来诞生之后,发现原来设计的这些不符合他的要求,很难理解吗,听我说cm作为整个concurrent这样的垃圾回收器,开天辟地的第一个秦始皇,他有天生的bug,但是呢你如果不从他开始学。
你就理解不了后面的g one,理解不了后面的z dc,理解不了后面的shin的,ok所以我们先要了解了解cm效仿go浪,你疯了吧,闪电你说你非得说啊,马克思是效仿闪电的,你不扯淡吗,人家马克思先诞生。
你闪电后诞生啊,虽然你早晚要去见他,我们马家门的名人马克思同学,但是你不能这么说,不能说他效仿你,你只能说你效仿他go on,效仿java好看,这里cm s它是这么来玩的,它的原理呢也非常简单。
虽然说从最底层角度讲,它由六个阶段构成,但是你跟面试官聊,基本聊聊聊通这四个阶段就可以了,这四个阶段分别是什么呢,分别叫初始标记,并发标记,重新标记,并发清理,一一点一点来讲,他很容易理解。
这里面最难理解的是这个阶段,这个阶段就是著名的三色标记算法,今天看时间吧好不好,现在已经十点了,看这里,呃这是,它的四阶段四阶段是什么呢,初始标记,初始标记的意思非常简单,就是找到根儿上的对象。
找到那些root对象,大家知道我们垃圾回收过程就是从根上开始找,先把这根上对象找到,这部分叫初始标记,注意它依然是s t w的,但是他s t w时间会非常短,为什么。
原来的s t w时间是要你把所有工作全干完,所以他时间非常长,现在这个sl的事情,你只要找到根儿上就可以跟上对象,毕竟没那么多,所以这个sw时间特别短,一般来说没有多长,所以没有关系。
接下来就是最重要的阶段,这个阶段是什么,这个阶段是我们的业务线程继续,不管你有多少个业务线程,几十个,或者你们哥仨,你们解释三随便玩,你们在哪玩的时候,我垃圾回收器就在工作了,垃圾回收器开始工作。
我就开始找哪些是垃圾,哪些是垃圾,哪些是垃圾,哪些是垃圾,你一边玩着一边听着,我一边标记着啊,不能叫,一边听着一边标记着,这个是垃圾,这是垃圾,这是垃圾,这个不是垃圾,全给你标出来,等我标好了之后。
注意它一定会产生错标,坐标主要有两种情况,第一种情况是好好听我讲,原来这哥们是个垃圾,原来这哥们是个垃圾,但是呢运行过程之中呢又有一个引用指向达了,ok它就变成不是垃圾了,这种的你后面不能把它给清掉。
还有的呢,原来这哥们儿不是垃圾,有人有引用指向的,运行过程之中呢,好引用没有了,它就变它就变成垃圾了,好这是两种经常见的情况,这块大家能呃听得懂吗,这块是最难的内容了。
concurrent里面就是cm里面最难的内容,能能get到吗,嗯讲错了吧,宋海强一定是你错了,你放心,我这不会错,凡是怀疑老师错了呢,你们都错了,引用没了,怎么又会有人回来,我一会儿讲给你听。
那个叫做先引用了,然后我们的垃圾回收器以为引用没了,三色标记,我一会讲给你听好吗,引用没了也能引用回来,我告诉你,虽然情况比较特殊,但是完全可以,比如说缓存你命中了,然后你那些没命中的,你要清掉了。
突然之间他又来了一个命中了,比如说你重写了falize方法,原来死了对象,你就给他复活了,放心啊,我这没错,我这没bug,成员的bug就像自己的内裤不会展示给别人的,放心,ok总而言之会发生两种情况。
业务线程再继续的话,那你不断的新错误再产生,那肯定不行,所以从整个的cm角度,一共有两个阶段是s t w的,一个是初始标记,一个是重新标记,毕竟出错的不会特别多,所以重新标记的这个s t w6 。
时间也不会特别长,好最后呢我标完了,确确定标清楚了,这就这哥几个是垃圾,那哥儿几个不是垃圾,好嘞,并发清理,清理完了之后,下一步好了,这是大体的过程,这里面有很多细节,最差的最多的细节就在这。
叫做三色标记算法,著名的三色标记算法go on采用什么算法,go on知道吗,三色标记,那小点点问s w了,怎么能出错,大哥你看看这是s w吗,我说的是出错,是在这出的,三色标记go on也是啊。
所以你不要说那个java抄go on,别扯好了,下面我连我,我详细给大家讲这个问题可以吗,这讲的有点难,今天我告诉你,我讲完三色标记就没有时间讲g one,就没有时间给你们讲g one。
z gc shindoor excellent,你是想听这个还是想听三色标记,你们自己挑。
系列 6:P41:JVM调优实战(上) - 马士兵学堂 - BV1RY4y1Q7DL
首先讲一点小小的概念性的东西,到底什么叫调优,我跟你说调优这个词啊,用的太烂了,所有东西都叫调优啊,随便弄点什么参数也叫调优,调这个词实际上是如果严格意义上来讲呢,它包括好几部分,什么叫调优呢。
从jvm角度,它包括三大部分,第一大部分是根据你的需求进行,j版的规划和预调,有,这是什么意思,比方说我规划之中,我要每天支撑100万的下单量啊,我这时候要用什么样的机器,用多少内存。
这东西呢我们可以叫预规划,也可以叫预调用,第二个呢是优化运行,这版的运行环境,比如说你现在这外面运行环境运行特别慢,卡顿好,这个时候你需要定位到一个系统的瓶颈,来进行调优。
因为一个系统平瓶颈呢基本上要进行压测,要进行全链路压测,那么如果是单机的话呢,你只要通过方法进行跟踪就可以,那么如果是分布式的话,你需要用zk skywalking啊,这一类的进行全链路压测。
来找出来到底哪个服务特别慢,然后再进行调优啊,这块我我解释的不知道大家还能不能跟得上,能跟上老师扣一英文叫ching,yes,你说的太对了,英文太好了,来我们继续。
还有一种调优呢是面试之中one特别多的,就是解决这个运行过程中出现的各种问题,什么问题呢,比方说memory leak,比方说o o m o m的全称叫out of memory。
内存溢出内存报表是这个意思,今天呢我用一个小例子来教大家解决这类问题,你会用到哪些工具和它们怎么具体的使用,好好听我说,如果说调优你需要理解很多很多东西的,你需要理解怎么去设设定日志的参数。
你需要理解呢,怎么啊,这个日志日志怎么去解读它,呃今天呢我给大家略过一些细节,就像昨天我说的,希望各位小伙伴们先学最粗犷的东西,然后树干再学树枝,再慢慢去抠每一片叶子,你才会变得越来越牛。
关于日志这块呢其实还是挺复杂的,每一个日志你怎么去解读它,我们暂时先略过它,今天也用不太上用到的地方,我大概跟大家说一下,另外呢在工业生产环境之中,一个java程序应该设置什么样的参数,这块也特别重要。
有些参数很多人从书上得来的,实际人家工业环境不可能,那么设,比方说你设置日志文件就设一个,这不可能的好吗,一个日志文件你很快硬盘就占满了,所以这根本不可行,必须是循环的好多个日志文件不断循环。
比方说你根本就不设hip dump on out of memory error,就是说如果说他om之后,你不把堆导出来,那你完蛋,你定位不了问题,所以这个也不行,这块呢我们暂时先把它略过。
所以我来说呢,我用一个具体的例子来给大家来讲,大家看这里啊,我们那有个小程序,这个小程序呢业务逻辑上我大致解释一下,这个小程序是这样一个业务逻辑,小程序来源于实际,我们有一个小伙伴在工作之中的一个问题。
的模拟jvm调优这一类问题,比较麻烦的问题在于我很难跟你模拟真实环境,因为真实的环境很可能一个月才出一次,我给你这模拟一个月,然后为了出这个问题太累了,所以我只能用模拟的环境。
用最快的速度让它fell over,叫快速,feel fast是吧,快速的让他展现出来他的bug之所在,在这个小程序是模拟的,虽然是模拟的实际场景之中,它就是这样的,你好好听看,是不是大致能理解好。
这个小程序模拟了什么场景呢,这个场景是在银行体系或者是互联网金融体系,里头进行风控的这样一个模型,风控简单说我要给一个哥们放贷款,这哥们儿叫博传玉,他们家有祖传的玉石,藏在柏树里头。
ok说明这哥们信誉比较高,信用额度比较高,我可以给他贷100万好换,另外一个哥们,这哥们儿叫rist,啊这哥们儿的名字起的太怪异,他的信用度很低,我只能给他带1000块钱啊,这东西怎么算出来的。
是根据每个人过去的一些信用情况,信用卡还还还还款的这种及时性啊,借了多少钱,有没有其他的债务啊,是怎么消除的,以前有没有接待过等等啊,有没有借债不还的好根据这些算出来的,这叫做风险控制模型。
风险控制这个小程序就是模拟了,从数据库里面取出每一个人的个人信息,来套用一个风险控制模型来计算出来,他到底可以给不给他的代,或者说他的贷款额度到底给多少啊,这个背景大家听明白的,给老师扣个一。
啊李军长也来了嗯,去找找一下那个叔叔,让叔叔把你送出去啊,嗯拜拜嗯,好嘞我们继续啊,看大家看这里这个小程序呢,每一个人的个人信息呢,我用了一个cateer来模拟它,只读了信用卡信息。
实际当中比这复杂好多,信用卡呢包括他的信用卡额度,包括他的名字,包括他的年龄啊,包括他的生日等等,然后我们用一个,有一个方法,他呢每次呢都从数据库里面读出100条数据来,求出100条数据来之后呢。
加入到我们的test list里面,加入到我们的任务列表里,我们起了一个线程池,线程池呢叫schedule thread to executor,这你学过的话,你就学过,没学过的话,大致理解就行了。
它是固定时长,固定频率的来执行任务的这样一个线程池,在这个线程池里面有50个线程,然后每隔100个毫秒执行一次任务,在这个任务里面以固定的频率,拿出每一条数据来,每一条数据拿出来来进行计算。
大概就是这么一个模型好,这个程序呢你理解也行,不理解也可,无所谓,我现在给你把这个程序运行起来,我直接告诉你这个程序里头有毛病有bug,我举的例子稍微复杂一些,我不想举那种特别简单的。
你比如说拿一个list不断的往里扔对象,然后一会儿就内存溢出了,这个太简单了,你要跟面试官说,你说我有实际当中调优经验,面试官肯定会问你啊,你实际当中什么情况下需要调优呢,遇见了什么问题呢。
你跟人家说说,有一程序员反正不是,我写了个list不断往里扔,从来不往外取,很快om了,面试官肯定拿大嘴巴子抽你,这也太简单了,好意思拿出来说吗,可是即便是这样,确实在实际生产环境之中。
真的有人犯这种错误,由于业务逻辑混杂在其中的时候,程序就会显得特别复杂。

就有可能会产生这种错误,就没招了,但你尽量不要说这个太low太low了。

好我刚才讲这段能跟上吗,能跟上给老师扣一来,你不要太low啊,虽然local内存泄露那个太高大上了,我觉得你未必能cover得住,你做什么,写了thread local,它怎么产生的内存泄露。
这个你未必能cover住,好大家看这里,我先把这程序给刨下来,这小程序呢我加了几个参数,看看能不能认识啊,第一个参数呢叫杠x m s最小堆大小,第二个呢叫杠x mx叫最大对大小。
print gc运行过程之中,把我们垃圾回收器的日志输出打印出来,最后是我们的程序,这里问大家一个问题,为什么我设最小堆和最大堆设成同一个,都设200兆,最小跟最大不一般的情况下不设成一样的吗,为什么。
辰辰前面没听着,太遗憾了,没关系,不耽误后面听,不用扩容没错,防止内存抖动,既然你明确知道,我的应用程序会占到200兆内存,直接给它分配200,不要让它没事,涨来涨去啊,长一点长一点长一点。
长到最大之后,如果用不着了,又往回缩,缩,完了之后又往回涨,太消耗资源,ok该到这点之后,我们敲回车这个应用程序啊,我们的java这个进程就开始跑起来了,下面呢我开始是教大家纯实战的内容,嗯排列一下。
好我们排列它一下啊,这样我们看得会更加清楚一些,呃,我们右最右边的窗口里头是我们呃,现在正在运行那个程序,这个小程序呢时间一长,它会出各种各样的问题,目前为止还没出问题,目前呢它只是展现出来了。
说我产生了一次gc,这次一次gc,这是什么意思呢,这个应该是怎么给它放到最大的。





我把这窗口呢还是,垂直排列。

水平排列合并所有吧,这样我切切一切吧,让大家伙看的更加清楚一些啊。

重新运行一下这小程序,为中,回车重新运行一下程序啊,这个排成三个窗口,不能把信息信息显示完全,看上去很别扭,当我们运行起来这个小程序之后呢,你会观察到的小程序呢会产生一些日志输出。
这些日志呢你看大概大概是能看明白,我稍微解释一下,这个输出日志输出的是比较粗的日志,并没有说出很详细的,如果输出很详细的,我需要跟你解释半天,还是那句话,我们先略过一些细节,大家看这里。
他产生了一次gc,gc产生的原因叫allocation failure,什么意思啊,分配失败,那意思就是说我有一块内存被占满了啊,这个这个dc叫y d c在年轻代dc,然后这次回收产生了什么效果呢。
原来我的年轻代占了54兆,接下来回收一次之后,回收成为一兆,说明回收了53兆哇,这次回收的效果很明显啊,然后我们总的gc的呃,总的堆大小是20兆啊,200兆sorry,200兆时长是多少。
这块我大概说明白了吧,有没有谁在这块有疑问的,没问题吧,没问题的,给老师扣一啊,来我们继续,我教大家一些最基本的一些常用的命令,先作为java来说,最常用最常用的命令当然就是java是吧。
好我们下面来聊一下java参数,java回车你会看到作为一个java命令,它后面可以跟哪些个参数,我先说第一点,就是当我们一敲java的一个命令的时候,它就会启动一个java虚拟机。
以前老同学在这里头犯糊涂,说老师我起了一个java t1 ,又写了一个java t2 ,这这是几个虚拟机啊,两个只要你敲一个java命令,就会起一个jvm。

这个jvm专门给他服务,这个jvm专门给他服务,你调优的时候不能两个混在一起调啊。

这件事很难很难理解吗,很容易啊,好大家看这里,作为java来说,他本身有好一堆的参数,这种以横杠开头的叫标准参数,标准参数没有多少。

看上去也并不太难理解,但是你不要忘了,这里还有一个杠x开头的。

这叫什么,n standard nonstandard。

非标参数非标准的。

所以你敲java杠x回车的时候,他会把非标参数全都给你列出来。

像刚x mixed杠s interpret,这个我的vip课程有讲过。

像什么diagnostic啊,non class dc啊等等等等这些globdc。

这都是设置你的gc的文件的等等,杠x m x m x我们都设过了。

好听我讲这个叫非标参数。

像这些参数都是可以用于调优的,但是真正调优用到的东西是以杠x x开头的。


但是很不幸的是呢,这个杠xx开头的这些参数。

它是没有一个专门的文档给你列出来,如果你想知道这些参数到底包括哪些,用这个东西,print flags,final,print flash final。

叫打印所有的参数的最终值,我们后面不跟class文件名直接敲一conversion。

我们看它有多少呢。

当然你是不知道它有多少,来试一下这个杠xx开头的参数非常多。


ok大概是有这么多屏。

到底有多少,wc杠l为正好一共有728哈。

扣除我们这些特殊的信息。

大概有700个参数左右,恭喜你了。

知道为什么这样的调酒比较值钱了吧。

不过呢你们也不用心慌。

作为老师这么体贴的男人,肯定会告诉你到底有哪些个常用的,常用的,就这么多,几十个而已,parallel常用的参数又有哪些,cm常用的参数又有哪些,几万常用的参数又有哪些。

所以加起来呢也就几十个而已,不用担心。

ok比今天可以发吗,可以啊。

没问题啊,皮在哪儿聊聊小姐姐就知道了。

好我们可以继续了吗,可以继续,老师扣一了。

好玩啊,我跟你说,实战的东西还是比较简单又比较好玩的。

太多了,我就给你几百个参数里头,我已经摘了几十个出来还多,你还要怎么你还要怎么着。

好,你看程序呢已经开始慢慢的在不断的产生gc了,由于它不断分配对象,所以他不断的产生gc。

下面呢我教大家一些。

常见常用的命令用来跟踪我们java的进程呢。

到底有没有什么毛病和bug,第一个命令叫做gps。

大家同学们,你们呢也不用记。

作为老师这么体贴的男人,你猜我给你记下来了吗,一定是记下来了,所以不用挤了,常用的工具我都给你记下来了。

好吧好吧。

好我们先来聊第一个工具,第一个命令叫做gps,这资料可以领吗,没问题啊,第一个工具叫gps,gps全称叫java processes,什么意思呢,就给我列出来整个系统里面java的那些进程。
我们这有两个进程,第一个就是jp本身,第二个是11800的t15 福利,就是我们的程序哈哈就是他好,这是第一个命令,第二个命令是什么,第二个命令是j infer,你看一眼他的名字叫java infer。
很容易就能理解这东西是个啥呢,这东西是java进程的一些相关信息。

后面当然要跟我们进程的名称11800,在这他会把11800。

这个进程相关的一些属性全都给你列出来嗯。

比如说separator是什么啊,比如说那个我们的java虚拟机是谁来提供的。

等等等等吧,其他的比如说我们的boot class path。

里面包括了哪些站文件等等等等吧。

比如说我们它的默认的这种启动的参数是什么。

kama参数是什么,ok这一份这个通过这些信息呢。

你可以定位一下你的程序到底哪有问题啊,这两个命令非常简单。

我就快速过了,ok下面呢我来教大家另外一个命令。

这命令的叫j state。

this late late的嗯,statistics叫做叫做java的统计信息啊。

或者叫java的数据的跟踪信息。

this data最常用的。

你要跟参数,jd的杠gc就是跟踪他的gc的一些信息。

后面的跟11800。

这是什么东西呢,跟上我们的进程号,然后回车好。

你会看到它会把内存里面的每一块区域。

占有的大小全部给你列出来,当然这些区域呢其实它代表的什么意思。

上网一搜你就知道,但是这个东西呢读起来特别的特别的不爽,不顺啊,这东西读起来特别抽象呃,这个命令还有一个参数可以跟后面跟一个500。

指的是什么呢,每500个毫秒刷新一次,你能观察到你内存的动态的变化。

这个命令在不装,我们后面我要讲的超级的工具。

之前这个东西呢完全是有用的啊,你可以用它来跟踪你内存增长过程。

你注意看这块内存它会不断的往上增长啊,中间这块这块从二七直到313233。

当然你跟踪了之后。

你就会知道哦,原来我的程序已经在不断吃内存了,会产生这样这样的一个直观的认识,好听我说啊。

就是这里面的每一个参,每一个名字代表什么,我就不给你解释了,因为后面的我会教大家。

在实际当中能够用起来的,工业级的特别棒的一个工具。

阿里开源的阿尔萨斯好吧,ok你知道人为命令就行,这些命令都是jvm自带的,jdk自带直接拿来用就行好,除了这个之外呢,我教大家另外一个命令,这命令是什么呢,jdk clear j stack。
这也是一个非常重要的命令,j stack的意思,stack叫战,这是谁来拥有来着,还有印象吗,是不是线程线程才会拥有,这所以jdk就是用来跟踪线程的11800。

他干一件事会把11800里面所有的线程,所有的线程啊。

a more吧,一瓶两瓶,三瓶四瓶,你就会看出来它会把所有的线程,线程名的线程编号,线程的优先级,操作系统级别的优先级,线程的状态啊,这是现成的状态,包括现成的调用堆栈,stack trace。
就是这个方法调了哪个方法,这个方法又掉了哪个方法,a方法调了b方法,b方法调了c方法调用栈,把这个调用栈给你打印出来,这有很重要的作用,比如说你观察到某一个线程或者某几个线程。
一直是waiting在某一个锁上面啊,这个condition看了吧,就这个线程一直是waiting on condition,如果很多线程一直wait在某一把锁上面,那么这时候是有可能是说。
你的你的程序产生了死锁,还有在面试官问问题的时候,有一个经典的问题,这个经典的问题是同学,如果你的jvm cpu爆了,请你告诉我怎么去查这个问题,怎么追查这个问题,如果你的jvm cpu爆了。
比如说你jvm 90%的cpu持续居高不下,怎么查,有谁遇到过这个问题吗,面试的时候,面试官问你有遇到过吗,你看打小打小就遇到过,因为他打小长大的向死而生,他遇到的问题比较多,top gun hp。
top gun hp呢是说你已经知道这个jvm已经占据,占据占据比较高的cpu了,他问你呢是知道你的jvm已经占据很高的cpu,你怎么去查他呢,怎么去定位问题呢,飞火牛羊,马老师别闹。
马老师什么时候闹了,马老师作为中国正经老师,number one严肃课程,number one的老师怎么能闹呢,一般是某个线程在发傻,如果一个线程在发傻,他在weight,它是不需要消耗cpu的。
大哥采样分析,最后是加密算法问题小结,前两天咱们联系过是吧,好听我说啊,好听我说cpu比较高,拿什么看,其实你呢得去查这个线程,它呃就是什么样的线程在占用cpu,那么这东西怎么查呢,教大家系统级的命令。
所谓系统级的命令指的是听我说,所谓系统级的命令,指的是linux系统提供的下一个命令和top,所以这当我们一条top回车的时候。

它会有显示出来当前系统里头的哪个进程。

占的cpu是多少,占的内存是多少,如果你top多观察几次的话,你就会发现它的内存会不断增长,它的cpu呢有可能是忽高忽低,这是我们程序产生的问题,当然如果你只是观察top这个命令的话。
你只能观察到某个进程占的cpu比较高,如果你想知道这个进程里面,哪个县城站的cpu比较高,小伙伴们,你得用另一个命令,就是那个叫top依然是top。

但是gone hp 11800回升。

他就会把你这个线程里面的,你这个进程里面的所有的线程给你列出来,然后他的cpu你列出来,所以如果你要是玩这个的话,得得怎么办呢,啊得是这么办,得这么干,你仔细听我讲啊,就这块呢如果不采用先进工具的话。
你得这么干,首先top找出来哪个进程占cpu比较高,接下来top hp,找出来这个进程里面哪个线程占cpu比高,然后根据这个线程编号,用jdk对照j stack执行的结果。
jdk大家知道这会跟踪出来好多好多线程,把这个线程编号跟jdk结果对应上,看看这个线程到底是哪个,一般来说我讲到这儿还能跟上吗,能跟上给老师扣一了,可以吗,good这块不难啊,就是一些思路和工具的运用。
很简单很简单啊,你放心啊,再难的问题在老师这都是很简单,so easy,看这里找到这个线程之后,需要定位这个线程有两种情况,第一种情况,这哥们儿是v m thread,一般就是gc垃圾回收线程。
这哥们是业务线程,那这二话不说,去看这个业务线程里调了哪些方法,是哪个方法不断的循环占cpu呢,这就是业务进程,你怎么去查,这跟业务相关,假如你定位的是gc,那么它一定是在频繁的g c不断的gc。
所以他的cpu才不会不断飙高,这时候就干嘛读g c的日志,看看日志里面是不是在频繁gc,原因是什么,有可能压力突然间爆表了,双11正好赶到12点,那那那那那一秒哗来了一大波的流量报表啊,这是正常的。
你应该能撑住,撑不住的话,你扩机器还有一种内存回收来,回收去总是回收不掉,那么这种情况就是有内存泄露,这个过程我说清楚了吗,听明白同学老师扣一了。

good,你看他现在cpu已经占百分之九九十3。9了,看到了吗。

好我们看这里,当我们看这个呃我们程序的输出的时候,你会发现它已经在不断的f d c了,注意看最关键的是呢,我们来读他的这个输出信息啊,你看一眼他的输出信息呢会明确的显示出来。
这哥们呢f g c的过程是这样子的,它每次的回收内存是从20秒开始回收,198015,回收结束之后还占多少内存,198098009就回收了6k,我们总的大小198016,回收一次就回收了6k哎。
这哥们儿还特别的坚持,他呢也不报啊,内存也不报,每次就回收个6k哈哈,好那说明什么,说明我的内存里头,一定有一个有人在不断的占内存,而且我回收不掉它,再说一遍,当你看到频繁f g c的时候。
这个呢就叫频繁fdc,一秒钟好多次,或者你内存比较大的时候,几秒钟一次,十几秒一次都可以认为是比较频繁,还要听我讲频繁fdc怎么定位,这个也是面试官经常会问的,频繁f d c怎么定位。
观察你频繁f g c的每次回收过程是不是正常,比如说你这里显示的是,从每次都从200兆回收到20兆,good,这个是正常好吗,这是normal,是正常,没毛病,不要给人家吃药,他频繁的原因。
你的前端的压力太大了,他的那个负载太重了,它必须得处理,这个很正常,但是如果是说像我这种的,每次200兆回收完还是200兆,那么你想想看它发生了什么问题啊,一定是在我的内存里头,有谁把这内存全给占住。
而且呢都有引用指向,垃圾回收不掉,没问题吧,听听听懂,听懂我的意思了吗,我们可以继续吗,kdj老师扣一这小程序,牛叉就牛叉,在它呢是不断的产生毛病,他还不报哈哈,他偶尔会报,偶尔不报,就是这么的牛程。
clear,我们再把这程序跑起来,不然我没法定位呢,下面我教大家在这个小程序里面是由谁在调用,在占用我们的内存,谁在占用我们内存呢,教大家另外一个命令,这个命令叫做,come on baby。

好这个命令叫做。

著名的gay mad gmap呢,这个命令有两大作用,第一大作用是帮我查一下堆内存里头,哪些个对象占用的情况,就是不同的类的对象占用内存的比重,占用的情况,这是第一个,第二个呢叫产生堆转储文件。
啥意思呢,什么叫堆转储文件呢,当你怀疑这个jvm的内存里面有bug的时候,你用这个命令可以让整个的这块内存导出来,存到硬盘上,存成一个文件,然后你可以把这个文件拿出来分析,大家听明白这意思了吗。
来再说一遍,这map有两大作用,我一个一个给你演示,我们先说第一大作用,gmap的第一大作用,histogram生成对象,图四六,我们我们我们得看我们那个进程号是什么啊,gps民的进程号是12049。
sorry,不是11988,说不定账号gmat gm historm跟进程号11988,或者它会生成什么呢,它会当前你在正在运行的这个jvm里面,它会对你进行一个整体的分析。
从头给你分析到尾哪种类型的class。

里边有多少个对应的对象,我们看脑袋就知道了。

看这里大家注意看有这种类型的对象,333个占了这么多字节,有这种类型的对象,什么类型呢,叫chedufate task,还有一个叫big decimd,还有叫cut effort。
这是我刚才读代码的时候,读到过它有多少个对象呢,这个类有多少个对象呢,11万个占了多少个字节呢,这么多个字节,然后呢它是从大到小排列,大家看懂我意思吧,当然其实大多数的时候。
我只需要观察前面的部分就行了,and取取取前20行就行了啊,我不需要观察下面这些,就只有一个对象的,他一定是占不了多少内存,他不会说让我回收不掉的,可正好从这你就能看到。
这个呢是目前为止在我们整个的jpm里面,最占内存的那些对象就产生了,这是gmap的巨大的作用,不知道大家get到没有,所以同学们你们想想,有一些东西我回收不掉,我执行完gmap之后做个对比。

比如说就拿这个big decimal的对象来说。

big decimal对象你的前面是18万个,我又执行一次就变成20万个没回收啊,来再继续变成22万个没回收啊,变成哈依然是22万了,23万个,不知道大家观察到没有,有一些类的对象在不断的产生。
而且回收不掉,所以会产生什么问题啊,你是不是get到了我的内存被占用,回收不掉。

就是由这些对象引起的。

好这块还能跟上吗。

能跟上,给老师扣一,这是int数组,char数组,bt类型数组,这种的一般都比较正常,不会出大毛病,那这事是不是就简单了,既然你知道哦,原来是我的scattered fire task,或者是node。
或者是big demo,或者更有甚者是cut inf。

是由这些类的对象不断的产生,而且回收不掉造成的,那怎么办,简单你去查你的业务逻辑吗。

你去查你业务逻辑不就完了吗,很简单,查业务逻辑,这作业留给大家吧。

我告诉你,我教你定位的东西,超级简单,他再难在老师这也是嗯小菜一碟,豆芽子长一防高,他也是根菜,想咋吃咋吃,但是呢真正在业务环境里面,就算你定位到是由于cfa这个类不断产生对象,吃内存造成的。
可是它原因是什么,你能知道你试试看我的小程序给你,你们自己去调,看看能不能把这bug给调出来,我告诉你,如果你不懂线程池完蛋,你还是调不出来,就算你懂线程池,你也未必知道问题出在哪。
更何况在你实际工作环境之中,这些毛病啊,你的业务逻辑呢是分布在很多特别复杂,代码比这个要长好多的那些文件里面,所以定位问题并不能解决问题,才是真正的难,好我们稍微的复习一下。

我今天呢给大家讲了几个常用的命令。

回顾一下,一个叫top,第二叫top gone hp。

第二个呢叫gps,很简单,这infer列出信息来,第三个继续啊,叫distack k dist,ok还有一个呢叫j mp j map的一个作用,把里面的每一个最常用的,最多的这些个类给列出来。
所以当面试官问你的时候,你就可以说了啊,我实际当中写了这么一个程序风险普查模型,然后它产生了内存的泄露,我们频繁频繁gc,但是回收不掉,后来我一定位,我发现了carly info,经过我的努力,搞定。
听清楚了吗,来跟上磊老师扣个一,面试官问你谁当时什么情形,你就像我这样噼里啪啦说一遍搞定,当然怎么改怎么改,你自己去自己去找,当然你这么说完呢,估计面试官会一个大嘴巴子抽上来,告诉我你生产环境之中。
难道可以随便执行gmap命令吗,如果你告诉面试官说,我gma命令是在生产环境之中执行的,面试官估计就是要请你出门右转,拜拜,还有为啥嘞,关键是怎么搞定的,哈德森还搁那纠结呢,怎么搞定的。
是你的业务逻辑问题,大哥,我今天给你讲的是jvm调优,你的业务逻辑出的问题,别人能知道吗,只有你自己知道,就是说就是说这map的命令,会产生一个很严重的后果,产生什么后果呢,我们现在内存啊就200兆。
真正运行起来了之后,就中间我开始运行的估计就占了几十兆的时候,我就开始把它运行了,j map会让整个jvm卡死,卡死在某一个状态,stop the world,然后把里面的对象全都输出出来。
very good,真正生产环境能让你卡死吗,大哥能吗,能不能,你现在双11正搁那秒杀呢,上来一个你j map啊,卡死十次,关键人家内存还特别大,128g傻了一个gmap命令两个小时以上。
所以大哥别这么玩,别这么说,这是一定有问题的,跟面试官聊的时候怎么说呢,我先卖个关子,你听我讲,我先把gmap的另外一个作用讲出来,还能跟上吗,不能强制停止吗。
你看super king多牛那边双11正在秒杀呢,直接把电源给拔了,牛刀佩服,你猜马云会不会拿大鞭子抽你,上次不是说半夜执行吗,可以啊,没错,半夜执行是一种说法啊,这个没问题啊。
就是你是在半夜的时候执行的,可是半夜执行他万一不是f d c特别频繁的,呵呵是吧,嗯总而言之呢,要说的你要跟面试官聊,这些一定是要聊的。

系列 6:P42:JVM调优实战(下) - 马士兵学堂 - BV1RY4y1Q7DL

for slb,摘下来执行,good不错,还有一种说法是什么,来的访问,复制一份,复制到备份机,在备份机上执行,good不错,测试环境压测的执行。

good的不错,都可以get了吗,我们来看第j map。

第二个命令,第二个作用,好看这里,那么gmap的第二个作用,我先把我的头像拖出去,再看这里,in g map,第二个作用是什么呢,第二个作用是它可以用量来写dump。
format等b就是binary 2进制类型,产生一个dump文件,file等于刚说就今天是2020年9月11号,20200912点,h profi,后缀名无所谓啊,后缀名写什么都行。
这是产生一个我们整个堆内存的转储文件,然后呢来对它进行分析啊,然后后面跟我们的id号id号是什么来着,11988是吧,11988我就好了,他这时候开始把堆定转储产产生完了啊。


这是我们新产生的20200922的h方法,好听,我说一句。

这个堆专注文件的意思是把java的整个堆,整个堆。

jvm的整个堆导成一个文件,然后下面可以你对这个文件进行分析。

对这个文件夹分析的时候,就完全可以使用那些网上。

你们喜闻乐见的各种工具了,比如说图形界面的jvo vm。

这是jvo vm,嗯你你你你打开文件啊,装入,你就直接把那个刚才那个文件呀,给他装入进来就可以了,这种的profile给装进来好吧,然后呢装置进来之后呢,你找到内存,找到抽样。
然后你就观察出来到底是哪些个,你对象来占的内存比较多,你就观察出来了,嗯这是一种好吧,这是第一种,有同学说了,老师这个jvr vm我没接触过,这是java自带的这东西,这东西用我说吗,这都用我说吧。
不用吧,不用不用啊,很很很简单啊,这是java jdk自带的好吧,说两句,我同学实在是基础太弱,你基础这么弱,我就没招了,简单跟你说两句吧,你你就是你java装完了之后。
jdk binary里面你找到这vo vm,就是这个图形界面的工具,这图形界面的工具呢它也比较强大,它呢除了可以观察你本机的这些id之外,也可以装入用文件来观察。

也可以干嘛呢,也可以远程来观察啊。

比如说这是你linux服务器,你也可以用一个gb ram远程连接去观察它。

这也是可以的,这也没问题。

然后你就可以对它进行分析,分析完之后你也得出结论了。

原来是cut inf那个类太多了,依然是这个结论,没有什么其他的好吧。

然后下一步查你业务逻辑,查业务逻辑,别人就替不了你了。

好这块内容讲的稍微快了一些,来能跟上来扣个一。

因为我觉得这个比较简单,没问题吧。

但是但是。

我讲这么快是有原因的,因为实际生产环境之中很少这么玩。

原因是啥,你往外导文件依然会产生卡死。

会让jvm卡死。

你能让你随便倒吗,不能。

所以这就涉及到,你什么时候才能把这个文件给拿到,生产环境里头的第一件事儿。

好好听我讲,生产环境第一件事叫做设置好你的启动参数。

这个启动参数啊。

包括这个参数,hip dump on out of memory era,就是当我们启动的时候,一定要把这个参数给设置好,这个设置好的意思是什么呢,就是hp down什么时候产生oom了。
什么时候它会帮我自动生成堆转储文件,再说一遍,什么时候你的内存爆了,它会自动帮你生成一个对准储文件,dump文件,这时候你内存爆了,相当于你java进程已经死了,这时候就没关系了。
把你的文件拿出来做分析分析的工具,特别我呢跟大家说,我jv vm jdk自带的jhg命令行的eclipse,带的mad完全也可以,还有其他各种各样的工具都可以,刚才有同学提到gc easy。
那是读日志的,跟这没有半毛钱关系,好了,同学们这块不知道我说清楚没有,所以你在生产环境之中,你说我用jamap导的不对,这个事儿不对,这是第一个,第二个,你跟面试官聊的时候,说我远程是linux。
我用jvm远程连接上去,这事儿对吗,能这么说吗,告诉我一下这console也可以远程连接,这比如vim也可以远程连接,这profiler收费的也可以远程连接,你要跟面试官说。

你说我在生产环境之中,双11那机器人在那玩着呢,我上一个g b u v m去观察它完蛋。

面试官估计一个大嘴巴子抽上来,不哪凉快,哪呆着去搁哪学的吧,你出门右转啊,拜拜。

听我说一句,在生产环境中的机器,一般情况下除了运维之外。

尽量不多开任何端口,但是你如果用远程的这种图形界面去连接它。

sorry必须得开各种各样的端口,产生各种各样的安全问题。

另外呢它会对性能造成一定的影响,大概性能会下降10%到15%。

因为它需要不断的对vivo j vo vim往外传。

我每一个对象的状态。

好吧,所以这是不行的。

还有同学说了,老师,那我人家面试官问我,我是怎么查出来的呀。

我该怎么办呢,好听我说一句,如果说你说是图形界面的工具观察出来的。

也可以,什么情况,比较牛逼的说法是我是在压测环境里头,压测的时候好挂一个上去,远程观察,这个没问题,这是第一种说法。

第二种说法是我们机器做了负载均衡,我们发现程序有问题之后,我把这台摘出来。

从负载环境里头摘出来,我把它的堆转储文件导出来好。

这个也没问题,very good。

这是第二种,第三种。

由于双11的或者是什么样的,这些个从互联网过来的连接特别多。

我用tcp dump这个命令给它复制一份,一份打到我们的生产环境里头。

一份打到我们测试环境里头。

我们用测试在测试机上做观察,good牛逼,说明你不仅懂负载均衡。

你还懂tcp弹吗,你还懂生产环境里头这么调优的手段。

好了,50万给你了,供给内。


呃我说清楚了吗。

tcp吧,sorry,tcp copy吧,tcp copy,sorry啊,不是不是。

tcp down,i'm sorry。

super king,这是50万必备的技能之一。

反正不是你那摁电源好吧,super king。

你要摁电门,那个你别说50万了,5000都嫌多。

哼哼哼哼哼,super king啊,好嘞。

我们可以继续了吗。

但是呢在这儿我今天给大家介绍的并不是这个,我今天给大家介绍的是阿里开源的工具,这个工具很有名,目前用的特别多,这个工具名字叫做阿阿尔萨斯,叫s好听,我讲啊,作为asset来说。
是阿里开源的中文文档的工具,今天呢我带大家用一下,但是我不想带大家安装了,这个没问题吧,我不想带大家安装了,安装你们自己去玩,我让他跟着讲,安装就没劲了,好作为阿尔萨斯来说。

下载下来之后解压,解压开之后得到这个目录。

进到这个目录里去,我已经进来了,想执行它的时候,执行这个站文件就可以,它有好多种启动方式,这是最简单的java杠,这office杠boot要站回收,达到启动之后,它会自动地寻找。
你当前机器里面的那些个java的进程,目前呢只有119988号进程,在它的阿尔萨斯的内部编号里头叫做一,所以你调一阿尔萨斯,尝试着把自己挂到这个进程上,可能挂不上去了,因为他已经死了,重新起啊。
挂不上去了,稍等卡屏了吗,卡屏了吗,我还在吗,还活着吗,你们还在吗。

你们还活着吗,一输but an。

重新启动,我们重新挂一下,嗯ok,重新启动了小程序,我们在阿尔萨斯里面挂上它。

回头当你看到这个输出的时候。

说明阿尔萨斯已经正常的挂到了。

我们这个进程程,这个进程号是12202,这块能跟上吗,就是在我们整个系统里头,这是一java进程,阿尔萨斯的进程,在这里阿尔萨斯挂到这个进程上,然后对它进行观察好了,可以继续吗。
下面我来介绍阿尔萨斯它的一些个功能,这个不会s t w这个性能上会有所降低,但降的不多,至于会不会s t w的歌,取决于你要执行什么命令,阿尔萨斯完全可以替代我前面敲的,基本上能替代我们敲的所有命令。
而且他比较直观,大家看这里234他有好多命令,如果你不知道的话。

你就叫help就好了,help。

他有这么多命令,help key map,i c s m class。

loader,j d st,七八糟的好了,同学们。

在这些命令里面,我教大家几个,一个叫dashboard。

这是最常用最简单的一个命令,dashboard仪表盘回车。

他用命令行底下模拟一个仪表盘,在这里面它基本上综合了top那个命令和top gun,hp命令,以及这inf命令的一个组合,在这你能看到你的整个进程里面有哪些个县城,有哪些线程在吃cpu,线程。
吃cpu的都都放在最前面,然后线程的状态是什么,接下来内存占了多大一点,区占多少,survivor占多少,老年代占多少,非堆内存占多少,这些都是常用的一些参数的信息嗯。
所以这个一个dashboard搞定了,很直观,最关键的,最最好用的是,这个就是到底哪个线程在吃内存啊,吃cpu,你如果用jdk和top gun h p组合的话,你得来回的换算,因为他哥俩啊。

一个是十进制,一个16进制,我跟你说,这哥俩你得来回换算,但是你如果用阿尔萨斯的话。

直接一观察就知道了哦,原来是52号线程,它的线程名字叫pro 1 threat 39。

他在吃cpu,不知道大家听清楚没有。

嗯好这是第一个命令,我们继续,除了这个命令之外。

还有一些什么命令呢,help,看这个命令hdmp还用我解释吗。

这命令mod是吧。

hip dump替代谁的,替代哪个命令,能不能告诉我jim map是吧。

这太简单了啊。

hp dump,okay,take map对好。

还有一个命令叫thread回车,它会把整个你的进程里面所有的线程全给你。

列出来哪个线程吃cpu最多。

最关键,这个工具有一个特别牛叉的地方。

thread一条杠,help呃,第一个呢他的帮助非常的给力啊,完全有中文版,这虽然这是英文版啊,但它是完全有中文版,另外呢它有好多好多这些examples,你都可以直接拿来用就行了,特别简单。
来教大家thread里面最常用的一个参数,这个参数叫杠b看一眼这什么意思,读一下thread钢笔的,include blocking thread,啥意思,find thread。
who is holding a log that blocks,the most number of threads,啥意思啊,对查找死锁,查找死锁,你像我教你用jdk的时候,你还记得吗。
jdk如果你要观察死锁的话,你得去观察每一个线程,它是不是wait在同一把锁上,为了好长时间,这个时候有可能会产生死锁,你也会检查,但是阿尔萨斯里面一个命令就可以搞定了,直接敲,400钢笔,当然了。
我由于我们这个线程呢,我们这个程序它没有思索,所以他找不出来,norma blocking three f,如果是你自己故意写一个搜索程序,你用这个来观察一下,一把就给你找出来,好用点赞,可以继续吗。
还有一个名叫jvm jvm,当然这个命令呢其实很简单,他就是那个j infer,差不多他会把这个java的进程。

一些常见的参数是怎么设的,给你列出来哈哈这里面有一个比较好玩的。

你可以观察它的garbage collectors,就是它默认用的哪种垃圾回收器呢,garbage glectors,但你会你会发现年龄大用的是copy,老年代用的是mark sweep。
compact,一般max sweep啊,max web已经成了碎片化了,compact进行压缩。

好还有其他命令吗,还有这几个比较酷的。

这就太简单了,这几个比较酷的。

来我们来看这个命令。

可以跟上吗,新时代说抽奖吧,不抽不要带节奏。

带节奏,我先把你的名字给踢出去,我再抽奖。

为啥这工具不会影响系统性能,大哥我我哪句话说不会影响系统性能啊。

我说过吗,这个会影响系统性能10%到15%,好看这里,看这里教大家这个命令,这个命令叫j d k j d的意思是什么呢,就在这个命令的话,那我就换一个程序吧,不用这个程序了,我们换一个小程序。
clear在这儿还有个小程序啊。

这小程序呢叫。

叫t我们先来看这小程序。

there mt。java和正好看这里啊,这小程序。

我这个t这个小程序呢是干了这么一件事,你读一下很简单,sd变函数里面写一个死循环,这个死循环syneena read,我从命令行上读一个字符进来啊,读一次我就new出一个tt对象来调它的m方法。

mt 7点点了,com t t t t m方法怎么写的,这方法超级简单,就是system out prinline一就打了个一,所以你执行这个程序,执行起来就是这样子的,jvt回车输一个字符。
他要出出一个一输一个字符,出一个一输个字符,出个一输个字符,出个一嗯,这个输了三个字符,所以出了三个一好的小程序,能看懂吗,相当简单,下面呢我们通过阿尔萨斯挂了它,教大家一个命令。
就是j a d g a d的意思是反编译,叫java d compile,反编译java j a d t比这好。

你就会看到诶,他把整个呃源代码呢给你反编译出来啊。

然后你j a d t t等t t回车啊,在线反编译啊,给你反编译出来,有同学在这儿就开始说了,老师你逗我玩呢,这破工具能有啥用啊,我代码是我自己写的,我还用反编译,我不是有毛病吗,来认为这个工具没用的。
给老师扣二,认为有用的给老师扣一,有扣二的吗,没有吗,啊还有的说太有用了,还有扣二的说没有用,来凡是科二的,我估计你们就是在小p公司里,一个小p工程师拧着一个小p螺丝,为啥呢,其实啊。
在一个超级大型的项目里头,是由很多个团队共同把代码往上写,a团队的代码有可能依赖b团队,b团队,一个程序员把整个程序上运行起来之后,发现代码怎么不对呀,我检查我自己代码也没问题啊。
为什么输出结果是不对的呢,本来这里想输出的是二,结果你问您老人家为什么输出的是一呢,好我听你听我讲,你这时候怎么查呀,这个时候你如果怀疑有可能a团队用错了,b团队的版本版本,听懂了吗。
很有可能是a团队用错了b团队的这个版本,我的第一个版本里面输出的是二点,二版本输出的是一,结果你用错版本了,你输出的不对,并不是我b团队的问题,我怎么定位这个问题啊,没办法,在线反编译对。
先开始开始扯皮啊,两个两个那个那个哎。

为什么我这图像是模糊啊。

关闭摄像头,重新打开,诶为什么这么模糊呢,有点模糊啊,大家凑合看吧,对两两个小组的组长,a组和b组开始扯皮。

看看谁嗓门大,互相猜忌,然后论证,这时候呢其实很简单。

去上线反编一下,看看正在运行的是哪个版本就搞定了,剑走轻灵长的模糊,对你是怎么知道的,我用了好多锐化技术才达到这种情形,混淆过的代码可以反编译吗,反编译,不管你什么代码,当然可以反编译,只不过混淆之后。
他反编译出来是那个混淆的那份代码,好了不知道这个问题大家听清楚了吗,在线定位一些问题,bug到底出在哪啊,这个反编译工具很重要,很有用,这ad是哪个命令,exception的名字是哪个,哎呦我的妈呀。
这ad是哪个命令,你还要问我,这d命令当然就是这d了,大哥,那,idea自带反编译来super king,super king的提出的问题总是能触及灵魂,super king的意思是说。
当你这个程序在远程你的服务器上运行的时候,它可以用idea远程连上去,给你反编译下来,哎呀super king,你赶紧,你这个骚操作如果能做出来,赶紧教我一下啊,佩服啊,简直实在是太佩服了啊,我。
可以用javp好,可以可以可以完全可以好吧好吧好吧,你你你们别搁这扯了啊,那个凡是提出奇奇怪怪的问题的那些啊,奇怪的知识,奇怪的问题啊,奇怪的问话你就不要再提了,好好反思你自己。
你就是那个小p公司的小批螺丝钉,记住这个就行了啊,好嘞,来我们继续,那现在下面我再讲另外一个比较酷的,比较酷的这样的一个命令,这个命令叫redefine,redefine,好redefine是什么意思。
define,define是定义,如果你学过老师讲的class loader,你就应该知道这个东西呢是定义一个class,用的是可以修改一个class的,relify叫在线修改class,啥意思呢。
仔细一看,现在这个小程序,当我们敲回车再输出一,一敲回车输出一,但是经过定位,你用错版本了,我不应该输出一,而应该输出的是二,那么这时候怎么办呢,一个骚操作是这样子的,注意看我不要把程序停掉。
你继续运行,我干这么一件事儿。

我干这么一件事,vm tp点点,我把这里的一,直接给改成二,存盘退出,然后呢加了c tt,改着把它编译好,把这class上传到远程去,这是我本地上传到远程,接下来在阿尔萨斯里面redefine。
root下面的tp。class回收,redefine成功之后,直接在原来程序上回车,诶已经变成二了,这又是一个骚操作,当然有同学可能就会说了,老师这破东西有用吗,我难道就不能本地代码改好了,把一改成二。
编译好了,把原来的程序覆盖掉就行了吗,原来程序停掉,等我改好了覆盖,然后不就搞定了,对不对,你没事,在线改,你不是有病吗,来认为有用的老师扣一,认为没用的扣二,那又有人说可太有用了是吧,嗯李晨啊。
李晨扣二扣二的不多,特别有用是吧嗯,你们该担心这种权限问题的,那是人家运维的权限的管理,跟这有半毛钱关系吗,担心的问题都不知道,担心在哪,这边你跟你媳妇结婚呢,你担心的那个美国那边要大地震着火了。
这不扯呢吗,对在线改代码,这个呢最关键的点呢叫不用重启你的在线程序,听懂了吗,因为什么呢,如果说敲二的,您,您还是那个小p公司的小p螺丝钉,为啥大企业做项目,做在线项目,我就问你这在线项目能随便停吗。
随便说哦,我这有一bug来把它停掉,等我修改完了之后,传上去,发现产生了新的bug,没事停掉,传上去能这样干吗,大哥,你知道在一个大型的公司里头,咱不说大型互联网公司,说银行吧,银行一个系统上线。
上线之后启动开始服务,经过多少多长时间呢,多长时间的审批,有没有在银行呢,有没有,挺好发公告的对啊,一周两周很正常吧,就是一个新系统上线的审批过程,很可能就要一周两周,长则一周两周,短则一天两天。
就为了修改你一个特别小的bug,你得把这些东西全部停掉,如果是大bug,灰度恢复原系统,如果是小bug,直接在线先把它改了,双11马上到了一个小时之后,秒杀开始了,你的这个价格原来是100。
你不小心写成了1000,你怎么改啊,能停掉吗,没关系,直接在线先把它改过来,等下一个版本升级的时候,整个bug全部覆盖成新的,这就是救命用的紧急救命用的,好了,集群用脚本批量执行提问,对啊。
你集训只能用脚本啊,没错,一般都是救命用的,毕竟不是特殊的情况下都特别有用好吗,这个是阿尔萨斯的骚操作之二,还有一些其他的骚操作,你想看吗,比如说我前面讲过的,你怎么定位一个系统的系统瓶颈呢。
阿尔萨斯是可以的,就还写错了,一会教你阿尔萨斯的下一个骚操作好吧,你看银川宁啊,我就知道有人得有人问这个问题,炸包情况下怎么操作呢,哎呦我的银川宁啊,我的银川宁,你你你先拿大腿给我想想这波操作怎么操作。
其他同学也帮他解答一下,指向炸包里,哎呦我的妖娆尾随你,赶紧嫁给银川宁,你们夫妻两个叫做对眼儿水平一致,嗯大哥我就想问你啊,各位小伙伴们,在jvm的内存里有炸包这件事情吗。
有没有有没有一个炸包在jvm内存里,炸包是干嘛的,里面装了好多class,放在硬盘上,jvm启动的时候,从这个炸包里面解压,把这class漏到内存g y m管理里边,有没有什么炸包啊,对你咋不说落包呢。
没错啊,你咋不说zip呢,你咋不说l r呢,你看super king又问了个突击灵魂的问题,super king问的问题一般的水平都比较高啊,super king什么的,v i p中p只要他说话。
所有人都会停止,认真看100台服务器怎么改呀,不能一个一个改吧,怎么改,写个脚本呗,写个脚本批量改呗,good,holy,好了,九点半了,我我怎么说来着,九点半是九点半,是开一个二等奖是吧。
嗯那个听我说啊,你已经录入过信息了,就不要再录入了,如果没录入过信息的话。

微信搜索马士兵老师服务号,点抽奖,抽个二等奖。


一会儿我们抽个二等奖好不好,万一我又中了,你中了不算alan,我定一下规则,alan中了不算,那不可能能换吗,然而并不能,好好好好好,嘿嘿嘿,李先生嗯,来给大家几秒时间,没有录过信息的。
抓紧录完了再老师扣一灰,没看到我的名字,哭了没,无图无真相啊,你到底哭没哭啊。

没有哭的话,其他人吧,打哭,好我们准备开始抽奖,这个奖品是小米手环三,一恭喜张文来,张帆你在吗,张温在吗,张文在吗,不在我们就不算了,不在张弛啊,bug好了,不是bug啊。
这个是人家开发那边给起了一个新的地址,昨天我用的是那个老地址,不是人家开发的问题,是我的问题,好嘞好嘞好嘞好吧好,恭喜张万啊,自己去截屏截屏。

好我们继续讲我们的骚操作好不好。

开完二等奖,大家别着急啊,就算你今天没有奖品,课程结束,每个人都送一本书,ok跟着老师把课程结束,陪着老师聊会天好,每个人都送一本三选一,我填了个贼长的名字,没看到过会有的面包会有的,好好了。
我们继续来看另外一个骚操作,这骚操作呢我重新起个小程序啊,这个小程序我忘了,有点小程序叫a b c,我记得a b c。dea ma b c点占了,先读一下啊,clear moa abc点点a来读一下。

小程序很简单,看能不能读懂,看一眼,十几秒钟读一下,还有这小程序干了件什么事,new了,就在for循环里面,main方法里面new了一个a abc点点,a调new了a b c调用它的a方法。
这a方法呢是睡了一秒钟之后掉了b方法,b方法睡了两秒钟之后掉了c方法,c方法睡了三秒钟,哼哼哼,很很简单啊,好听我讲啊,就这东西呢,呃我主要是模拟每一个方法的调用栈,就是这里面你一定知道a是调用了b。
b调用了c,然后我用sleep模拟的是什么,sleep模拟的是我业务逻辑,在里面执行了多长时间,大家应该知道作为一个系统来说,有的时候呢,你会观察到你的系统显示速度特别慢,这种的呢。
我在我们学院里头呢已经遇见过好多次了,他说老师我这个系统呢想要速特别慢,并发量特别低,比方说这个并发量,你你做一个压测访问我的a方法,发现我设计是要达到1万的q q p s。
但实际当中呢我只能达到100,原因是啥,原因很简单,一定是a方法执行速度特别慢吗,本来设计之中是10ms完成,结果你500ms完成一次,你一秒钟也就执行了20次,听你听懂我意思了吗。
同学们这块大概知道什么什么意思吧,ok就说我们要查的时候,我们我们我们不知道这个系统的性能点,到底的瓶颈在哪呢,是a呢还是b呢,还是c呢,这个调用栈有可能非常长,c又掉了d,d又掉了f,f又掉了e等等。
这调用站可能特别长,这个链路上,整个这条链路上到底是哪个方法出问题了呢。

阿尔萨斯可以帮我们干这件事,好这个过程中我说清楚了吗,可以继续给老师扣个一来,true boy,你看人家是真正的男孩,他说链路追踪,这叫单机版的链路追踪,单机版的就是你在这一个jvm内部里面。
a掉了bb的lc,但如果是微服务版的呢,这个服务调用了另外一台机上的另外一个服务,他又掉了其他的服务,他又调了别的服务,好,这个叫做分布式链路追踪,今天我给大家讲的是单机版的阿尔萨斯就可以。
这个呢如果你要用分配链路运动,zip can,sky walking都可以好吧,这单咱们vip课里全都有,好听讲234就可以,当然这种工具特别多,除了s之外呢,好多好多其他工具都可以用。
比如j profiler profiler,但是dk自带的还有一个命令,我忘了叫什么了,其实也可以命令很多,但是阿尔萨斯的很好用,这个东西是收费的,这profiler收费的。
jdk自带的呢相对于阿尔萨斯的难用,所以我讲阿尔萨斯这个版本好吧,好看这里厚德载物,厚德载物,不要停啊,你居然你居然说的是名字,是我们的学校的校训,赵清华的校训是什么,自强不息,厚德载物是吧。
清华的校歌是什么,清华的校训是什么,忘了啊,你们知道北大的小哥是什么,肖俊是什么,小辉是什么,没有啊,北大的全没有,所以北大又称三无学校,北大每年那个都探讨,说我们距离国际双一流学校代理还差。
到底还差多远,一般情况下呢,我们都会告诉他出你们东门左转1百米就到了,就差1百米,嗯北大就是这么一个牛逼的学校啊,开个玩笑啊,我们继续,我来我们来来来来,追踪整个呃这个链路到底哪出了问题,这怎么追踪呢。
我们先把它跑起来,java a b c在这依然是挂上阿尔萨斯,挂上阿尔萨斯,一回正好这次我们的命令是什么呢。

是这个这个命令的叫trace。

trace的意思叫trace the execution,time of special method invocation,看一眼这啥意思啊,trace这个没这个方法的执行时间。

trace your help。

呃来看看它的例子程序就知道了啊,trace这个类名。

然后方法名啊,来trace下trace。

abc方法名是a随着。

然后他就开始trace这个方法,effect class count one。

count one coin,这是他方法的分析过程,看到了吗。

他分析出来了,他说他分析了好几次。

他说你看那个我执行a的时候,我执行了六秒钟,我的老大爷哇,你会发现哇,不会吧,我a设计的是500ms,你居然给我执行出六秒钟出来,什么情况哦。

他给你定位。

在a里面自己睡了一秒钟,给你跟踪出来了。

我的我的娘啊,所以b一定是有问题的。

这能看懂吗,能看懂的,老师扣一。


那既然您老人家必是有问题的,咋办啊,追b吗,看看b是啥情况,怎么回事,怎么执行这么长时间,好b追踪出来了,说b总共花了五秒。

他自己执行的时间是两秒钟,sleep了两秒。

但是呢他掉了c你会发现c执行了三秒,我勒个去c怎么回事。

c一定一定是有问题的,所以跟到c里面去嗯。

然后来看看,当然你一路追踪下来,你就会发现你这条链路上到底哪个方法,它的执行过程花费的时间太多了,剑走轻灵啊,前几天刚调试完嗯,剑走轻灵不错,super king啊,这功能好哇。
遭到了super king的表扬啊,今天晚上没白讲,vip有这些吗,必须有的歌,我公开课都有的。

系列 6:P43:【2023】大厂职级晋升体系 - 马士兵学堂 - BV1RY4y1Q7DL
呃我就从大厂的职级体系聊好吧,呃想对阿里的职级,我觉得拿阿里的这一体系,实际上阿里的职级体系呃,跟这个阿里阿里是双序列啊,就p系列和m系列,一个是技术,一个是管理,呃咳咳咳。
对其他人的那个人机体系我没有拿嗯,但是我告诉你啊,那个你像阿里的,腾讯的,百度的,京东的基本职级体直击体系都差不多,无非就是说这边是l7 ,那边是p6 ,大概是这样的一个含义,这边是t5 。
那边是p6 ,就这点区别呃,这是一个嗯,职级体系它怎么设计,为什么是这么什么这什么这么设计成这样的,我就不多说了,我主要聊大家比较关心的呃,就是什么样的人会是p级,然后呢。
他主要是那个那个那个那个主要的能力,是在是在哪个层面上,好吧,那么关于这个的话呢,你可以完完全可以到我们的网站上啊,就是嗯找到我们m c a的这个课。

他的课程介绍里面,我们在这里呢做了一个自己的,非常粗浅的一个总结,但是大家伙可以作为参考呃,首先我跟大家说一句啊,这个p5 是一个什么,直接p5 是一个入门级别的大厂,入门级别的直径。
实际上以前阿里是有p4 的实习生呃,但是后来p4 这个直接就不招了,现在基本上就是p5 ,p5 是什么样的人,会是p5 呢,按理说应该是0~3年,他们认为你是p5 好,也就是说你社招3年以上的。
那直接就是p6 了,但是到在目前的情况下来说呢,大多数的情况下,作为p5 是你刚刚毕业的应届生,应届生往往是定级p5 呃,不管你是本科生还是研究生啊,我这里没有提专科,因为专科批我这个直接你进不去好吧。
刚刚毕业的应届生,然后呢大概在你工作,你比方说你最开始的时候没有进到大厂里面,你进到了一家中小厂工作3年左右,哎你社招通过社招进到大厂了,这个时候往往是p6 ,然后你在你项目组里头。
慢慢成长为带那么四五个人,这个时候你往往是p7 ,当你负责完整的整个的项目组的时候,我告诉你,你这个时候大概你手底下是几十个人的,这样的一个一个一个规模的时候,大概就是p8 了。
当你手底下有不同的技术团队,包括业务团队的时候,你这个时候就是p9 ,那个如果从呃薪资的角度来说,p5 的薪资的话呢,大概是20万~40万左右,那么如果是从。

p6 的薪资来说呢,大概是40万~60万左右啊,呃如果是p7 的话呢,大概是50万~70万,但是这时候是有股票的,就是大部分p7 是有股票的,只有少部分没有,因为阿里有一种文档,p7 也比较好玩啊。
他专门写文档的,他那个薪资就低很多,50万70万,大概再加上8001200股啊,那个股票比较值钱的时候呢,这个差不多p7 的薪水能拿到120万左右,顶薪,哎我讲到这。
有没有同学想想看看那个p7 的简历的有没有,有没有,有的话,我给老师扣个一来,3年以上还可以面p5 吗,3年以上你就要奔p6 去了,你为什么还要面p5 啊,干嘛这么看不起自己。
我我我给大家看一个非常牛逼的简历啊,这个是顶薪的,120万年薪的简历,我找一下,这个呃这哥们儿当时是29岁,拿到的是阿里的p7 plus,它不叫p7 ,这个叫p7 plus。
我一会儿给你解释什么叫p7 plus,p7 plus那个呃100就是80万的正常薪资,外加40万每年的股票,就类似于大概的估算的值啊,120万年薪呃,你们也可以呢读一读,看看看这个简历呢。
自己能不能罩得住这个简历呢,如果你仔细读的话,其实你会看得出来,那个这里面最重要的最值钱的点到底在哪儿,5年java开发经验,其中3年以上全是大型系统架构设计经验,3年以上团队管理经验,分布式高并发。
高可用大数据量的系统架构设计和研发经验,好了,这是最值钱的,当然目前政府的什么注册用户多少,日活多少,日访问量多少,这种的比较吹牛逼的啊,这实际当中的数据很可能到不了这么多,对开源源码有过深度阅读,好。
从这儿呢你大概可以看出来,p7 到底是一个什么样的水平,架构设计,源码阅读,这就是为什么我在课程里面,会给大家这么设计的原因,明白吧,嗯就是老师的课程设计,不是说随随便便给你设计的啊,为什么要读读源码。
读原理,为什么要做架构的设计,其实就在于这就是希望你们能达到这样的水平,但不是说每个人的薪资都能达到120万,不是那么容易的呃,取法乎上得乎中,取法乎中得乎下,你的目标定的高一点,哪怕没有到。
你跟其他人相比,你都是赚的,你的目标本身就定得非常低,我今天就吃掉一个饺子,你就算达到了,你也就吃了一个,我今天要吃100个饺子,然后就算没吃完,我吃了50个,那我比你这一个也要牛逼的多得多好。
这是它的一些个技术站,这些技术站咱们课程体系里全有呃,可以这么说,我的很多的课程的设计,是根据咱们同学们遇到的各种各样的问题,来设计的,那个这这这这全是一堆一堆精通了啊,这个你放心啊,呃其实看上去很难。
但是呢不是想象中的那么的难,无非就是你需要掌握架构的一些个技术,选型是吧,当然最新的还有power啊,然后呢搜索上的一些技术选型啊,这种那种呃这个持久化的一些技术选型,缓存的一些技术选型等等,就这么多。
加上一些底层的知识啊,呃他这个呢还没有写算法,写太多啊,其实还需要有一点算法的知识就ok了,这背后究竟付出了多少,不要不要羡慕别人,我有的时候会说可以拿别人来举例子,但是呢每个人的路啊。
每个人的人生路它都是不一样的,你不可能完完全全的复制另外一个人的人生,跟自己比就ok你比自己更强了,今天我比昨天强一点点,明天比今天强一点点,时间稍微一积累都不用长,几个月的时间。
你就会发现你已经脱颖而出了,其实就这么简单,那个,你们你们你们,你们想知道那个那个那个他现在的一个状况吗。

这个这哥们儿,是是咱们史上最牛逼的一个学生啊,史上最牛逼的学生,你找一下他现在的一个状况,呃这里是大概有1000多位我的学生,然后做的一些个小小的总结和聊天的这个过程,你找一下啊,嗯就是他。
呃这个呢是他那个最近然后拿了5000万的股票,套现之后,然后从公司离开啊,做了一个小小的总结,就是p7 的一些一些一些内容啊,p7 说到底是硬通货,是个分水岭,这里面需要你掌握什么,需要你掌握什么。
需要你掌握什么,k大家可以到这个网站上去访问访问看看,这里面都是很多同学非常真实的聊天啊,你们看看就知道了,那个呃当然还是那句话啊,就是这种的比较极端,我也绝对不会说奢望。
说我们每个人都能达到这样一个水平,我在他这个年龄的时候,也达不到这样的一个水平,好吧,所以大家呢也不要说太羡慕,这个也没也没有意义,但是呢最起码这份简历会给你指出方向来,我们可以朝这个方向去吧。
我们今天啃下来,其中的一小点儿是不是就进步了一点点,我说今天我们甭啃别的,我今天啃了一个分布式事务,这东西不难的,咱们一堂课里头呢,差不多你花个三天,顶多花个三天左右的业余时间,就能把这搞。
就能就能够把这个搞定,你知道吗,我们是不是搞定一条,我今天不干别的,我就聊一个自动化部署,我今天不干别的,我就把docker给搞定了,你想想看这个三天,这个五天,然后那个七天加起来的话能有多长时间。
最重要的是你根本没有必要每一个都全部精通,面试的时候,我说过了十家乘两家就可以了,不用面面俱到,这大家能听进去吗,天神下凡对什么学历啊,学历相对比较好,985,浙江大学,浙江大学是985吧,嗯肯定是啊。
当然我说到这很多学就开始给自己找借口了,老老哥,我是大专,所以我不如他很正常,因此我又可以安心的躺平了,我说我再给你说一遍,我说他这个案例不是要你跟他比,而是要你建立起来跟自己比的感觉。
你今天要比昨天强一点,以他的这个技术为目标,你能听进去吗,就是你天天跟比尔盖茨比,那你这辈子永远完蛋,你天天跟埃隆马斯克比啊,你这辈子就别活了,所有人都别活了,对不对,跟自己比,我今天比昨天强一点。
明天比今天强一点不就成了吗,能忽悠大钱的背景肯定背景必须放光,这就是背景背景决定论吗,来我想问你那个马云背景怎么样,马云985的对不对,马云是杭州师范的大专生吧,如果没记错的话,任正非是原来当兵的嘛。
对不对,英语老师对啊,所以不要找借口,我跟你说,你所有的这些这么说的,其实都是在暗示自己,我没有他的硬件,所以我有自己的不成功的借口,其实就是这个给自己一点心理安慰吗,我是种田的,对,好了。
但这个就比较夸张了啊,我们想想想起来了,拿这个举个案例呃,这是一个p7 的薪资,那p8 的薪资的话呢,多数人应该是到不了的,呃到目前为止,我直接培训的学生里头还没有,还还目前啊我跟大家说。
确实我还没有能把一个人直接嗯,学完咱们课给干到p8 的,i'm sorry,我这个还确实还没有干到,因为p8 呢真的就很难培养了,他的这个薪资呢大概是200万呃,就是按照官方的说法。
应该是120万~200万啊,这是这样的一个薪资,那么这里面呢就有很多很多的非技术的因素了,技术层面我完全可以让你到这个水平,但是非技术层面我也在尝试,目前呢也有一点点好一点的的好消息了啊。
就是这这这这种层面的也,我我也在给大家做尝试,就是课程体系里面,为什么给大家要增加团队的管理课,产品的管理课,其实呢就是想让大家在你以后的职业生涯里头,走到高端的时候,也能够还有空间呃,到现在为止。
我是我们现在有一个学生啊,我在我的微信里已经把它给置顶了,我只有一个学生,他已经灭了七面了,明白吗,他现在念p8 ,他灭了七次了,已经灭完这七次之后呢,还有第八轮的交叉面。
就是为什么说那个那个那个那个那个那个哥们,说那个我靠,这灭了,灭了七次了,还没这个p8 定级太难了,确实非常的难,然后呢还有最后一轮的交叉面,因为什么,因为他要求的定级太高了,所以就一一轮面一轮面。
一轮面一轮面,然后很多人都认为你确实到这个程度之后,才会给你这个职级,当然这个职级到来的时候,就意味着200万年薪了,ok,据我知道的,从京东呃跳到高德的,就是那个有一本书叫一级流量。
我不知道你们了解过没有,那本书,它的作者就是从京东跳到高德啊,我当时微信联系了,说给咱们来讲讲课,然后呢高德实在太忙了,高德可能是阿里里面所有最忙的bo,然后那个没没有时间讲课啊。
不然的话呢把他请过来讲讲课呃,从京东跳到高德,大概是据我了解,应该是这个数400万,所以小伙伴们你首先要敢于想,就是你要知道呢,这个世界上是有好多好多潜力的,你首先你你的潜力呢也不要想那么高。
我现在拿12万好,我明年的目标能不能拿到18万,听懂了吧,这就是一步一个脚印的扎扎实实的,今天比昨天强的,非常科学的一个一个目标的顶级,ok怎么说呢,机会有的是啊,在这里呢大概是1000多份。
1000多位的同学啊,好同学说,老师你做假放心,老师这里的全部的案例要有一份是假的,十倍学费赔付给你,你随便找,你想找任何一个人,说他的那个那个找他联系方式,只要他同意,我都可以给你联系上啊。
嗯怎么说呢,这里面的案例呢就是不同的人,不同的案例都多的是有顶级的,我刚才介绍的都是顶级的案例,当然也有呢刚刚入门级别的,我还是那句话,就是路是一步一步走的啊,比方说入门级别的像什么样子的呢。

这种的最开始呢原来是拿8000块钱,然后学学四个月给拿到1万,14000还可以吧。

1年就7万多呀,这就是学习的收获啊,当然扯得远了,我们翻过头来再来看看啊,就是什么样的人可以到p5 ,什么样的人呢可以到p6 ,什么样的人可以到p7 ,他到底是都需要哪些哪些东西。
呃我刚才呢给大家讲了一个概念,这个概念呢叫什么呢,p7 plus,你们这个你们知道这个plus是什么意思吗,有没有知道这个plus是什么意思,s p p最高嗯呃我想问大家一个小小的问题。
那个这里有一堆p6 ,1233个p6 ,我要在这三个p6 里面挑一个人做晋升,升值为p7 ,来你告诉我谁会升上来,谁会升上来,当然有同学跟我就开玩笑了,开始是吧,长得漂亮的,平跟那个考考评官有一腿的。
跟考评官关系好的,首先第一点呃,高级别的晋升并不是只有一个考评官,也不是只有你熟悉的那个呃,第二一点,长得漂亮跟漂亮,长得漂亮确实有点优势啊,但是呢他肯定不能不是决定性的因素,好好听我说。
如果我要在三个p6 里面挑一个p7 出来,那么我一定会找那个优先,已经开始做p7 事情的人,能听懂吗,我再说一遍,如果我要在一堆p6 里找一个p7 出来,我一定会找那个已经开始在做p7 事情的人,好了。
这个就是p6 plus,同理那个就是p7 plus,就是我为什么说在你们平时工作的时候,要多承担一些,多做一些,不要老搁那斤斤计较,我给我这点钱,我就干这点活,我多干点我就亏了。
我我是真的遇见过这个这样的人,这样的人最终的结果就是滚蛋,没有别的,所以让自己就是简单说提前一步好吧,来听进去的,给老师扣个一啊,讲点儿,今天感觉讲的比较碎,因为主要我没有给大家解释为什么自己体系。
典型的自己体系什么样,以及呢他的一些个各种的说法啊,我简单跟大家说一说,也就是大概是一个什么样的,什么样的,什么样的一个一个一个,一个水平吧,就是p5 呢他大概做了一些哪些事情啊,p5 大概是这样的。
它叫做,直职级的入门就是新兵啊,给你一个模块,独立完成就是给你个程序,在别人的指导之下,我告诉你啊,这个这个东西要完成这个业务诶,然后告诉你用什么技术好了,你能独立完成这个基本上就是就是p5 。
听懂了吧,然后呃作为p6 来说,就是你独立开发某一个这个不能叫模块啊,就是p5 来说就是某一个模块的分支,就是一个小程序啊,独立完成你自己的一份呃,编程的工作就这样简单。
那么p6 呢可以独立完成一个模块模块级别,那么p7 的话呢实际上就是项目整个项目级别,你可以带领团队来完成整个项目,好吧,呃基本上大多数人呢是集中在这三个职级啊,我目前只有一个学生在冲p吧。
他冲不冲得下来,冲不下来,我会告诉大家冲不下来的话,我也不会跟着吹牛逼啊,那个呃作为p5 来说呢,一般来说我刚才说过了,就是应届生,所以呢你社招生呢也就别搁那玩。

什么这种这种这种玩玩屁股了,这个外包能去吗,来同学们外包能去吗,每每天都会遇到这样的问题,老师那个外包面了一家公司啊,中软国际这个能去吗,有同学说不能工资高就去,还有同学说,各位同学们。
我觉得问这种问题的呢,这就是我我我再推荐大家一本书叫批判性思维,批判性思维,那这不是输了,就是一种思考方式,同学们听我说那个呃,你你们了解批判性思维的本质是什么吗,就批判性思维的本质好多。
好多人说说我看到一个想法的时候,我要怀疑他到底对还是不对,我要做一个对对对,杠精啊,这个hahy说的特别对啊,杠精批判性思维就是杠精,但实际上这不是批判性思维的本质,批判性思维的本质叫做批判自己。
注意不是批判别人,是批判的自己,是你自己有某一个特定想法的时候,一定要多方印证,好好考虑一下自己的想法,有没有什么pillow和bug是批判自己的思维,大哥这杠精是批判别人的思维。
所以好多人把批判性思维这件事情理解错了,所谓的外包到底能不能去,我就觉得特别好玩,问这问问出这句话来的人都觉得特别好玩,你知道为什么吗,我就想问你为什么不能去,难道去外包会死人还是怎么着。
所以这句话本身问的就有问题,所有问这句话的人都被我怼回去,我说你有没有其他选择,听懂了吗,假如他说我有一个外包中软,我另外还有一个东南亚的机会,那我应该选哪个,那我外包能不能去,你得这么问。
你有没有其他选择,如果你只有一个选择,不要提外包啊,你就是凤姐儿,你也得老老实实的该进洞房,进洞房好吧,但是你有两个选择,一个是凤姐,一个是杨超越,那你该选谁,老师给你提建议好,不开玩笑。
我们说外包这件事情到底能不能去,当然能去,为什么不能去,外包的很多很多人的这个呃,他进大厂之前的经历就是外包,那还需要你建议,万一有人选封顶呢对吧,外包当然能去啊,就是有好的外包的话。
他做的项目也是非常不错的,他的技术也不是白给的,天天还加班是吧,给的工资又低,使劲让你加班,你说你的技术能不练吗,得使劲练,听懂了吧,所以可以去,但是能能不能去,其实要有对比的,就是你有没有其他选择。
没有其他选择一定要去,为什么不去外包有方方面面的形式,比较有名的,像中阮了博宴啦这一类的,其实好多大厂也是认可的,当然还有一些,比方说有一类外包华为的ood德科,这个大家知道吗,德克主知不知道。
嗯华为的ood,现在华为的社招,不好意思,都从德克走,华为是让你想进,必须先进o d必须先进那个那个外包,ok外包能不能去,当然可以去,为什么不去啊,多个选择的时候再来问这个问题好吧,不要歧视外包。
外包没有问题的,他的好多的技术,用用的技术跟你真正的甲方没有区别啊,最重要是技术过硬,就完全可以去,华为社招不是停了吗,呃准确的解读,我给你解读一下华为的社招现在什么样,想认真听的,给老师扣个一。
我给你准确的解读华为的社招,华为社招现在是这样的啊,第一应届生没有停,985长呃,那个常春藤好吧,第25年以上的没有停,就是那些高端岗没有停,技术专家这种级别的没有停,停的是什么,0~5年。
大一11~5年这些,那么这些如果想去的话,先去德科,先去o d,然后ood呢,每年有百分之多少的机会进到华为本部,我忘了啊,大概是有百分之几十的概率进去,听懂了吧,权威解读啊。
因为我们刚刚跟华为达成的协议合作协议啊,给他内推,老有同学说我现在年龄大了,今天聊一个大的话题,就聊最后一个吧,就是你年龄大的,我跟你说年龄还大,技术还差,管理也不行,空间已经被挤得非常的小了。
我该怎么办,来同学们有没有,这其中有一个或者多个问题的老师,扣个一好吧,年龄大有多大,你们来来来,各位各位认为自己年龄大了,敲出来,我看你们有多大,年龄30 33,34,22 22,你搁这扯淡呢。
46 29,28,25,49,34,43,ok呃同学们,那个36岁以下的,你就别跟我这聊,年龄大了好不好,那个年龄还很年轻很年轻很年轻啊。

呃我们厂长别别的,我就不跟你说什么褚时健啊,不跟你说什么邓,然后不就不跟你说,任正非40多岁才创立华为,还差点破产,对不对,那个那个那个马云cs才30多岁。

就是你正当年是正当年的时候,麻烦你不要放弃啊。

有好多人说我35了,我以后怎么办,感觉要死了似的,以后就得去开滴滴,开饭馆了,大哥远远不是这么回事,课程体系里面有两位老师啊,我推荐你们去听一听,听一听。

跟他们跟他们交流交流,首先第一个是讲这个课,就是大型团队管理的p8 课,它本身就是p8 ,然后呢那个现在是38 九岁,应该快接近40好吧,现在依然是在那个团队里担任很核心的角色。
然后年薪依然是那牛逼的很啊,那就不不跟你说了,然后这哥们儿是已经40多岁了,ok p9 p9 的老师已经40多了,呃目前呢在那个也是一家大厂,我就不说他的那个那个那个背景,就是离开阿里之前p9 。
然后到新的大厂之后担任更加牛逼的角色,还是这句话,就是我最最开始就跟大家说过一句。

年龄大这件事情一定如果你现在有危机,一定是你原来规划的不够,学习的不够,提升的不够,这点大家能认可吗,如果你学习够了,提升够了,你现在具备了你这个年龄的人应该具备的水平,你怎么会没有空间。
他一定是有空间才对,当然有同学说,老师我已经这样了,我下面该怎么办,首先调思想,你还要一定告诉自己,我还有的是空间,哪怕就是这对你来说,这个鸡汤它也是一种正面激励,我再加一个年龄又大,技术还差。
管理也不行,空间还小,还是女生有没有感觉没有年轻人的活力了,还是女生对。

看几个小案例,看几个小案例啊,我找找几个女生的案例,女生进入美团拼多多京东,这是35岁的,40万年薪,也干到了70万,还可以吧,其实35岁的很年轻很年轻的啊,啊这个这个超级印象深刻啊。
这个这个是38岁的这个这位这位这位姑娘,我们是印象超级深刻,因为是给她费了太大的劲儿了,才把她给带出来,但是她带出来,他现在很牛逼的,现在又跳第二次槽,然后还嘲笑当时他们项目组的人特别弱,你你明白吗。
这是他当时的肺腑之言,我当时那个还还还挺感动的,非常感动,说说这句话,就是老师的成就感,就在于这特别想在公开课的时候多影响一些人,职业生涯中尽快走出迷茫,但人家会以为我是托儿哈,暂时只能忍着。
如果你觉得你的比他还差,那我就也就没什么太大脾气了啊,那个你们说,这个是39岁的大龄的程序员,我首先给大家一点啊,给大家做一个就是大龄的小伙伴们,给大家做一个做一个呃,这个这个这个小小的建议。
你们一定要听进去啊,嗯大龄大龄的女程序员,我觉得应该有一个这是大龄程序员,34~50的,也有一个40多岁的大龄的大专生,大龄的跨行程序员疫情的嗯,有一个40多的,但忘了是40几来着,43,43万。
还有一个40 40几岁的来啊。

这个这个呃,这个姐姐是44岁女成员,然后收到外企的offer,那个,这这他他搞定工作之后呢,也是肺腑之言啊,我希望给大家敲响一个警钟,你可以不跟老师学没有关系,但是麻烦你保持进步好不好。
这次找工作时间提醒提了醒,不会在温水煮青蛙了,他的这个,怎么说呢,他最后啊实际上还涨了新了,我不知道大家看看出了没有,鼓励一下那些大龄成员,我43岁女生薪水跟大厂不能比,生活工作已经拿了外企的研发薪水。
差不多选了这个,ok我问他就是那个薪资达到了预期没有是吧。

我说达到预期了,怎么说呢,你相信我一点,就是当你开始正视自己,心态放正,然后呢放积极了之后,开始改变自己之后,你一定会有收获,这个收获可能会大,可能会小,可能你自己没有涨,甚至没有涨薪。
但是呢你是不是心态上已经放好了,人是一个很好的心态呢,人这一辈子就这么几十年的,你保持一个很好的心态,也是一个很好的一种收获的,但是你只要心态好了,好多事情就会变好,你不信你试试看那个。
作为大连的小伙伴,我给大家一个建议,我不希望大家伙儿呃年龄很大的同学,38 九岁找到我,说老师你能不能给我找条路线,让我进大厂,大哥这是这是这是这是非常难的,老师目前规划了好多好多人进到大厂。
这个确实是啊,我们我们就从这里面搜大厂的名字,你就你就能找得到啊,就比如说你就阿里,这俩是五五十三五十三个呃,阿阿里的就是我们公布出来的啊,搜字节这个打12个,然后搜那个那个呃呃美团就是36个啊。
搜京东啊,43个,就是说其实呃进到大厂这件事情,在一个合适的年龄,合适的背景的情况下,老师帮你稍作规划,稍作指点,你就进了,但是呢有的人是强人所难,他非得说我学历又不怎么样,然后技术积累还不行。
现在年龄还大,38 九岁,40多了,老师你能不能帮我送进大厂,如果你送进大厂,哎,我就报,我就报名学习,你别跟我这扯这蛋,你爱报不报,你行就行不行就不行,你不行,你报了也不行,你行的话,那老师判断你行。
他他就概率就高的很,就一定能行,呃,同学们听我说那个理智一点啊,如果你提出这样的要求来,说明你没活明白,38 九岁了还没活明白,你这是人生的失败,这时候你应该对自己的最理智的说法,是一个什么样子的。
认真听,应该是建立在提心上,提高收入上,这是最简单的提升你生活质量的办法,就是提收入,当然还有一种呢就是你追求你下一步的呃,更好的职业的规划,比如说我想进外企,我想进到甲方企业。
我想进到那个非it类的这一类的企业里头去,然后考虑我后面养老的事情了,这个也很也很务实,也很科学,也也相对靠谱一些是吧,提收入这件事情,老师有的是办法啊,你年龄多大,老师也能够找出办法了。
能让你把收入提上来,这是比较简单的,不难,可以这么说,报名马士兵教育的还没有说薪资涨不了的,就是多少的事儿,少的也是5000以上啊,低于5000的就太少了,时间维度3~6个月左右还可以吧。
打个牛逼出来好吗,没有一个啊,没有一个w,说说完完不成这个任务的,那个,怎么说呢,就是你你把你的当,你把定位定位在题型上的时候,老是办法和手段就多了去了好吧,哪怕就是让你搞点副业,你也能把薪资提上来啊。
当然前提是你要保持正向的进步的积极的心态,这样才可以,做出改变,有一些那个年龄比较大的小伙伴啊,每个人的情况跟每个人的情况不一样,所以年龄比较大的时候,我就没有办法找到那种普适性的东西了。
就是没有办法说,我给你一个像那个嗯那个那个计算,计算机系的这种这种学生啊,这个呃本科的这种二二本的三本,二本的,一本的这种的进大厂的路,我们是没有办法找到,找到这么一条普适性的路呢。
这只能是每个人的问题,每个人分析啊,当然这个就比较麻烦了,麻烦一点好吧,进大厂不也是为了钱吗,我觉得你这个人生的格调,麻烦你稍微往上提一提,不然你这辈子会活得很痛苦,钱是赚不完的,也是赚不够的。
有多少钱你永远也是够不了的,你如果只是盯在钱上,那我觉得这就是你将来痛苦的根源呃,让你这一生活得充实一些,格调高一些,你会发现钱是自然而然就来了,好不好,把你的目标稍微定的高一点点啊。
进大厂的目标是什么呢,实际上是为了你更好的一个职业规划,职业的学历啊,就是职业的职业的一个经历,你的你从大厂出来之后,有好多中小厂抢着要给好多钱,也也要明白吗,嗯给大家看一个内推的。
111个一个一个小案例,内推呢我一般都不怎么给大家展示,主要是什么呢,呃内推这件事情并不能够让大家伙儿说,我降低学习难度,注意这是两回事儿,呃,这是字字节找我们做内推啊。
最近只要我们做内推的其实已经非常多了,就全国的一线大厂呃,我们都有都有渠道内推,这不是说那种吹牛逼的啊,就老师这儿不跟你们吹这种不靠谱的牛逼。

这是我们大概3月份那会儿。

疫情还没有这么严重的时候,我们跟那个呃微软,amd和京东联合举办了大学生的编程大赛,然后呢这个呢是我们带给京东做培训,呃,这是呃编程大赛的现场,然后在3月份的时候,我们和小米和百度,还有京东啊。
京东当时没有没有没有来人,因为他们疫情不允许出来,当时就在我们的现场啊,我们自己公司的内部现场做的招聘会呃,有的人呢应该是参加过啊,就是内推的渠道呢,老师这有一大堆一大堆一大堆的,就是你想进哪个大厂。
只要你水平够,我判断你水平够,这个内推的渠道非常的通畅,但是前提是你的水平要高,能听懂吗,所以内推呢我一般不太使着劲儿的说,我们有内推,我们有内推之类的,不一般不一般不会说这个那个怎么说呢。
他不会降低你的学习难度,你也不要指望着说你学习的程度不够,老师能把你推进去,这不可能的,一定是建立在你应技能过硬的基础之上啊,我刚才说的是什么呢,我刚才说的是,当你有了大厂的背景之后。
像这一类的非it类的大厂,那给的年薪是相当可观,龙湖地产年薪150万以上,你说他是t类的吗,她也不是谈工作会很累吗,也不会很累,但是你你要是有大厂的背景,我是美团出来的,我是阿里出来的。
我是和他这个比较相关的,比方说e r p拥有出来的,ok这是特定相关了,就属于ok我是平安出来好,你就有机会能够到这种企业里头,拿很好的年薪了,这是年龄大一些的人的,另外一条比较不错的路线。
不知道大家听进去没有,作为咱们年龄大的小伙伴啊,我就在这街上字节上班嗯,那咱们离得很近啊,我在蓟门桥,你如果是在防空中心这边,那我们直线距离就23百米,老师联想可以算镀金吗,我个人认为不算啊。
联想i i don't think,联想是一个镀金,呵呵我在学院路这边,那离得很近啊,可以过来坐坐,聊个天,喝个茶,字节,最近离职了不少呃,我们曹老师跟字节的人大概住一个楼,住的比较多,t m e算吗。
tm是谁啊,银行算吗,嗯银行的用的技术其实真的一般般,所以不能算科技公司参观吗,可以啊,我们搞线下活动啊,因为近期的也在规划线下活动,只要疫情过去,我们会找一些咱们大厂里头的高p啊。
p8 p9 p7 这些人来跟大家做见面会啊,你就会知道呢,深入的了解,就是他们的职业发展到底是什么样子的,并不是所有人的学历都特别好,呃,我给大家讲那个架构设计的老师曹老师嘛,他就是二本的学生呃。
黄老师24 五岁,今年是25岁了,黄老师25岁呃,离开美团的时候,85万年薪牛不牛逼,这就是技术牛的人啊,他的一个他的一个可以达到的宽度,好吧,t m e啊,腾讯音乐,酷狗k歌,这不就腾讯吗。
腾讯当然是大厂了啊,25岁对,25岁,想看看他的简历吗,他当时到阿里的时候是24岁啊,大概是60万年薪,那会儿拿,大家来看看好吧,呃我我我隐蔽了一些他的那个隐私啊,当然他这个是属于纯硬核,非常硬核。
ok非常硬核超级硬,这个全是基本全是精通,怎么说呢,他在大学4年没谈恋没谈恋爱,没有出去玩儿,不打游戏就学习了,听懂了吧,所以他付出努力了,当然就会有收获啊,他24 五岁的时候,比我24 五岁的时候。
那那那牛逼多了,ok,嗯怎么说呢,就一分耕耘一分收获,老师能向你提供的就是让你少走弯路,讲到这儿呢,其实我们的课呢其实我介绍也差不多了。

我也就不专门做什么特殊的广告了,简单说你想提薪的,你想进大厂的,老师早就帮你想的方方面面都已经非常透彻了,你也逃不出那1000多人的案例里头去了,你也没那么特殊,想多涨点薪水的。

系列 6:P44:【2023】如果进行高效投简历? - 马士兵学堂 - BV1RY4y1Q7DL
整个这件事情呢你一定要听进去呢,他的其实非常的简单,在我看来非常的简单,他只需要两步两步就够了,第一步叫投简历,第二步叫面试,各位兄弟们,你们好好想是不是本质就这两步。
但是呢很多人呢他第一步做出去之后呢,没反馈,来有多少同学是这样的一个情况,就说我简历扔出去,我没反馈,海投,如果你你你定你定点投放,没有人反映,你为什么不要还不要海投呢,是不是啊,同学们嗯。
嗯投简历没反馈好吧,一般多久才叫没反馈,多久谈不上吧,就是说没有没有人让你去面试,就是没反馈,能理解吗,这就是这个就是没反馈,甚至不知道往哪投,这个还有人不知道往哪投吗,你最差的是。
比方说你有一些呃公司,你特别想去的,你就找他的,上他的网站,找他的那个那个招聘的那个口子长去投就完了,听懂了吗,嗯第二个最差的你找找招聘网站应该知道吧,什么boss直聘,智联招聘等等,这些是不是呃。
第一个呢就是投简历没反馈啊,当然也包括说反馈不满意什么意思啊,找你的全是外包,全是中小公司,那那我想问你啊,你你们有没有反思过说你投简历,因为很多人投简历没反馈之后呢,他就会自己在那郁闷,他不想办法。
他是他是自己在那郁闷,搁那躺着,哎呀娘的那头角林没人找我,那唉算了,不投了,或者说在海投吧,再使劲投,其实很简单的一件事情,你好好想,简历的本质是对你自身的一个广告,就说明你广告打的不好,明白吗。
简历是你自身的广告,说明你广告打得不好,简历投出去没反馈,就是简历书写问题,没有其他问题,你们一定要记住这一点,所以你的第一步呢就是说如果投简历没没反馈,如果是这样的,改简历。
我们我我我我们为什么说说这个这个建议,大家呢,你你最好是跟老师练,因为老师没有一项服务是帮大家改好简历,这简历的真正改起来没那么容易,我们改简历的话呢,大概一般来讲啊,反反复复的。
差不多要三天左右才改好了,帮大家改好一份,那这份简历投出去可能就是大量的反馈,就是这个简历呢一定要投出去,有反馈,这个你的简历才算改好了,那有同学可能就会说说老师我简历,我我会的东西特别少。
我写投简历来,那肯定就是没有反馈,这是第二个误区,这是第二个误区,第二个误区是什么呢,第二个误区是认为简历要跟实际水平完全匹配,这是第二个错误认知,嗯这么跟大家说啊。
呃有有的人呢他的水平甚至说他不是完全匹配,他还要简历水平还要放低一点,他放一滴一点的想法是说我真正的水平,比方说是80,我写出来简历呢只有60对吧,那么别人问我的问题都是60的,我作为80的水平。
我回答60的问题,我叫做板上钉钉,我只要有人找我,我我面试就能通过,只要有人找我面试就能通过,我很开心,我受不到任何的挫折,我的自尊心呢也不会受到任何的打击,我不知道有没有同学犯这样的错误呢。
就是你真正的水平是80的,你的简历上只敢写60,有没有有这样的吗,有同学们有没有有的给老师扣个一有吗,有是吧,毛子嗯,然就是今天呢,我们大家111的分析各种各样的问题啊,如果你没有的呃,都没有关系。
你就你就听啊,看看后面有没有跟你匹配的,或者把你等我讲完之后把你的疑问告诉我,好认真听,其实你想想看这件事情你是亏了啊,是亏的,为什么会是亏的呢,比如说你80,我们讲假设你对应的水平是4万的月薪。
但是呢你你面试的时候面60,别人认为你水平只有60,最后给你的会是3万月薪,也就是说你4万变成了3万,你本质上是亏损了,但是你你的好处是什么,你的好处是面了十家,成了八家,你非常开心,这就是你的好处。
你明白吧,你那个脆弱的自尊心啊得到了加强啊,没人打击你,那么我们假设有另外一个另外一个是什么呢,另外一个它的真正的水平呢只有80,但是他写了100,他写了100,但是他写100这件事情呢。
其实他面试的时候会遭受到很多挫折,可能面一家同,不过两家同,不过因为别人问他的问题,很可能是超越他的认知的,那么他下面他下面来做一件事情,当然如果你有老师辅助你,你把你的面试的那个过程录下音来说。
老师哪个哪个问题,我认为回答不好,你听听看这个老师会给你反馈什么地方不好,这个是最好的啊,如果是说没有没有也没有关系,没有你就好好回来反思,今天问了我哪个问题,我现在没有回答出来。
那么也就是说我缺某一个地方,缺我的知识,知识版图上缺一块儿,缺哪儿补哪儿,那我就赶紧补上去,当下一个人再问到我的时候,我我一定要回答的比上一次要好,这点大家能理解比较简单啊,今天问了我个问题。
mysql调优没,我没答出来,那没有关系,下来之后哪怕零基报废掉,赶紧补,补完之后,下次再问到,我一定比上次好,这时候呢大概是会造成一个什么现象呢,差不多你十家里头有可能只能乘两家,这也是很正常的。
那跟上一个比呢,就是人家是十家乘八家,你是十加成两件,但请注意乘了这两家给你的薪资很可能是5万,你真是个水平还是4万,那么你想想看这两种的玩法,这两种玩法到底谁亏了,谁便宜了,第一种呢它的它会很顺很爽。
他会很爽,你懂吗,因为他感受不到挫折,他认为嗯反正就是面家长一点,是不是很会会会会非常的爽啊,那么第二家第二个呢它会不太爽,因为他遭受到的全是挫折,如果他这时候自尊心太过强烈,太看重自己自尊心的话。
很可能面着面着自己就没信心了,所以这是两种不同的区别,但是如果你想想看找工作这件事情,你不是你不是说同时为八个人同时工作,你只要八个人里头挑一件就可以了,这个是我从两家里挑一件就可以了。
所以本质上谁亏了呢,你自己好好想想看,这前后就差了很多钱,3万 5万就差2万出来了啊,现在学校里都在宣传大数据,嗯好这块儿大家听懂了吗,能不能听进去吗,嗯来关于简历这块儿,大家还有什么一些什么样的问题。
等于老师扣一啊,max王心问了个问题,问题说了个问题啊,挺好挺好的,我回答一下。

max王心诶。

是这样的啊,你看,来有多少人有有跟王鑫一样问题的老师,扣个一,他说老师如果铁了心就要去一家公司咋整,我跟你说,我遇见的学生很多里头是有是有这个想法的,有的同学是我铁了心就一心要进华为,我进不去。
我甚至都这辈子我都觉得没什么意义了,呃,还有的是我,我一直要要进那个那个某个城市的某个企业啊,挺好玩的,但是我觉得是这样的,同学们,这就相当于我铁了心要追一个人,追一个姑娘,不管她是校花校草啊。
不管她是那个那个那个,我这个王心凌还是杨超越是吧,你你听我说这是一个概率问题,就是说如果你铁了心要去一家公司,你的最好的办法是第一好好的准备,看看人家的要求是什么,达到人家想要那个水平,这是第一步。
你要干的,第二一步,我真心希望你看待这个结果,原因是什么呢,因为这种的概率性它它是一个概率问题,偶然性太强了,你赶上他,正好他就你想去的时候,他不要人,或者说正好你面的时候,他问了一个特别刁钻的问题。
你就没回答出来,其他方面你都满足,你就正好没赶上,怎么着,你就不活了还是怎么着啊,所以本质上这是这真的是个伪命题,去一家公司,就是要达到这家公司类似公司的水平,然后以这家作为首选,这如果真进不去。
没关系,后面还有一大堆呢,王心凌,后面还有一大堆的姑娘,杨超越,后面也有一大堆的姑娘,咱们选不了a可以选a减好不好,千万别在这上面犯那种轴劲儿好吧,真的没有意义啊,关于简历这一块呢。
所以我简历呢简历怎么写,这件事就呼之欲出了,就简历怎么写呢,下面我教大家一个原则,简历不是以自身为出发点,能听进去吗,你同学们,你们想想,你打个广告呃,一种广告是这么打的,说我有什么我有什么,我有什么。
另外一个广告是这么打的,说你需要这个我有这个,你需要那个,我有那个你需要我有那个要说,一个是站在客户角度,也就是用人单位的角度,一个是站在你自身处罚啊,我会什么我就敢往上写什么,我不会什么。
我就什么都不敢写,你说这两份简历哪个会更容易收到反馈,能理解吗,兄弟们,所以说从用人单位的角度出发,听我说最容易诱发人,让你去面试的简历是这样写的,这是理想的情况,你认真听,就是一份要求,一份简历。
每一个用人单位,他的强调的点很可能是不太一样的,呃你如果打开一份那个招聘的需求,有一有些用人单位强调的点很可能是高并发啊,多线程相关的处理,而另外一个单位强调点,很可能是云原生大数据的处理。
那么最理想的情况是,第一家我就着了重的,赶着使着劲儿的往那个高并发写,另外一家呢我就使着劲儿的往大数据写,能能听懂吗,兄弟们说,这样的简历他就一定一定是最容易得到反馈的,当然这个呢花精力花的是最多的。
所以大多数人都是用一份简历跟那海投也可以,并不是说不可以啊,但是你一定是要以用人单位的大部分需求,为出发点,那他需要什么,我要往上写什么,他需要什么。

系列 6:P45:【2023】如何速成掌握技术点,拿到Offer? - 马士兵学堂 - BV1RY4y1Q7DL

各位同学呢,我讲到这儿呢,可能有同学说哦,那当然了,人家要什么就往上写什么,那肯定又是容容易受到反馈了,但是人家一找我去面,我肯定面不过了。

因为我还没掌握吗,我知道你们的想法,但是掌握一份一一个技术,一个技术点,这件事情真心想的没有那么的难,我下面教大家速成好不好。

速成啊,最理想的速成呢实际上是你先要囫囵吞枣,掌握整个知识体系之后的速成,但是呢呃有些同学可能没有这个耐心,那没有这个耐心的情况下呢,比方说人家需要大数据啊,我们假设他这个这个地需要大数据。
那你这时速成该怎么办,是不是好听,我说啊,你比方说你简历上你是不会大数据的,我是这么假设的啊,你是不会大数据,但是人家需要,所以你简历上就写了,收集大数据,相关知识,各位同学们把这个写上去了。
然后你收到那个面试通知了,说面试通知之后呢,那个你去灭你,当时心里头会没没底,因为你当时就一点都不懂啊,什么叫什么叫那个那个那个海都不是,什么叫spark,什么叫害你,啥都啥都不懂,对不对。
那这时候该怎么办呢,所以下面要速成,那什么叫速成呢,呃我理解的大数据的速成可能就是七天,拿到面试通过率,二三十吧,2040之间吧,也就是说面试时间你大概乘能乘个24点啊,但是这样这算速成了吧。
大家能接受这个速度吗,可以吗,嗯能不能能接受的,钥匙扣一了,可以是吧,那个可挺好玩的,我今天就教了,今天有个有个同学报完名之后呢,就就是想速成,他想两周之内,两周之内从16k涨到21k。
因为他已经离职了,我就教了他整个的速成的方法,现在他正在努力,我们可以看看结果,我认为我对结果还比较有信心,这个速成该怎么速成啊,兄弟们,这速成啊。

我们我们回想一下我们平时学东西的方式,平时学学东西是怎么学的啊,一定是说按部就班,然后a b c d e一个知识点。

一个知识点完事之后呢,再把整个知识点整合整合成项目,这样的学习方法特别好,他会学的特别特别特别扎实,但是他肯定速成不了,因为大家都知道,你了解it,你就会知道一个细节,一个bug卡你两三天。
那都是非常有可能的,我再重复一遍,就是说哪怕一个小小的细节,你在写代码的时候,一个小小的细节啊,一个bug你说在没有老师帮你带领你的前提之下,你调可能两三天都调不出来,有人遇到过吧,李小文老师扣个一了。
有没有遇到过,真的很有可能,所以你说这样的俗称你是没法速成的,速成的办法只有一个,就是被,囫囵吞枣,放弃操作,只要你放弃操作,你不信你试试,所有的it的知识,你给我放弃操作,你不要去操作,不要写代码。
不要去搭环境,你试试看看你的速度10000%会提上去,你试试看对一步一个脚印,一步一个脚印,在这件在速成这件事情上是行不通的,我讲的是速成啊,兄弟们就是被囫囵吞枣放弃操作,在这件事情上。
实际上七天你只要了解什么呢,你了解专业名词,了解体系结构这句话比较重要,什么叫体系结构呢,就是说当我们搭一个项目的时候,hdp用在哪,spark用在哪,have用在哪,flink又用在哪。
数据库用在什么地方,你在脑子里头的用于形成一个大概就可以了,不要去了解各种细节,你说这几个到底我怎么搭起来,那那你你别想这事七天不可能的啊,好当你了解了这个之后呢,由于大多数的企业呀。
他们去面临的时候呢,实际上只是用嘴说,没有企业让你上来之后让你搭环境的,你们没有遇到过吧,就这几个人在面面你的时候让你搭环境,现场搭环境没有没有吧,应该没有,所以这时候呢你你就你就这么想啊。
问你的专业名词,有可能你背的也也也不了解啊,不是很透彻,第一家问你没打好,回来之后找老师听,或者你自己补,第二家问你是不是要比第一家好一些,第三家,第四家,第五家,第六家,到目前为止。
我的学生里面面的最多,才拿到第一份offer的是30家,我说我们以前是18家,他念了18家才拿到第一份offer,当然后面也有也有同学创建了,他变了30点,这是需要你好好的放弃你自己的自尊心。
放弃你自己的自尊心,所以这个自尊心就放弃这件事情特别重要,不要怕丢人,不要怕丢人呃,作为年轻人来讲,其实最不值钱的就是自尊心啊,那个,现实一点啊,我们拿到offer才是最重要的,丢点人没有关系的。
而且你丢的这个人呢,那个那个那个面试官呀,他也不会记得你是谁啊,他也不会老想着说今天有个人过来面试,没没没面好没好的多了,我没事老记着他干嘛,就是你自己不要老记着这件事儿,能听进去吗,我想无论怎么样。
比如说啊我们从学习七天左右,你学了一个囫囵吞枣,不会操作,就知道点专业名词啊,七天其实够了没,这个完全没问题,然后呢在你在面试的过程之中,这些专业名词会不断强化,你知道为什么吗,因为他们老会问你。
他总会问你的,你说你想想看是不是这样的,总是会问你,然后在你问你的过程之中呢,有不会的呢,你又回去复习,有不会的,你又回去复习,实际上在整个的找工作的过程之中,比如说我们整个的持续时间大概持续了三周。
20天,整个持续了20天。

就相当于你用了20天时间,去了解整个知识体系的这个时间,实际上真的是很高很高的一个时间,也就是说在20天之内,你找到一份这种类似的工作,拿下这个offer是完全有可能的,同学们,我讲到这里。
大家能够接受吗,你早早的虚构一下啊,我知道大家会会很虚很虚很虚,所以我才要求你要放弃这个自尊心好不好,嗯这大家能接受吗,嗯可以是吧,就是我教你的是速成啊,如果真的是我我我。
我让大家伙那个扎扎实实跟着跟着学,那就不存在速成了,就你面肯定是能练过了,就当你就是还是那句话,你个人比较丑是吧,搁不住,有人眼瞎把你招进去了,当你招进去之后呢,你马上会面临一个更严峻的考验。
这严峻的考验就是试用期,试用期,我想你试用期期间啊,你在第一家的时候,有可能是你百分百分之八九十,你是通不过的,很有可能两周左右赶出来了,这是不是同学们你们想想看,是不是非常非常有可能啊。
注意只要你拿下offer的这个过程,在这两周左右的时间,你告诉我你的重点应该是干什么,这两周应该干什么,告诉我一下,哎想想我们想象一下这个过程,就是我们靠背东西,我们进去了,蒙蒙进来了。
这两周用来干什么呀,操作操作,这个能听懂吗,兄弟们,这两周是不是应该操作了,就这两周,第一你上班的时候必须得操作,因为人家要求你操作,然后呢你下了班之后玩了命的赶紧操作,我给大家讲故事。
我给大家讲故事呃,也不是故事跟是我的亲身经历,我当年做成员的时候,我手底下有好几个那个项目组,其中有一个项目组呢是windows的这个vc的方向啊,就这个方向叫vc加加。
就windows的c加加这个方向,那么这个方向呢是招了一个小姑娘,这小姑娘盗墓现在名字我记得都特别清楚啊,我就不说她名字了啊,因为我印象太深刻了,小姑娘长得挺漂亮,但是呢实际上召他进来的时候。
我就不知道他们那个项目的组长,我估计就是看上人家的美色了,招招进来的时候,他只会一种语言叫sp s,这个叫统计语言,懂吗,把我给气的,你招进来了之后,你想想看,他干不了活儿,你干不了活的话。
你出不了东西啊,你这玩意儿你受得了吗,我当时就是就下了一道命令,我就说很简单,一个月之内,vc加加给我上手,如果上不了手就就就滚蛋,就这么简单嗯,你知道这个小姑娘呃,每天基本上就是两个眼睛。
就是大黑眼圈,特别特别黑那种,来上班差不多一晚上也就睡个三四个小时吧,一个月之后上手vc加加牛逼吧,就是人在压力之下呢,他的潜力真是无穷的,我告诉你啊,就上手了,起码是上手了,没有那么精通。
但是他已经上手了,就是可以干那些打杂的活儿了,可以这样真的就在我们项目组留下来了啊,vc加加这个东西我跟你讲,比java难多了,比大数据难多了,你不信你们去了解了解那个语言,就是本身c加加语言就很难。
windows底下的c加加它更难,好吧,就就这样啊,就在我们项目组底下留下了啊,当然还有类似的什么那个有一个英英英国的,那个英国的水硕回来之后啊,我觉得这个英国的研究生还觉得挺好的。
回来一用发现屁都不是,但是不管怎么样呢,他是在这段时间,他是被干,他是在干嘛,晚上玩了命的努力干什么,做操作,跟着视频讲课,跟着直播讲课,做操作,兄弟们,所以在这个时候开始做操作,各位听懂了吗。
那位同学说了,老师我两周能不能坚持到啊,其实正常是能坚持到的,原因是什么呀,一般来讲呢,第一周是你的适应整个项目组的期间,正规的公司还会有培训,他会让你去了解整个项目的各种的流程是什么。
我们的操作环境是什么好,其实到这个时候啊,你最差最差,哪怕你两周被人赶走了啊,你这时候最差最差的,你已经了解什么东西了呢,就是项目组的情况,哎我们使用的开发工具是什么啊,我们的日常配置是什么。
我们人员配置什么样子,对不对,你已经只注意就是说你原来只是看看猪跑,你现在开始吃吃,吃了点猪肉了,吃了口猪肉猪肉了,已经哈注意吧,我就想问你啊,就是两周左右突然间被人发现了,说这哥们他妈的根本就不会。
对不对,然后一上报赶走,这很正常啊,我就想问你,如果你在你前面面了18家,拿到了第一家之后,你坚持了两周,你能不能再拿到第二家,可不可以不可以可不可以。

然后第二家,完全可以啊,你又花了两周拿到了第二家,那第二家你这个面试,如果说你你这两周要在干嘛,做操作嘛,就一边学一边练嘛,好那这个你要不要待够一个月啊,兄弟们,那你下一个月要不要再待够三个月啊。
你想想看,如果你三个月还待不住,那真的就不是不是不是不是技术问题了啊,好吧呃,这是速成,你说什么,你们想想看,从你开始七天,然后面20天到两周被赶走到两周,下一间,其实你运气好的话。
第一第一第一家能呆住,没准好吧,我们讲两两间,两间你才能待稳当嘛,好不好,加起来的话呢差不多1~2个月。

差不多是1~2个月,这速度还可以吗,能接受吗,在你什么都不会的情况下,能不能接受,来能接受我同学老师扣一。

你让自己想,你听我说啊,各位同学们可以接受,就是废人,你现在想找工作要挣钱,你你你你你你你你没有东西说又快,然后赚钱又多诶,然后又稳当又轻松,各位别做这种梦行吗,你要跟我抬这杠,我就没法跟你聊了啊。
我教你的是速成嗯,还啥也不会。

如果你你可能没有经历过,就是说使着劲儿地努着力的,每天啥也不干,学完完整整学一个月,那个学完就是脱胎换骨,跟你完全啥也不会,是你那是你想象中的啊。

你没试过而已,那个各位同学呢,这个属于是歪门鞋带。

就是速成的方法,速成啊,其实不是想象的那么难,我跟你讲,我的记录是让一个只会html css javascript,javascript都不会啊,就是这样的小伙大概在十天入java后端这一行。
就是采用的这个方法好,还是那句话,就算你很丑,搁不住他他他他眼瞎呢,总是能搞定的啊,这里面的第一点呢,就是你一定要这个简历要好好的润色,好好的润色润色润色再润色,要让别人拿到。
就这份简历的作用就是拿到拿到面试,拿到拿到面试机会就行了,你不要想这里面我会什么不会什么不会的东西,可不可以往上写,一定要敢往上写,因为在你不会,你敢写上去,你发现这么写能拿到面试机会的时候。
剩下的就很简单,就是我赶紧会了,这个就可以了。

系列 6:P46:【2023】速成之前应该准备什么? - 马士兵学堂 - BV1RY4y1Q7DL

当然呃如果你想让自己,让自己有那么一点点把握性要大一点,我真心希望大家可以,花那么一两个月左右的时间,先对整个知识体系做了解,其实啊在你真正开始这个这件事情之前,想速成之前,真心建议大家呢花一点点时间。
花一个月左右吧,不管是哪个专业方向,go on也好,java也好,前端也好,或者是没好,花一个月时间你要干嘛呢,你不要老想着去操作它,你写一个hello world就可以停,囫囵吞枣拿下整个知识树。
这事情特别重要的,就是同学们你们思考问题的时候,咱们平时的学习方式,思考问题的时候都是没有效率的方式,什么什么什么叫没有效率的方式呢,呃同学们,你们想啊,从咱们小学开始上学开始,就是说一个知识点。
一个知识点猛学,然后每个知识点都钻的特别特别深,就相当于如果我们从粗浅的来理解的话。

就相当于呢这是一整棵的知识的大树啊,这个大树在整个知识树上呢,我们是从某一个叶子开始研究的懂吗,我们对这个叶子研究透了之后呢,也在研究下一篇叶子,再研究下一片叶子,但是我们对于整个知识的综合运用。
是关于项目的,而这个项目的综合运用呢,实际上是关于整个的这些叶子,组装成一个一棵树,反过来的,这件事情是不对的,你懂吗,就这个东西的话,他又费时间,效率又低,还没有乐趣,因为你你没有看到那个最终的那个。

那个那个大的那个结果,所以它的乐趣性还不高,因此正确的学习方式是什么呢,你应该是先掌握整个树干,你知道吧,就是说我整个的知识里面哎这部分是基础,ji s e哦,下一部分在这个基础之上是数据库。
数据库和这个是一个同样的大树杈等等,是形成这样的一个一个一个大大的概念之后,大概念之后呢说哦原来这里边我要读源码,深入进去再深入进去是反过来学,那么从如果从那个专业点的角度讲的。

应该就叫项目驱动,这项目驱动这大家能听懂吗,就是你可以大概的先把这个项目,无论推导拿下来,这个项目驱动呢,你可以先了解说,我做一个实际当中做一个完整的项目啊,我应该是有我我是我我是我应该是我同事。
长什么样,我我应该是由哪些人构成,每个人都在干什么,然后这个项目里面我用到了哪些知识点,然后在驱动着我再去研究这个知识点,反过来学,就这个时候他效率是最高的,他可能让你学起来没那么舒服。
不是像很很很很适合,就是原来跟我们的学习惯很像的那种,但是呢他的这个学习方式的效率是最高的,好吧,就是你你政治学的时候,你可能得需要五个月你才能去去面去做面试,但你反过来学的时候,你可能需要两只。
需要两个半月,你就可以去参加面试了啊,你和那种学习的唯一的就是成功率稍微差一点,但是找工作这件事,你十加乘两三家和十家乘个四五家,本质上有什么区别,其实没有太大区别啊,别都像我们边学的东西对嗯。
所以速成之前我希望你干这件事,注意这事情,这个事情叫囫囵吞枣,为什么要一定要强调囫囵吞枣这件事情,你知道很多人读书啊,他有很好的习惯叫做观其大略是吧,诸葛亮的讲法嘛,叫我读我读书,观其大略好。
ok还有呢就是陶渊明讲啊,叫好读书是吧,不求甚解,这些都是很高效的学习知识的方式,你不要想着每一个细节我全要掌握了之后,才要怎么怎么怎么怎么着,很多人的学习太多了,尤其是还有好多那种他的学历也很好啊。
背景学校也很好,然后一了解学习习惯去全是这样的,我必须要玩命的整整通整个细节,不然的话我心里不踏实,别这样啊,这个大家能听进去吗,就是对知识树的话,拿下整个知识树的话,是这个是最快最简单的学习方式啊。
来这块能听见老师扣一了嗯,就速成之前你要是能干这件事,那么这速成就非常有把握。

听懂了吧,嗯又好多同学呢他们最近找到了,就是说就想速成啊,老师课挺多的,我也不想扎扎实实学,能不能先先速成一下,其实可以,其实可以怎么活囵吞枣哎,活吞枣的话呢,其实比方说啊,你学一个新的东西。
你就先掌握它是干嘛的,用在什么地方,大致了解他的什么搭建过程啊,什么什么环境的处理啊,快速快快速了解一下就行了,然后怎么和其他的那种组件相配合的,好吧就可以了,好嗯这是咱们应届生来说啊,就是就业找工作。
高涨薪,就业找工作,就业找工作,那那当然就这种的找工作的话呢,嗯就是这种找工作呢,有一个最后是不是要回头吸血,对对就是等你拿下工作之后,在工作中运用的过程之中在戏谑,你想想看这是不是好处,这这这件事情。

这件事情是不是它就是它的好处啊,你想想啊,就是有两种方式嘛,第一种是从细,到那个111个组件一个组件啊,到到组装是吧,嗯老项目到完整掌握,掌握整棵树,整棵知识树,然后嗯找找工作是吧,这是这是最扎实的。
这是最扎实的,其实你有时间够的情况下也可以这么写,这是最扎实的情况,那么这种方式呢,比如说你大概需要五个月好,那么从另外一种是反过来,然后就是囫囵吞枣,外加蒙哈哈,就是就是我刚才讲的那种方式啊速成。
那么这种方式呢它可能需要两个月,但是最后你欠的账也一定会还回来的,你这个是五个月之后你找一份工作,这是两个月之后就找一份工作,中间差了多少,差了三个月工资,这是不是就是你的你的收益。
兄弟们是不是就差了三个月工资了,已经然后在三个,你说你这后面这三个月里面,后面这三个月你用到哪个,是不是要研究细节去啊,你欠下的账,你是还是还是要还回来,只不过呢就是在你赚钱的时候,你去研究细节。
这个呢是你不赚钱的时候,研究细节能听懂吗,兄弟们来听懂,给老师扣个一啊,嗯我就是反过来学是吧啊对,好各位呃,听明白这件事之后呢,下面呢我给大家呢,慢慢的就是你们你们想拿下整个知识树。
我将我给我给大家讲这棵知识树可以吗,我慢慢的快速的给大家讲完整个知识数。

系列 6:P47:【2023重点】进大厂的“最小值”到底是多少? - 马士兵学堂 - BV1RY4y1Q7DL
哎对,还有一个有同学说了,说那个,大厂最小值是吧,刚才有同学问我说大厂的最小值是什么,来各位同学想知道大厂最小值的,给老师扣个,一来,哦那个我用阿里来举例子啊,大家都可能我不知道大家了不了解。
就是阿里的他来招人的时候呢,他大概是给这个技术人员分职级的,从p5 大概到p8 这样一个样子啊,就是p6 p7 p8 ,那有同学刚才说了,说老师你刚才给我讲的那个最小值。
从javs e一直到spring cloud这块算是p几啊,那不好意思,只能算p4 啊,各位兄弟们,各位兄弟们啊,那个我刚才讲的最小值应该只能算p4 啊,可能不太会到,到不了p5 嗯。
我们就以刚那个刚才是p4 ,我们现在跟大家聊,简单聊一聊这个p5 ,这块呢大家可以找到我们mc架构师的那个课程。

课程课程介绍,这里啊,我们曾经原来做一张图嗯,p5 这块啊大概是这么这么一张非常细的图,但是没关系啊,我帮你提炼那个最重点的东西好吧,那么p5 呢首先掌握p4 的知识,这个没什么可说的。
就是首先第一点你要掌握p4 o,先把p4 那个大概掌握了,那么p5 还需要什么东西呢,p5 实际上还需要算法啊,大概是这么多,这个就是它的最小值了啊,因为大厂来招的时候。
他往往招的都是一些这种计算机的专业方向的,这些人啊,呃在座的今天听课的,我觉得会有一部分人呢,他是没有那种专业方向的,就是没有那种没有那种呃,不不不是计算机专业的,等于那么不是计算机专业的呢。
我教大家一下,就是非计算机专业,今天因为听课的有大二的,大三的,如果你不是计算机专业的,你想补成计算机专业,差不多你应该重点补那几个,大概补四个内容,第一个呢就是操作系统啊,网络祭祖嗯。
然后呢加算法如果只需要补一个的话,就是就是他就是算法,如果只补一个,就是他啊,如果要补四个,大概就是这四个,大家听懂了吧,呃其实不是很好补,我建议大家呢也可以不用要求的。
对自己要求太高呃如果想速成的补呢,你建议就不算法啊,其他的可以暂时放一边,当然你想说你说我想非常有把握的进大厂呢,那这些基础知识是真的少不了啊,所以算法叫底层原理,底层原理呢可以简单理解为操作系统。
网络技术啊,这个简理解为这个还要包括什么呢,如果你是java方向,那就是jvm火箭筒,部分数据库吧,大概是这样啊,db然后加部分源码,因为呢有一些源码呢,对你来说是强力的加分项啊,这个是。
掌握的多肯定是越多越好啊,不掌握的话呢也有可能能杀得进去好吧,这个我们讲最小值吗,不是最大值,是不是,这个大概是p5 啊,但是p5 和p4 嗯,我可以这么来理解吧,就是说p4 的话呢。
差不多就是那个你是大专生啊,或者说学校不太好,可能应届生进不了大厂那种学校,大概你搞定p4 就能搞定一份工作了,如果加上p5 的话,就是你这份工作薪水会更会更强,大概是这么一个概念,这块大家能听懂吗。
那这块大概能听明白,老师扣个一,db数据库,对对对对对,数据库啊,就掌握mysql什么的就可以了,但是其实作为大厂的p5 来讲,就是大厂的屁股来讲,比p4 还可以少一个东西,就是什么意思呢。
其实他未必需要项目经验,这个就是它的好处,各位认真听啊,就是作为你去大厂,你未必是需要项目经验的,这点比较好玩,那个这个咱们以前有同学就是这样的,他的项目经验其实并没有,因为应届生嘛,嗯那个。
但是呢不耽误他得到了大厂的那个面试的要求,要面试要求之后,他把这些东西问的特别细致,问完了之后呢,ok没有考面试经验也进去了,所以如果聊最小值来讲呢,这个项目经验没准p p5 想进大厂。
可能还不是你十分需要的那个值,o当然这个是也是加分项啊,肯定是有的话,比没有要强的多得多,但是反过来说,如果你要想找工作,p4 找工作,那不好意思,这项目经验是少不了的。
这是大家伙写在简历上非常头疼的一件事,因为大家你想一下你们你们的项目经验,第一个你们没有真实的项目经验,第二个你们大多数的项目经验呢,都是跟着好多老师的,这个个人的一个这个这个视频也好。
或者敲敲代码也好,就是一步一步敲出来的,非常粗浅的一个项目经验,一个小模块写到简历上也不好看,所以这里面会涉及到一个,我怎么样才能拿到更多的面试经验,有没有速成的办法,其实也有啊,这也有速成。
但是大家就就不就不展开多说了,要不然咱们说不完了啊,这办法这个也有速成,你就记住了啊,没有没有不能速成的东西,好吧,除了除了这个啊,呃算法是真的,老师没办法帮你速成,因为算法是,考验一个程序员的内功能。
就相当于我要招一个保镖,我看你的,看你的是什么东西,看你的是内力,是你的易筋经的锻炼了多少年,而不是说你什么会什么地躺刀啊,会什么黑虎掏心会这个的啊,所以算法这个我没有办法帮你速成啊。
呃咱们课呢是把算法呢单独列了一门课,这个课呢是咱们那个左程云。

左老师辛辛苦苦给大家带来的呃,呃希望大家伙去了解啊,那个,这我也不太了解,大家知道那个左老师听说过左老师吧,应该我们叫左神是吧,嗯算法对,慢慢啃对,听说过是吧,他是原来是在华中科大的。
然后在芝加哥大学念念的研究生,后来在美国那边是在亚马逊啊,然后再回回国之后呢,在百度做了一段时间,然后呃开始专门教大家怎么样讲算法,就是带大家伙怎么进大厂的这个啊,因为算法是进大厂要的,如果你不进大厂。
只是想拿一份工作,实际算法暂时是不需要的好吧,同学们嗯这会儿要听懂呃,算法课内容呢内容会挺多的,我们是单程差不多是400多个小时的算法课,所以说我建议大家学算法怎么学呢。
我就教大家一个方法叫做日拱一卒啊,算法怎么学,叫日拱一卒,所以你千万不要想着速成,速成这件事不太可能呃,每天学那么一点点,比方说你每天如果有两个小时学习时间的话,你拿出半个小时来学算法。
如果你有四个小时,你就拿出一个小时来学算法,听懂了吧,就是每天你不间断或者两天学也可以啊,三天学一回也可以,就是你不要间断,间断了就完蛋,只要你细水长流地学下去,你会发现你个人脱胎换骨。
因为为什么你从你你是从整体的那种易筋经,从内力的方向开始,慢慢的去理解整个的i i t的知识体系的好吧,因为这个东西的话,那就完完全全就是不一样的,那这块大家能听进去的,给老师扣个一啊,我我我我。
我们讲做培训的很多人就是培训的是速成,其实很少有人呢来帮大家设计一门算法课,因为算法课这件事情叫吃力不讨好,他太硬核了,他跟那个速成那个是完全的两个概念,所以说那个你靠背靠什么都可以。
但是算法靠背靠门它是真不行,但是我觉得呢要成为中国优秀的专业的程序员,我愿意为大家提供一门算法课,既然提供算法课呢,我就找那个讲算法,讲的最牛逼的就是咱们左老师,没有之一啊,嗯案例我就不做,不给你看了。
就是曾经有同学一个算法,就把全中国大厂全拿遍了,而且算法重要在什么地方呢,你一定要记住它的重要点在于,国际大厂要考东西就考算法,然后就考什么呢,呃算法加那个系统设计,没有别的啊。
案例案例我就我我我就不急了啊,我就不举了,太多了啊,所以请大家听进去,这就是p5 的那个差不多,你你你进你进大厂的p5 的水平,这p5 水平呢不是想象中那么好进呃,信息这是一个知识点的一个列表啊。
我在这儿呢就不给大家1111讲了,呃不一定是你需要把所有东西全搞定,因为这里头是一个最大最大集,它不是一个最小集啊,我我给大家讲的是那个最最小最小集合呃,也给大家瞅一眼,就是大厂那种招屁股的时候。
它的一个面试的深度是什么样子,好不好,大概是这个样子啊,这个是一个典型的,这是原来呢咱们这个同学是一个研究生,他进去的时候拿的是一个p5 呃,大概在阿里那边练了七次,他呃面工程项目经验基本为零啊。
所以就是死磕开始死磕它的基础知识啊,大概就是这些啊,大家愿意的话,这个面试题的一些简单列表吧,其实其实还是蛮深入的,考的都是基础的知识加算法题啊。

刚才有同学问我说那个大厂的实习,它的最小值是什么,跟p5 是差不多的,我再重复一遍啊,大厂实习跟真正找大厂工作本质上是差不多的,跟p5 的那个要求是差不多的,听懂了吧,好这个基本上就是p5 的内容。
大厂以前的这个p5 的职级里呢,他的年薪是20万~40万,p4 的话,那你肯定是刚入行,一般是到不了20万的。

好前面这两项我大概就讲完了,不知道大家有没有谁有疑问的地方,就是说再重复一遍啊,就是说你是学历不太好,你初初心就是想找份工作,我教你怎么速成,然后速成的最小值是什么,这个最小值甚至还可以速成。
就说你没必要去搞那么多操作,你就用我教的办法,用最最快速的方式先玩了命的呢,做一些粗浅的操作,然后更细致的那种工作上的要求的操作,等你拿到工作之后再说,诶,这是最好的促成的方式,最快的。
然后如果是p5 的话呢,差不多你需要再加这些东西啊,就够了,好我讲到这儿看看过去讲的这部分还有什么,谁有疑问的,嗯如果没有问题的话呢,哦m说mc是和哪部分学是吧,大概mc是这样的啊,听我说我们。

我们。

课程里头的这两门课,这两门啊就是一个是mc的高级架构师,一个是java后端工程师,这个课呢是入门。

是入门,是小白,就是你那个呃刚刚就还没有就业的情况下,第一次就业做这个课就可以了啊。

然后在这个课的基础之上,比方说你已经就业了,已经就业了半年工作半年,1年2年3年,只要你就完业。

拿到了工作了,业余时间,这是咱们的业余时间提升的课,叫mc高级架构师,提升呢就是你已经拿到工作了。

在他的工作的前提之下,然后该怎么样去,拿到更好的薪水,因为很多人拿到工作呀,他真的是很粗浅的,很很简单,一份工作很可能拿的是外包,拿的是一个那种呃,其实很低,这样的工作不是很理想。
能本来有能进大厂的资质,但是没有进去等等这方面,那么在这个基础之上呢,帮大家做提升的,所以这是这两门课,大概入行这块呢我差不多就讲完了,这个入行入行这块的话呢,大家也可以找咱们去咱们网站上查内容。
也可以啊,入行这块的大纲的话呢,也也给大家那什么意见吧,给大家一下啊,这是那个入行的大纲啊,这入行呢我们给我再说一遍,我们给的是最大值,我们这个大家入行的时候,是你你你把这个值学完了,肯定是就入行。
肯定没问题啊,我们给的是最大值,你可以玩最小值,这个老师老师教你玩最小值也可以啊,在这个基础之上呢,找那个最速成的部分,其实也可以,这个最大值呢,实际上是包括了p4 和p52 部分啊,还有少部分p6 。
所以这个这个打开看呢,你会感觉到比较多,大家听我说呢,也不用害怕多,因为这里面包含了好多细节的操作,我还是那句话,你如果想速成,反过来选你的这个成功率就高多了,还有一个呢就不需要花那么多时间了。
当然它带来的坏处呢,就是说呃你的那个你你你得你得自尊心啊,你得你得会有一定程度上的受挫,造一个呢要让自己试错,成功率和那个正常的那个学习比较没那么高,所以看大家伙自己的时间上的准备,还是那句话。
你要想两周搞定工作,老师也也有办法,并不是说就搞不定啊,我我就当然需要你配合啊,你以前有同学说老师我就是过不了心里这关,那那那那那那那就真的真的没办法,肯定是需要你配合的啊,只要你配合好。
我们说两周搞定工作,不是想象中那么难好吧,行我大概就,说到这把入行这块,我就说到这,下面我跟大家聊那个呃入行入行的知识数,大家清楚了吧,入行的知识数大家清楚了吗,还有没还有没有谁不清楚的。
下面我跟大家聊进阶的知识数啊,清楚了是吧,再说一次好对入行知识数不但不太难啊,我跟大家伙再简单重复一遍,比方说你我我们说找一份工作好好听啊,就说找一份工作,其实你只需要从java s e js。
甚至都不需要掌握那么多啊,只需要掌握的运行对象,掌握常见的一类的处理,甚至都可以啊,然后呢数据库当然还包括数据库操作,jdbc,还有前端,web前端web前端不需要掌握手机什么的。
前端web前端的大体掌握就可以,不需要太不需要太深,然后呢我们讲那个后后台的不需要掌握,不需要掌握jsp,不要跟我去学那个啊civior,然后spring spring mvc。
spring mybatis,spring boot,spring cloud,好到这里,这是入行的知识点,找一份工作,不过这里面比较难的点呢是项目啊,这个是比较难的,这大家要有心理准备。
我们一般推荐你入行的时候给我写四个项目,入行就要写四个,不然你去试试,你写个一两个很粗浅的那种项目,你还是拿不到面试机会,入行写四个,就这块是比较比较难的,就是这也,这也是我们为什么在课程里面。
给大家准备好几个项目的原因,就是因为呢怕你在里面写不出来呃,游戏后端项目,然后那个何家园项目,网约车项目,咱们的严选项目,商城项目就是一定要让你写出四个来,就算你没有四个,你只要掌握知识点之后。
老师也能速成,让你去搞那个你原来没有做过的项目,也并不是写不出来,听懂了吧,入行要学到微服务,对要学到这是比较有把握的,你可以不学到微服务,但是就把握性没那么强啊,这大概是最小值,我讲清楚了吧。
这是找找工作啊,我们说进大厂,进大厂,在这个基础之上呢,呃算法算法你要想进大厂的话,差不多要掌握到那个至少是什么莫里斯便利,呃,然后那个贪心啊,呃然后动态规划这部分,dp这部分啊等等。
然后呢呃这个计算机的这个三剑客是吧,计算机机组操作系统网络原理啊,机组操作操作系统网络原理,然后还有一些底层的技术,jvm多线程啊,数据库调优等等,在这基础之上呢,你因为你看他面试题全都是锁呀啊。
什么并发呀,多线程访问下应该怎么样啊等等,然后呢在这个基础之上呢,建议加一点点源码进去会更好,比方说那个jdk的一些常用类的源码,spring源码啊,然后嗯这方面的等等的一些源码啊。
叫什么mybatis源码等等,越多越好啊,但是最基本的,我希望你读一些jdk自带的一些源码,比如说threlocal了啊,还是map了呃,这些个源码啊,这些个它是板上钉钉会考到的,如果就搭乘来说好。
所以说上面可以简单认为呢就是p4 ,下面可以认为是大厂的p5 ,这两部分一加最小值啊,这块这块get到了吗,来这块get完的没有问题的,给老师扣个一啊,粗浅者跟他写的项目也能往简历上写吗。
你问出这个问题了,说明你刚才没有认真听课啊,就是说你没做过的项目都可以,往往往简历上写,我刚才讲过了,你简历是拿到了,是拿是要你拿到那个面试机会的,怎么写,能拿到面试机会就要这么写,o大数据想学好。
怎么学大数据的路线呢,大数据路线也比较简单,大数据路线比那个想中要比那个java的后端呢,可能还要容易一些,好哦,我们下面聊那个掌心的,就是再往深里掌掌心的一些东西,这个东西呢因为我们还是那句话。
就是我们大纲里面给的是最大值,就是这个大纲呢你们把他要回去,把它要回去,把要过去一定要过去,要过去之后呢,不需要你,我不需要你说你,你说我老师我就不想报你们班,跟跟你学没关系啊,你爱报不报。
但是我至少能够向你提供一个指导,指导是什么东西呢,哪怕你自选,你可以沿着这种路线来学,他一定是没有没有那什么的啊,就说不会不会让你走弯路的,就怕你自己搁那学,学了很多东西,有以前有同学在那使劲。
还在那学学扣那个habit,扣了半天,还在那扣p h p的,扣了半天,浪费时间,兄弟们知道吧,可以让你的学习更有效率一些啊,呃关于那个p6 这一块呢,其实p6 是在p5 的基础之上。
刚才你们你们了解到p5 了,对不对,p6 是什么呢,p6 是在p5 的基础之上加项目经验,所以这里面的很多东西啊,实际上是和p5 的没有太多区别啊,就是对技术知识点的要求上,对p5 来讲没有太多区别。
但是呢作为p6 来讲呢,p6 是呃我们我们是讲阿里的体系,p6 呢是要求你掌握知识点,还在社会上大概工作了3年左右,听懂了吧,这个是很多人嗯,面面面p6 时候的一个真实的年龄水平,就是大概你已经工作了。
然后掌握了屁股的知识点,工作了,但是没进过大厂吗,工作了3年左右,这时候去大厂面试的时候,拿到的会是p6 左右的职级,这p6 呢有的给的薪资还蛮高的啊,40万~60万,这是以前现在不知道有没有降。
不知道啊,但是我们不管他的体系划分的还是比较科学的,我们就讲这个体系听,首先第一点呢就是从知识点的角度呢,呃,它的宽度肯定要比那个你刚毕业那会儿的宽度,要要增加,呃,我们给大家准备的。
记住我们给大家准备的是一个最大值,就说你未必非得完全的把这些全学完,才能拿到批流,我给大家准备的是最大值教学嘛,我期望给到大家最多,哪怕你暂时用不着,你什么时候用不着了,什么时候查都行,记住了吧。
所以这个呢你也不用太害怕,我们从那个这些类似于像p4 p5 的知识,这些要前置,我就不重复了,那么底层基础这个就类似于那个你要p5 ,要去考大厂那些,最大值我一定是拿大厂的要求来要求的啊。
你可以可以达不到啊,那个这是大厂的一些要求,操作系统网络等等,然后呢并发的编程这块呢也是大厂的要求嗯,r pc的通信这块呢叫分布式分布式的东西呃,对于现在做项目,如果你做的不还是单体,它就不值钱。
能理解吗,我再重复一遍,好同学说,老师我就学到单体行不行,其实可以,但是你拿钱拿的会很少,四五千,现在的项目单体就不值钱,能理解吧,单体项目就不值钱,所以你一定一定的对自己来讲呢。
要把自己盖到一个这种这种,带到一个这种分布式的这种这个这个高度,在分布式的基础之上呢,我们这时候呢你可以去了解消息的中间件啊,rocket和卡夫卡这两个是最主要的好吧,入门来讲呢。
你搞那个rabbit也可以缓存的中间点呃,软件初步设计的基础就是整个软件工程呃,分布式的技术架构,从高频发高可用到存储,分布式锁分布式,我这就比较多了,还是那句话,给的是咱咱家是一个最大值。
包括p5 的,那这里面是包括p5 的呢,然后呢大数据的部分,数据的存储,数据的这个搜索啊,数据的处理,实时处理和和这个和这个和这个批处理呃,网络基础运维的部分,然后呢现在最流行的呃。
做软件工程的这种实践就是debus啊,就是这个运维开发一体化啊,测试的部分和那个新新版的这种,微服务啊,新版的微服务嗯,差不多呢,这个就相当于一个p6 了啊,到这部分呢。
其实你就拿到40万~60万左右的薪资了,就是这样一个水平好,我讲的比较粗啊,还是那句话,我给大家的是一个最大值,你可以拿到其中一部分,没有关系的,嗯在这部分看看大家伙有什么有疑问的地方,没有关于p6 。
如果只有单体项目经验,怎样分装成为如果只有单体项目进行,怎样分装成为分布式项目,首先呢你要把分布式的知识学好,在这个学校这个知识的基础之上呢,你再去想,如果用分布式的东西去怎么做。
你原来的业务逻辑在你脑子里做一遍就够了,听懂了吧,嗯啥时候有提问环节,现在可以提啊,就关于我刚才讲的这一段老师有免费进阶课本,好像是有的,因为我们最近是我们的周年庆典,是我们m c a的三周年庆典。
去咱们招聘网上不去,咱们去咱们的官网上,你去查一下,应该是有了啊,这是我们的我们的上在线上的三周年庆,应该是基础体系,现在对待账户是全部免费开放了,就是大家学学go on的a l o t的web。
前端的python和java,对于刚入行的这部分,对大家伙是完全免费开放了,到目前为止啊,呃当然只是入行部分啊,咱们老师们也是要吃饭的,呃还是那句话,如果你想比较有把握的技能行业。
让老师带你肯定是最有把握的,我讲到这儿呢,稍微梳理一下,p5 的p6 的就p4 p5 p6 ,其实大家都清楚了吧,p4 p5 p6 涨跌到30需要哪些知识,p6 呢已经涵盖到40万左右了。
其实这些知识你就到30了,这些是没有没有问题的,好吧,一会儿我呢我我跟大家简单梳理梳理,就是到什么薪资,你应该掌握哪些好不好,我先给大家再直抵上,梳理完再帮大家梳理梳理一份,就是到什么薪资。
应该掌握哪些,ok可以吗,我觉得可以,同学老师扣个一,我先帮大家梳理完体系啊,这个呢是p6 的知识体系,其实到现在为止,关于知识体系层面呢,我们在后面又增加了一些新的这个呢。
这些知识体系的话呢也是慢慢的开始,需要大家伙掌握的,就是关于云原生的,我看刚才还有同学问啊,说那个mc里面有没有k8 s的,这个必须得有,因为关于云的这部分,是我们将来很可能就跟现在的操作系统似的。
就是linux似的啊,你不用都不行,我不知道大家有没有有没有感触到啊,就是我你像我们现在对外的给大家的教学项目,都是在云上的,我们给大家的最新的这个,你比方说投入了几十个人给大家开发出来的啊。

像这个呃这个都是在云上啊。

完完全全整个架构全部都在云上,所以云这个东西呢你是避不开的,各位兄弟们,各位成员的组成员的,咱们咱们的同学们,一定一定一定一定开始,慢慢的要把它放到你的学习日程上,从云基础到云架构啊。
到这个多到容器到容器编排,到监控,到持续集成,到这个easter terraform ensable service,互联工程等等,这些都是和云相关的,这是咱们的重中之重,好吧知识点这块呃。
我们有一个专门的特特别的课,很特别的一个课呢叫做大厂八个处理专题,这个主要是咱们原来的那个京东的老师啊,他们在上线自己的项目的时候,在实际当中又遇到过哪些事故啊,这个专题是我特殊设计的啊。
为什么要设计这个专题呢,其实还是有点苦心在里面,这个专题呢主要是帮大家解决,在面试之中,别人问到你一个问题,这个问题最常问的是什么问题呢,就是说你做了一个什么样的项目,你在这个项目里面有哪些个痛点。
有哪你遇到一个什么难点,你是怎么解决的,这时候是展现你价值的时候,一定要说那种特别拿得出手的痛点难点,你不要让自己说啊,我那个有一次jdbc没调通,后来我调了调给调通了,各位同学们能听懂吗。
来这会能听见吗,扣个一吗,你那个能体会到老师设计这个课的苦心的,好不好,就是这个这个问题是大家伙最常问到的,主要是你们去面试,面过试的,你反馈一下有没有人遇到过这个问题,就是他问你。
你原来的你原来的那个做做过什么样的项目,你说了半天,然后说这个项目里面你遇到的难点,有没有遇到过,你这个遇到过给老师扣个一出来好不好,就这种问题问的太多了,所以专门给大家准备这样一个课。
还是很有价值的啊,那科的价值就在于说这个一个课搞定了之后呢,你你很有可能你这个原来赚15000的,就变成17000了,好吧,现在问我都头脑对,所以这课就专门给大家准备解解,解决这一个问题的啊。
就是课程现在怎么细致程度比较细致了,我们讲p6 这部分的主要集中在操作和落地上,就是日常的操作啊,日常给你一个模块,你能够写的出来呃,如果到下一个职级的话呢,实际上它叫做原理和设计,就这个内容的话。
它就开始牵扯到你整个的架构师的核,心部分了啊,架构师的核心部分,就是对于整个结构的理解和技术的选型,这块是一个架构师的核心能力,给你一个业务,你要把这个业务呢转换成为技术好,选转换成为技术的时候。
你肯定要想,我应该是选砖头啊,还是应该选瓦块啊,还是应该选混凝土啊,还是应该选塑料啊,选型能力,这里面呢主要是分布式架构的理论基础啊,分布式架构的算法支撑,这里面主要两两大算法,一个是分布式算法。
一个是机器学习相关的算法,然后呢框架的原理和源码的剖析,这会儿要不要让大家公源码,如果不公源码,你就不会意识到一个优秀的,别人写的东西的结构到底长什么样,就相当于呢你做建筑的人读源码的过程。
就相当于你去解剖那些个现实之中,已经非常好的一些建筑的,它的内部的结构,你说它重要不重要,他一定重要啊,然后呢在掌握了p6 的基础之上,你你接触了很多中间件,我刚才讲过啊,像这个呃mq的中间件。
像像像这个缓存的中间件等等,你都接触了,那么实际当中呢你设计什么样的结构,去做什么样的接受度,比方说100万的流量过来,你应该做什么样的结构来处理,那么一个亿的流量过来,你又该做出什么样的处理。
所以这块的话呢,就是对于架构的设计和选型这方面,薪资的话呢,其实到现在50万以上了,就肯定是没有问题的,当然掌握了一些理论之后呢,还需要做出案例的设计,比如说给你一个什么样的案例。
你应该做出什么样的处理啊,这是一一的各种各样的案例的处理,这里面比较重要的一个课程呢,是咱们的一级流量,这个专题就是高并发大量来的处理的时候,我到底从前端接收开始。
从网络开始怎么打到我们的后端的数据库上,不让它崩,很值钱,如果你在简历上呢能够写得出来,对于高并发量的处理,对于大数据量的处理,到这个时候你这个简历就会非常非常值钱了啊,相关于原理和设计的一个层面。
看同学们有没有谁有疑问的,公司架构师,豪车别墅丁丁发红包都是几千几千,是哈哈,关于这款,听说有教师不是写代码的,是不是真的,其实是真的,架构师呢,至少不是写那个呃日常的那种业务代码的。
但是架构是有可能写一部分demo代码,就是在我做好结构的基础之上,你怎么去写通这个东西,我给你写个小demo,这是有可能的,这能听懂吧,绝对不夸张,我就是老大,各位同学关于这个p7 的部分。
还有什么有疑问的地方没有,这是咱们最新的课程的更新呃,这个更新的话,那我就不一一讲了,这个主要指的是呢,在咱们课程体系里面是由几百个小时的直播课,外加几千个小时的录播课构成。
这是咱们整个课程体系的结构呃,因为以前老有同学问我说,老师你们是不是只有录播课呀,这个绝对不是啊,咱们呢还是提倡大家伙上来上咱们的直播课的,就这个直播课来讲呢,大家可以看到咱们的直播课的呃。
所有的列表从咱们的网站上就能看到,大家打开来就能看到schedule呃,每每天的直播呢在这里大家都能看到,今天有哪个直播课,今天有哪个直播课,大家都能看到,其实每年呢我们的直播课的话呢,一个方向啊。
几百个小时的直播是不成问题的,这个是要超越很多课程,课程量比较大,嗯所以有哪些在更新,有哪些在直播,大家都能都能看得到啊,跟着学就可以,当然这是课程的更新,我就不说了,那么最新的一个更新呢。
是咱们网约车的2022版,这个呢是新项目啊,大家对于项目比较匮乏的,跟着走就可以了,好吧,这个呢是p6 和p7 ,其实再往后讲呢,我估计大多数程序应该到不了了,还需要我往后给大家伙简单交代一下吗。
需要的扣个一出来我问问吧,好不好,不需要的话,我就不给大家交代更深入的内容了,讲讲吧,听过程是吧行,我快速给大家讲一下,因为大多数人到p8 这个水平,其实是不太容易的,呃我也不怕揭自己短。
我们到现在为止培养的学生里面,真正靠面试,从外面面试直接杀进阿里p8 的,到目前为止呢,其实只有only one一个啊,只有一个难度太高了,他整个面了11次,11次面试。
因为面进去差不多就200万年薪了,知道吧,就是年薪就比较高了,灭了11次啊,差点最后一个还给毙掉啊,那同时p 11般来讲呢到p8 的话,你应该是升值进去,就是你可以面积p6 去,面积p7 去。
然后升值到p8 ,这个是最好的路线,空降的p8 呢比较不容易,而且空降p8 很容易被干掉,你原来的在公司的根基不稳,那么从皮八角度讲,它就不单单是那个技术内容了,它主要是会牵扯到一些相关的管理内容呃。
为了向大家传递p8 的知识呢,我们在整个知识体系里呢请了一位真正的p8 ,他在阿里,他就是原来阿里的p8 啊,他的那个花名叫良禽,如果今天有阿里同学可以查一下,他原来是阿里的皮吧,在阿里高德那边。
原来管理团队就管理的一一百号以上的人啊,当然这里头就开始讲管理能力了,这个咱们再往后再说好不好,年龄特别大的同学,我是真心希望你要掌握这方面知识的,因为呢你如果还在一线车间里面的车床上。
还和那些个刚进来的员工去竞争,你的竞争力已经不太强了,然后呢p9 的话我就更不说,因为p9 的话,我的同学啊,我上大学的同学今年40岁了,阿里做p9 ,最近刚生成,刚刚升为p 10,平时做啤酒。
他的年薪整个是在400万左右,我觉得大多数人呢到现在只能是可望而不可及,往后再说,慢慢慢慢来,就各位同学呢一定要有,对自己呢要有一个综合性的认知,而我自己呢还是有方,各方向能力还是有提升空间的。
一定是这样,你千万不要想着说我老跟着躺平啊,我我就不上进,那你肯定是没有想,那肯定是没有想象空间的好吧,当然呢我请他来呢来给大家讲讲了,专门的做产品管理的课,因为这个时候和技术呢。
就不是特别有关联的东西了,好吧就是他他会讲,他会给你讲什么呢,从整个产品的级别来,带领不同的各方方面面的团队啊,从售前到那个设计啊,到产品到ui到运营,到到到技术啊,到测试到运维不同的团队好吧,然后来。
了解整个的带领这个团队的过程,这个就比较就比较比较更更高一些了,之后就不在不在这完全深入展开了,这个呢对于咱们低级别的同学来说呢,你就把它当成一个给大家伙儿的一个赠送,就可以了,好不好。
等你用到的时候没坏处,听一听一定没坏处,好吧。

这是咱们算是进阶一点的内容啊,主攻的呢我们还是p6 和p7 的两只,这两个级别呃,当然,当然那个从知识点的角度呢其实也不太多吧,也就这么多啊,但其实如果呃后面呢其实主要从两个层面,又给大家做了一些拓展。
这两个层面呢嗯我也希望你能那个讲的到呢,老师的一个苦心,就是第一个层面呢是实战公安,可不属项目落地,什么意思呢,就是你的像你的你的简历里面不太容易写项目,对不对,因为你没做过吗。
老师帮你做好一些个不同的项目,能够让你写在你的上,同时老师就教你呢怎么去无限拓展项目啊,了解业务逻辑之后,脑子里给他做出来写,写进去其实也可以啊,前提是要掌握技术,这样的话那你就呃慢慢的呢。
你的你的简历会比较丰富,简历比较丰富,你就更容易拿到面试机会,这是肯定的,在这里面呢有咱们的合家园项目,咱们的网游,网游的后端项目,这个比较适合在校的大学生,展现你的技术水平的。
比较适合去找实习的那些人,展现你的技术水平啊,这个项目是很给力的,千万不要小看它,很多人都是靠这种项目写在简历上,然后拿到的面试,拿到了实习的机会,然后呢咱们的网约车项目也也比较好玩。
这个项目呢到目前为止已经服务了很多学员了,因为他是一个优秀的项目,原因是什么呢,这个嗯你好好写简历,同时呢又不能够做到千篇一律,这大家能理解吗,就是说如果说你做完一个什么百万千万级别。
上亿级别流量的商城,那么别人一定会问你的商城在哪,你告诉我,但是网约车这件事情啊,你可以随便写,每个城市都有自己的网约车,还有好多好多家啊,甚至小的很小的城市都有,所以你写简历上呢。
它的可信度非常非常的高,尤其而且呢他用的技术也比较靠谱,最新的咱们又更新了最新版,咱们的2022版嗯,这个呢大家伙也可以拿到,拿到咱们的这个大纲之后呢,在从头到尾的读好吧,从项目的基本的概述开始。
到整体设计啊和技术的开发规范,那整个技术站用的是什么,到用户端是什么样的a p服务层是什么样的,健全是怎么做的,订单是怎么做,交易网关地图,支付派单计价中台能力的沉淀,项目的测试到项目的部署。
到项目拓展,最重要的还教你怎么样进行项目的面试啊,总之呢这个项目帮助咱们不少同学,拿到他的进阶或者第一份工作出版的进阶呃,然后我们最新做的项目呢是叫做严选,也就是大家伙儿看到的这个项目啊。

这个这个严选呢,是大家可以直接在上面玩儿的啊。

就这个项目也是咱们对外公开的,也有pc端,也有那个呃。

手机端也有那个那个那个h5 端都有呃。

这是测试商品,大家要是愿意尝试一下整个的流程的话,可以花个一分钱尝试一下,是你需要真正付费的好吧,咱们的整个的严选商城,呃前端呢。

其实虽然看上去它也是一个很普通的商场,但是后端呢其实内容是非常非常多啊。

大家有有机会的可以了解咱们整个的东西。

因为我们做商城啊,是很多做培训的人呢经常采用的一个案例。

因为为什么要采用商城的案例,是因为它的业务逻辑比较简单啊。

一说知道都知道是干什么的,但是呢很多的商城呢都是一个老师,然后带着慢慢敲啊,敲一两个模块出来,后来我我我是感觉,如果是这样的一个方式的话呢,它的第一你接触不到更大,整个项目更大的一个面貌,它的一个梗概。
第二呢,一两个模块呢可能也说明不了什么,就是你你你你写起来的信心可能也不足,所以咱们这个呢是老师投入了很多人啊,从这个人员上,也给大家那个。

稍微看一眼啊。


这是咱们vip的直播地址啊,这是咱们白皮书的购买地址,这是咱们整个的技术的架构。

这是咱们立项启动的过程。

这是咱们整个人员的配备,我这里不是学生啊,各位同学,这里是咱们马云教育为这个项目投入的研发人,员,好吧,还可以吧,就说我是希望的想向大家展示一个在公司之中,一个真正的完整的商城产品。
它是怎么样由不同的团队一步一步构建出来的,o,这块感受到老师苦心的给老师扣个一吧,扣个牛逼出来,ok,就真正愿意做这份投入的培训机构,应该不太多啊,老师还是愿意做这份投入的啊,所以呢我们就我们就建立了。
整个项目的这种层次感,就是说不同的人选不同的项目,然后架构师应该选什么样的项目,刚入行应该选什么样的项目,咱们的那种那种呃架构级别的架构的老师,应该是应该选什么的项目等等。
大概呢就分成了从技术啊到项目两个大的层面,与此同时呢,还有一个呢,最后也是咱们苦心孤诣的最后一项吧,就是确实有些同学就特别想快速的涨速成速成,它的成功的概率就一定要降低,速成对大家伙的要求呢也比较高。
但是很多人的要求呢就是想速成啊,今天上午我见那个同学,已经不速成也不行,怎么办啊,21k回到行业能不能做到啊,问我,我教他两周之内可以呃,成功的概率其实三四十二三十没有关系,就十家里头乘两家。
哪怕你十加成一家拿到了不就ok了吗,所以专门为了速成呢,我们准备了整个的突击冲刺,但这个突击冲刺呢,是建立在以前的这个知识树的基础之上的,这点大家能理解了,就是我们突击冲刺并不是没有把握的。
给你固定的背题,这样是不行的,是我我我讲过,你是需要大体了解整个知识数,这是最好的方式,了解知识数的情况下,想突击冲刺的难度就不高了好吧,所以突击冲刺这件事情呢,到现在我们整个的体系里面呢。
就变得越来越重要,整个的突击冲刺的过程,可以分成呢这么几个步骤,我也顺带教大家,你真正去做自己,怎么去做这种突击冲刺的掌心。

系列 6:P48:【2023】突击冲刺15天涨薪 - 马士兵学堂 - BV1RY4y1Q7DL
我下面教大家做做突击冲刺的掌心操作,认真听啊,各位同学呢,首先第一点啊,就是说你比方说我就想两三周,我就想涨点,涨点钱,哪怕涨2000,你就想如果我两周的冲刺能够涨2000。
我1年是不是就多赚了2万块钱,这是能理解吗,我一周的冲刺,一两周的冲刺如果能涨3000,我1年就是36000白来的,ok所以其实真正的我我我我后来反思这件事情,原来呢我不太重视大家伙的速成。
后来呢我开始反思这件事情,其实很多的同学更希望的是,我最好是快点的见到效果,见到效果之后我再慢慢学,是不是大家伙都这么想的,如果是这么想的,一会儿扣个一好吧,我我我我我认识一下,ok。
哦我想呢我年轻的时候可能也是这种想法啊,但是说句不太好听的,那个我们讲富人的思维是一个要想有收益,我一定是要有投入的,他会想着说我要投入时间,我要投入精力,我要投入金钱,我才想拿到我的这个收益。
但是很多穷人的思维是哥,你能让我看到效果吗,你让我看到效果,我我我就报课,你让我看到效果,我就交钱,你先给我涨了薪,我就交钱,这是个悖论好吧,我教大家怎么找啊,但是我也希望你们能慢慢意识到。
一定是要自己有付出,就自己有付出才会有收益,才会有回报,这是这这才是事物的真正的发展方式好吧,突击冲刺的奖金怎么做呢,这叫做有针对性的重点啊,最理想的方式,如果是我带我,一定是首先要了解你的短板。
比如说你现在是1万块钱还是2万块钱,还是3万还是4万,我想涨20%还是30%,还是40%还是50%等等,这个是根据你具体的要求,我要了解你短板,了解你的背景,你自己做这件事情也需要这么干,懂吗。
就算你自己想为自己掌心也要这么干,就是你一定要首先理解你自己,我的短板现在在哪儿,那怎么离怎么找这个短板呢,其实就对照招聘,对的招聘需求就行了,比如说啊我现在我举个最简单的例子,我现在15000的工资。
我想拿25000,那你就去招聘网站上找看那个25000的工资啊,人家都要求你掌握哪些,我是不是很简单很简单非常的简单啊,你你看看人家25000那个要求你掌握哪些,你看多了你就会发现啊。
12345差不多有五个短板,是不是啊,同学们讲这个能能能能能理解吧,太笼统了,我没办法给你讲太细了,因为有的人那举个举个例子吧,我们举个例子来说好不好,举例子来说,比方说啊他有这哥们儿呢。
原来是15000,那么他会会哪些呢,差不多会呃,spring cloud呃,然后加日常的cd项目,这差不多就这样了好吧,然后呢他他他想说我这个薪水太低了,我就想涨点薪,然后他去找那个25000的工作。
当他打开招聘网站,发现25000的工作至少会要求他什么呢,架构的设计,比如说,高并发处理经验优先,有什么云原生经验优先是吧,有调优经验优先了解原理源码优先哦,什么叫区别,同学们。
你们至少发现了你的短板在哪吧,有可能是在这,有可能是在这,有可能是在这,这点大家能理解吗,啊25k要加油设计有可能啊,我举个例子,我希望大家去读,还是那句话好吧,你是不是就找到你自己的短板了。
所以你找到短板之后,你要想短期突突击冲刺的涨薪,你是不是把短板搞定就可以了,你知道什么叫举例子吗,一叶知秋,有人说不具体,太笼统了,我给你举个例子,我举完例子之后呢。
你又说这叫这跟你们讲的课是真他妈难哈,好吧,都是学生,都是学生,都是学生认知度不足,我要好好的梳理一下啊,那天怼了两个学生,好多小姐姐反馈说老师你不能对学生,不对不对啊,冷静对,都是亲生的是吧。
冷静举个例子啊,举个例子,其实我讲的这些挺简单的,你听下去就挺简单,但是很多人很多小年轻的时候,他没有这个认知嗯,行直接拿个招聘网站举例吧,招聘网站,这个是那个架构师水平薪资比较高的。
我们找那种薪资稍微低的架构师,薪资应该是比较高的啊,这个吧就是2万4万,2万4万,你给咱们看这2万~4万的好不好啊,你就认真读嘛,你看啊他要求你负责什么,负责呃,搭建和系统设计。
平台级的产品设计和研发啊,主导技术的难题的攻关系统,在高并发海量请求下的处理性能能看到吗,复杂分布式架构的设计开发和维护,o你发现没有,他发发现它的关键点了吧,然后接下来他的要求啊,这是他的要求啊。
熟练掌握这个熟悉这个,然后这些个呢是你具体的具体的区别所在啊,就是具体的差距所在,如果你没有的话,呃,应用服务器是吧,什么配置啊,然后呃分布式系统的设计和应用,你看啊,2万~4万。
其实它有个架构师就要求这个了,是不是设计模式,多线程开发,异步处理,这个在咱们课程里面都是很很普通的课,呃其实呢你多读几分,可以多读几分,你们还想看哪份啊,这个吧好不好,3万~4万的16星。
我们看他做什么啊啊技术方案架构设计,概要设计,看到了吗,还是架构设计,对不对,那个嗯人员配备部分管理对吧,要求什么要求还多,这应该是大数据体系,对不对,这就是你这就是你的这个就是你的缺陷点吗。
boot jungle啊,postgresgo,百万级别的高并发高可靠系统好,这是不是就咱们p7 的那部分的内容啊,这些个都比较简单啊,所以你多读几分,你多读几分,你是不是就发现你的差距了。
当然25000的话可能比这个还要简单一点,我只举个例子吧,嗯总之短期的突起的长次冲刺呢,一般来说呢如果经过老师的话,我会第一步我要看你简历,了解你背景,第二步了解你需求。
比方说我需求15000~25000啊,我看一眼你原来只会c r u d spring cloud都不会,那我知道啊,你的短板差在哪,我下一步告诉你,你应该补a b c d4 个点,然后你告诉我要两周。
然后我判断一下,说a b c d4。2周不够,我告诉你可能要20天好,我们要调整时间20天,或者你降低降降低期许,在这个基础之上,二天我告诉你,你优先这个应该学到什么程度,那个应该学到什么程度。
这二天之内应该怎么安排,然后接下来呢在你的整个的那个那个都差不多,第一步,了解背景啊,第二步就是说判定需求是否合理啊,然后第三一步呢是修改简历,这是很重要很重要的一步啊,这不是超级重要呃。
其实我们讲你想要什么样的,多少钱薪资的简历,老师都能帮你改得出来,这边呢100多万的,五六十万的,三四十万的,十几万的,20几万的,七八十万的简历都有的,是你想要什么样的都可以。
其实就可以判断你改完简历之后呢,那个你下一步呢,就是怎么去针对这份简历进行学习,明白吧,补充短板,那么第五步是要干嘛呢,第五步是要辅助面试过程,这个也比较重要,就在你面试的过程之中,别人问了你哪些问题。
你正好发个录音,实在是你搞不定了,找让让老师听听你的录音,你偷偷摸摸的把手机打开,录音打开没问题,没有问题的啊,这个呢也是比较费老师的,那么第六一步是什么呢,练完之后了啊,如果说有就说,试用期稳住。
就有的时候你80的水平写100嘛,那么试用期的时候,老师来有些什么样的难题,老师让gus告诉你该怎么处理,试用期帮你帮你稳住,这整个过程差不多就完成掌心了,呃这这个掌心的冲刺呢比较费老师啊。
嗯后来呢我们总结了很多很多的冲刺的模式,那么在这个基础之上呢,也形成了自己的冲刺的课程,冲刺课呢嗯只能说其中的一部分啊,只能说其中一部分帮大家总结出来啊,差不多现在每个月都有,现在咱们自己的冲刺课。
你像你像这个这个是咱们去年的初,就是呃去年34月份的时候冲刺课,大家看一眼可能就能看出来啊,有好多老师呢来帮你呃,从这个角度,这个这个这个里面有好多人都不会啊,当别人问你的问题。
5年之内什么你朋友对你评价,你还是没有问题要问吗,谈谈你对跳槽和看法啊,你遇到什么问题之后,怎么处理这些软性的问题,很多人都回答不好啊,为什么要离职,尤其是像这种的,你知道吗,你为什么要离职。
一问你就懵了,是不是啊,为什么要立志,因为跟原来的有有有有有冲突,就这种的差不多有70个问题,像这种的就是比较普遍比较比较普遍的内容,就把大家总结出来了,然后呢不同的钱的简历应该怎么写项目。
别人问你的时候,你该怎么样进行进行封装是吧,然后呢每一个不同的面试题,不同方面的面试题啊,常见的给大家总结出来,所以呢在大家伙儿辅助面试过程,这个过程之中呢,还需要被冲刺题目啊,大概是这么一个过程。
听懂了吧,这回大家举个小例子啊,就是那个有那种特别难的难题的,有那种特别特别难的,那那那那种男的,因为这里面比较费老师老师帮你评估,老师帮你怎么样,特别难的,不好评估的呢。

我们随便来,曾经试过,就是那个我们是专家会诊,然后呢报了咱们学的课呃,但是呢我们平还是同学报了他们mc c的,是这样,就有这个学生33是33了,然后大学还较差。

然后一直是在做运维这方面,可不像咱们现在的制定都是这句话呀,这样的话我最后拿到结果还是很不错的好吧。

差不多这么一个过程呃,这个呢也是咱们的整体的知识体系了。

我就我就讲完了,也顺带着呢教了大家呢,你怎么样去做那个突击。

怎么样去做冲刺,怎么样去做入行等等,呃,关于这块儿,看看大家伙儿还有什么有疑问的地方没有,专家会诊断是的,下面我帮大家梳理梳理一下,就是不同的钱应该掌握哪些好不好,就说你不同的薪资应该学到什么程度。
这个可以吗,因为咱们的课呢差不多是从零从零啊,一步一步带大家呢到一个很高的薪资水平,百万左右啊,呃首先我会帮你判断你在哪个台阶上,然后再从课程体系里把,帮你梳理一份定制化的东西出来,这是咱们的特点。
好不好,在多少钱的,差不多掌握到什么程度,ok,讲到这,我就稍微给大家讲讲,这个我们自己不同的路线的事情,其实每个人啊,我我理解啊,就是我做培训以来,从最早的那种大班课嗯,到后面尝试小班教学。
但是一直没有做到一个点,就是一对一啊,就是一对一,就一对一这件事情,我认为那是效率最高的,为什么他是效率最高的呢,就是一个人同样是两个学生,这个学生呢他对spring已经比较熟了。
实际上是没有必要让他在spring spring上浪费时间的,而另外一个呢是什么都不熟,那他就得从头开始学呃,为什么做一份大而全的课,就是因为我想让你在这个大而全的课程里头,找到自己最快的那条路线。
而不是说非得从头到尾按部就班的全球案,不是这样子的啊,所以呢我们一般的呢是你入学之后呢,帮你了解你整个的知识背景,了解完知识背景之后呢,了解你短期的诉求,短期诉求的基础之上呢。
我再来帮你梳理你应该怎么样进行学习,然后我举个例子啊,这都是举例子的过这个呢是一个小例子,就比方说这个学员是一个零基础,它只是简单接触过java语法,没有系统深入过,想在半年之内找到工作啊。
那么这部分该怎么做,先让他第一阶段干嘛,第二阶段干嘛,帮他梳理好这份路线之后呢。

实际上他打开,比方说打开之后就可以学了,直接打开就可以选。

这样他会他会比较省力气,他就不用在那些特定的地方浪费时间,明白了,像这种嗯,我们再再打开一个看看吧,这里面举了几个小例子啊,我们拿这个体系大纲来说吧,就这个的话那就就比较深入了,就内容就比较多。

比方说嗯这个项目是吧,音乐数仓的项目。

你应该去掌握哪些,再掌握哪些,直接打开看就行了,就是每个人呢给他们不同的路线。

当然这会这是一个特别全的路线啊,就从头到尾特别全。

你们没必要搞这么多的好吧,刚才有同学问说大数据的,其实大数据在这里也全都有啊,因为从架构师的角度来讲呢,你这也是需要掌握大数据的呃,帮你从这里面梳理好整个路线之后呢。

你其实有了这份大纲,你自己就能看见,打开就可以就可以直接学了,这是咱们的特点。

这个到目前为止,好像还很少有机构能够做到这一点的,好吧,就是我想做到真正的一对一,在这方面做出深入的尝试,这个苦心也希望大家能鼓励一下,好不好,没事啊,一会儿大家有什么特殊的问题。
我也会跟帮大家毫无保留的解决,好不好,得喝口水啊,那个。

下面我跟大家简单聊啊,因为这个呢每个城市和每个城市也不太一样。

我跟大家简单的就是不同的钱,不同的钱应该掌握哪些好不好,我们就先以那个北京来举例子,因为这件事情呢,钱这件事情啊,他各种的那种那种,偶然因素比较多,他跟那个具体不同的那种地域也很有关系啊。
上海跟北京就不一样了,深圳和那个哪儿就又不一样,每个地域有每个地域的特点,我给大家描述一个粗浅的描述是吧,你就不要说太粗了,太笼统了,这个没办法太细致好吧,但是我大概的你你套用一下。
应该也能知道朝哪个方向去呃,我们就以北京来举例子啊,大家想了解多少钱呢,你了解一下你你说一下我们从低到高慢慢说吧,好不好,北京地域是不是有点高的,我们我们从低到高慢慢说,我们说6000左右吧,好不好。
六七千七八千好不好,我觉得6000~12000吧,这样这样一个薪资水平,这个其实啊就是咱们我我我前面讲的p4 ,这个其实就是我前面讲的p4 ,能听懂吗,我就不重复了。
ok就是那个spring cloud到那个加项目就够了啊,这个月薪其实就是那个批次的水平,ok那么我们说永远有二,到18000就这个水平啊,在北京来讲呢,就是比那个应届的时候强,比应届强的。
1年左右的那个水平不咋地的程序员,这个主要是你要有项目经验了,懂吗,就是你那个项目经验真正在企业中做过了啊,这时候呢哪种心思,然后再熟练一点,再熟练一点呃,spring cloud,什么中间键。
什么m q啊,什么这个缓存是吧,redis啊,什么数据,各种各样的数据存储啊,初步的大数据技术等等,好,这个时候呢项目经验差不多1万,18000~25000吧,因为每个人呢怎么说。
就是每个人他的那个学历也不太一样啊,有的学历的话呢可能到这种程度,没准他拿的就是2万多的薪资了,学历高嘛,嗯不好评估好吧,就快要太开放了,我无语了啊,其实有的时候一个岗位来讲呢,熟练的人和不熟练的人。
这个跨度它不不是很宽泛,好不好,熟练的人和不熟练的人好吧,有的那个学历好的人和不学学历不好的人,他跨度不要远远超过这个跨度,比想象中跨度要高得多,我们就拿入行来举例子入行如果你刚入行,大专生。
刚入行拿不到薪水,或者拿一个6000 8000的,8001万的太多了,但是你刚入行的那种特别优秀的应届生,985背景的进了大厂的,你说多少钱,腾讯去年给的白菜价年薪是40万以上。
外加每个月的4000的房补,你告诉我,你说你你告诉我怎么跟你跟你跟你说,这个你来你告诉我怎么给你给你列这个列列,列列列列列列列这个这个这个这个范围,这个跨度没法跨好不好。
所以最好的办法呢是老师帮看看你的背景,看看你现在的薪水是不是有差距,差在哪儿了,明白了,所以这玩意儿呢你说这个跨度大了,我还觉得这跨度小了啊,好我们说25000~4万,各位同学,所以听我说。
其实跨过25000是一道很重要的坎,就是2。5是从落地到设计的卡,初步的,你从那个落地开始,然后慢慢的转向设计,我跟你说,你要跨越这道坎,就超越超越了2。5~2。5的这道坎,就是相当于你原来的时候。
只是在那个项目组里面扎扎实实的给你任务,你就做的那个人变成了,你可以坐下来跟领导一起探讨,整个技术解决方案的人,这个时候是2。5,他是一个坎儿,在北京来讲,这个大家听懂了吗。
来这块听懂的同学给老师扣个一,对公司不同,我刚才就强调过,就是说这种东西他没真的不好不好谈啊,就是二代二代,就是你的背景不一样,运气不一样,公司不一样,学历不一样,他的薪资前后的跨度差太多了。
就是哪怕你同样的技术点都差都差很多啊,2。5是从落地落地到设计的这道这道这道坎,那么这道坎的话呢,差不多呢,你就开始慢慢的进入到一个可以进行,在换项目组里头有话语权。
那么这个时候是你你需要掌握哪些知识呢,其实就是原理源码,原理源码,然后初步的这种架构选型,呃初步的软件工程等等这些啊,那么再往高里,差不多年限要到50~100万了,就这种程度啊。
这时候需要你掌握的宽度就很高了,4万往上,对的给大家举个例子吧,举个小例子,我这个确实比较粗啊,你要是说那个你特别想评估,你自己的薪水是什么样子,把你的背景告诉我,这时候就能帮你评估出来。
不然的话真的很难评估啊,给大家举个小例子,那个,也是我特别爱举的一个例子,他非常典型,这是咱们就业学员里面的,曾经在腾讯啊拿过90万年薪的一个学员,就这个这个学员好,这是他的面试题。
大家可以可以可以感受一下啊,这个是他的面试题呃,当年在腾讯是90万年薪,这个是一个架构设计,做一个红包雨,30秒抢1亿,进行资源评估,进行那个架构的选型,这能看懂吗,这是他的答案,大家可以了解一下。
就是这道题的它的深度和难度到底在哪里,进行基础组件的选项,进行架构的选项,进行应用的架构的设计啊,进行高可用的接入层怎么做,应用层怎么做,网关层怎么做啊,数据和监控怎么做,日志怎么做等等,呃证实。
因为我们了解到这个深度的这个题之后呢,才为大家准备了架构设计专题,然后才为大家准备了,你像咱们的这个严选项目的,它的具体的内容,严选项目的白皮书呢,呃大家希望大家找找人去要啊,需要。
就是我们现在每一个项目本身,都有自己的白皮书,我看看我这里还有没有可以打开来,给大家伙大概看一眼,在这我们本身呢是要把这个项目给大家做成,大流量高并发电商领域的核心项目,我们的需求的分析到业务。
涉及到应用架构,到那个不同的那种服务的设计,到容器怎么做,怎么部署,到微服务怎么治理,怎么做链路追踪啊等等,这些全在这个一个项目里头把大家做了出来,就相当于呢这份架构不仅帮你设计了,还帮你落了地。
就是所以它是一个很具价值的项目,好吧嗯嗯你说有同学说了,老师你这一跨度就跨了好几10万,这我也没办法,因为你看看刚才那个招聘的时候,你也会发现这一点了,你说他一个跨度,它价格是35000~55000。
他本身跨度就很大,发现了没有,然后2万4万本身就跨了2万,是不是3万4万跨了1万啊,16薪55五六十万年薪嘛,所以其实当你跃升到设计这个阶段的时候,你的薪资薪资程度就打开了。
所以跃跃升到架构师的时候,跃升到百万级别高并发处理这样的东西的时候,你的薪资就打开了,听懂了吧,当一步一步来,因为今天听的同学呢可能好多是刚入行,他的他的好多疑问点还在于说。
我是选java还是选go on还是选什么,其实我跟你讲,无论是java还是go on,最后你的初级出路一定是架构师,再往上就是技术管理,要不然的话你的薪资也就停留在语言上,那么语言上的薪资永远是很低的。
他天花板是很低的好不好,那么你想想看,对于redis来讲,对于架构的选型来讲,它跟语言的关系有那么大关系吗,只不过java更适合往架构师走,go on稍微的差一点点就行了,这个意思好不好嗯,嗯行吧。
我这个只能说一个很粗的了,没有办法啊行,待一会儿看看还有什么具体的问题没有,明白了是吧,ok这样啊,现在是10:20,我十分钟,那待会聊一下我们最近的一个活动,然后大家会有什么具体问题我来回答好吧。

呃最近呢我们26号到31号,是咱们整个的m c a项目的这个组套餐,的一个庆典,周年庆典,我们是三周年,那么在这个三周年里面呢,第一你愿意跟老师学,老师就会让你很省精力,很省时间的让你涨薪或者入行。
同时呢我们对这今天开始报名的同学,有一些特殊的优惠,第一个优惠呢是咱们周年好礼的时候,是参与抽奖,由于咱们是三周年的,抽奖给的奖品比较重,一等奖呢是一个macbook pro,二等奖是两份iphone。
三等奖是三个ipad,四等奖是四个大疆的无人机,五等奖呢是哈曼卡顿的音响,五个阳光普照呢是500块钱的京东e卡,这个是会在这个月底31号的晚上开讲,那么开奖的同学前面从今天开始啊。
今天开始26号到31号,周五天报名的同学,前20名除了享受抽奖之外,享受咱们的六期免息,享受咱们的白金的vip卡,赠送咱们现有的全套书籍,另外呢抽奖第20名到第40名呢,是六期的免息参与咱们抽奖。
第四名到60名呢是我们的,你今天晚上因为听听课的同学啊,我发现了啊,就是那种感觉刚入行的同学,甚至还没有入行的同学比较多,本来我们这两门课就是入行的,这个java基础工程师p4 那个课就是p4 。
p5 那个课是单独收费的,p6 到p7 ,这个课呢是咱们架构师的课,是另外的单独收费的,这样今天呢如果你报名架构师课,老师会免费送你一份这个课啊,这个的话,那我就限今天报名的就行好吧。
只限今天报名可以吧,就是说你以后就不用java方向的,你也就不用再报任何课了啊,咱们课就全要了,从入行到架构,慢慢跟着老师学一个台阶,一个台阶往上走,别的不敢说,12年送你上个台阶。
12年送你上一个台阶,这个完全是可以办得到的,只限今天报名的各位小姐听好了啊,只限今天报名的马老师,这个课堂送的听懂了吧,其他的就不送了啊,嗯入行是从基础课开始,对啊每次都有都有同学问多久能学完。

不要太指望学完这件事,就说我还是那句话,就是以台阶为基础,比方说你想入行,其实刚才有同学问了,说我三个月不吃不喝的。

每天都在学,行不行不行,够不够够了啊,绝对够了,所以以目的为基础的学习,定制化的学习是咱们的特点。

希望大伙能慢慢接受这一点,你会发现要比那种对所有的人,课程的内容都一样的那种学习效率要高得多,好吧,这是咱们最近最新就业的一些同学学院的信息,这里面大概是1200位学员,无一例外,要么涨薪。

系列 6:P49:【2023】你为啥在一家公司呆不住? - 马士兵学堂 - BV1RY4y1Q7DL
下面我们解决呆不住的问题,你就呆不长吧,不能就待不住啊,你去了待一天也要也要呆呆了一段时间,是不是还待不长的问题,这个问题呢其实更容易解决,这个问题的核心还在于你的心理心理素质,你的心理素质一定要过关。
简单说就不是一定不要怕丢人,知道吗,脸皮薄了,你在这社会上没法混的,在这个很内卷的时代,你脸皮越薄,你受的伤害就越多,越羞涩,你说的祈福说的说的说的说的打击就会越多,你会越羞涩,你会更羞涩。
你就没法混了,稍微慢一点好吧,不要太怕丢人了,还是那句话,我先问大家一个核心问题嗯,你待了两天被人踢出来了,有什么严重的后果没有,去了大家聊了两天,直接被人踢出来了,星期二去面的,星期三上的班。
星期五被人踢了,你有什么后果没有有什么严重的后果没有没有,就是心理上觉得自己过不去嘛,对不对,为什么你全是靠着背的题,只上谈兵,你开玩笑呢,你跟王语嫣似的,你就跟那背背武功招数,你你能上场跟人打吗。
你打不了啊,我告诉你这个阶段应该解决什么问题啊,一般的情况下,我告诉你,正常情况下,其实啊大多数人是能待够两周的,我跟你讲,为什么,因为你刚去的时候没有人说上手,二话不说,拿核心代码丢给你。
你明天就得给出解,我那你就不是新人了,对新人没有这种要求,大多数时候首先是要你熟悉他们的整个项目环,境,用了哪些东西啊,我们项目是做什么的,业务方面的培训,环境方面的培训或者叫了解。
然后呢才会丢给你具体的某个模块,让你去进行新开或者修改,是不是这样啊,同学们,那这个时间有多长呢,短的两三天,长的可能有一个月,你要真的去了银行的那种,前一个月什么都不干,就就给你赔业务。
你这时候你告诉我,我的我待不过两周都待不过不可能的,周文能理解吗,能理解,给老师扣个一来,没问题吧,就是你再过两周基本问题不大啊,哪怕就是短一点,一周不好告诉你这两周该干嘛,这两周同学们。
你们想想该干嘛,我问你该干嘛,你是不是重点,第一需要了解业务,第二需要了解开发环境哦,原来人家用到了redis 5点几,原来人家用到了是idea的,哪哪哪哪一个版本,linux,哪个版本。
spring哪个版本好,我大概了解了啊,业务我也具体了解了哦,原来他们做的是一个财务的这个核算系统好,或者说他们做的是一个这种呃,我要上到网上的核酸系统好,我大概的业务流程我也了解了。
那下一步你该做的是什么呀,这时候需要做的是哪个要用,马上要用的学习哪个,很简单,打开咱们把视频调用的官网,你就找说我下面要用到了你,less the search,好,晚上给我玩命学,这时候我就要求你。
必须给我干到后半夜干就是了,用到了dios了,好,给我干到后半夜用到了什么,这个这个这个这个nt了是吧,你给我干到后半夜啊,用到用到了什么高,并发了好,你给我干干,干到后半夜。
白天你正正常常的在那该怎么参加培训,参加培训,晚上回来使着劲儿的,不要在人前努力玩了命的,在屁股后头赶紧追啊,我该做什么操作啊,黑虎掏心这么练,我赶紧练两下,明天黑虎掏心可能要用上了,知道吧。
然后接下来你就可以上手去上手做这个东西了,好这个时候嗯,因为你这时候的学习都是树叶子啊,这时候学习都是树叶子,都都是实战啊,这个参数该配什么,那个参数该配什么,你晚上尽可量的都要把明天要用到的东西。
赶紧熟悉一遍,第二天来开始真正的上手,开始做开发,做开发这个过程往往还是不顺利,我以前遇到的一个特别印象,让我非常深刻的案例,那哥们儿是英国硕士毕业,大家都知道英国水硕,英国硕士都标水啊,1年制。
然后本科也不是学这个专业的啊,硕士1年学了,学了一个那个计算机,回来了,回国回头搞,让他搞的什么搞搞搞一个spring,简单的配置都搞不定啊,但是他面试的时候就人家对他印象还不错,你知道吗。
一定是这么这么搞进来的,然后呢,别人正常十分钟能干完的事事儿,他是两个小时都干不完,这没什么可说的,一看就是实践经验非常不够,1%都不够,但是这哥们儿呢他就是脸皮比较厚,然后你怎么训怎么骂,你知道吗。
他都能扛得住,所以我这时候就需要你的心理素质一定要过关,别人骂你没关系,你给我待到ky,为你不要脸皮薄,自己辞职,伦敦大学,我没有说伦敦大学,英国好多水,说这打击面有点宽啊,但是他那个肯定是比较水。
我忘了哪个大学了,待到开掉为止,这个这个能理解吗,兄弟们没问题吧,但是你给我记住你,我就问你啊,他做了一件事情,别人干十分钟才两个小时,搁那蒙着满头大汗,搞不出来好,我就问你,这两个小时是你。
你认为他有没有收获,很简单吧,你你骂了他一顿,但是他两个小时搁那使劲搞一晚上,中午也不吃饭,反正就使劲搞两个小时才搞出来,有没有收获,有没有,这个技能是他已经掌握了,另外试用期的工资才拿到了,开不开心。
他不开心的唯一的一点挨了骂了,实在受不了你的时候把你开掉,但这个时候你已经把a b c d e f g里面的acg,这个技能已经已经亮,已经练会了,那你还有什么可怕的呀,你这个时候有了部分的实践。
又通过背题,还能面试,还能通过,你还有什么可怕的,你下一家是不是能给我带到四种,在下家是不是能够待到12周三个月,你待到12周三个月,你还被人开了,那那那那绝对就不是那个技术问题了啊。
那就是为人处世的问题,你知道那那哥们儿那个来了之后,先勾肩搭背的是吧,找找找一个老老成员啊,我把那人问的烦的烦,我也问哼,没开掉,一直在公司呆着一把就成功,ok就这哥们儿其实很值得佩服。
人什么时候的成长最快就是这个时间,这个时间的成长的速度远远高于你的预期,以前有个小姑娘姓赵,叫赵光,后面我就不说了,这这这这是真人啊,真名来的时候什么都不会,s p s s什么什么语言统计语言。
谁为什么,那玩意儿我们要求的是用vivo c加加vc,c加加里面还比较难的那一类,每对他一个要求很简单,就是一个月之内,你必须上手给我做一个简单的东西出来,每天黑眼圈过来,小姑娘一个月之后就真就真做了。
什么时候成长最高,我告诉你,在有压力的时候,在你真正开始为为了一件事情,而玩命而拼命的时候,这个成长是最高的好,当你能够呆住了,确认你自己能够呆住了,下一步干什么啊,系统提手,这时候你又该进行系统化了。
该进行细节化了,这样的话在你下一次再去跳槽的时候,你的准备时间也够了吗,整个过程我大概的就就聊到这儿,这里面落就略过了很多细节,有些细节呢我单独讲给你听,那这会觉得你听上去觉得有用的,你给老师扣个一啊。
我这费劲巴拉的也说了,大概一哇塞一个半小时了,这是一个普适性的过程,这里我讲的是那种水平还比较差的人,搞定工作,有一些水平比较好的,比如说已经在学校里就开始练这个分布式了。
其实你这个过程要进行的比很多人要容易的多,到今年今年很早就体现出来了,甚至去年都有不少同学到现在学个s s m,就想出去找份实习,这个时代已经过去了已经过去了,分布式基本是必须的了,微服务是必须的。
也就是说你至少要达到这个程度,你才能够讲比较有把握的,拿到一份入门性质的工作卷,一点点嘛,无非就是多付出一点,多学习一点点嘛,而且目前整个的就业形式体现出来,叫做向专业化发展。
中间转行的找到工作的概率会偏低了,为什么基础不牢,所以用用最快速的方式,如果你要愿意,可以用最快速的方式,先找一份实习,或者找一份初级的工作,然后再进行系统化学习,不相应的基础好,这里呢我等我。
我给大家讲的是你怎么去找到一份初级的,比较低端一点的工作,关于下面我要教教,我要教大家怎么找高端的工作了好吧,那个关于我上面讲的这这这这这个这个过程啊,大家伙还有什么有疑问的地方,你先提。
我下面讲完这个教大家怎么去找高等的工作,毕业就找一份高起点的,然后毕完业就找高级点的对吧,然后23年我就想进大厂这种的啊,或者说我要我想呃百百万年薪以上的啊,50万~100万的这种的。
我教大家现在怎么找这些,各位同学,那个关于上面我讲完的,这是普适性的东西,还有没有同学有疑问的,有疑问你直接提啊,没有没有问题,你给老师扣个一,我看看有多少,嗯给点反馈,稍微怎么听这个呢,就你就听。
你要是不爱听,你当听,当听一个故事,你只要心理素质过关,能够吃得了这点苦,我肯定想吃这个,这这套绝对能搞定,我以前的记录是十天,他只会html css s,连javascript都不会。
我送他这个行业十天,这是我记录运行者开发完不晚,多大年龄了,然后以前是做什么,你自己的期望值是什么,这个一会一会儿详细的,这得详细一点啊,算是可以,难不不难啊,如果如果大家会想要那种。
比方说我想拿到3万的,我应该去具备哪些,然后6万应该具备哪些,这个我可以找一下,咱们小姐要一下咱们大纲大纲写的比较清楚啊,咱们大纲是这么组,知道都打了,瞅一眼啊,一分钟,我打开一下。
嗯咱们大纲呢分成222部分啊,大概就是,怎么说呢。


解释一下吧,这个是咱们的java入门版啊,这是咱们python的入门版,这是咱们架构师的那个版本嗯,就是说你想拿到一个什么样的薪水呢。

就看你现在处于一个什么水平上啊,这是l o t的入门版。

网网网网安的入门啊,然后那个web web前端的大数据的等等。

先选方向,选好方向之后呢,想拿到一个什么样的薪水呢,可以参考咱们大纲大纲里写的也比较清楚啊。

嗯这是咱们架构师的教师的话呢,上来就是p6 了,那个如果是还没达到p6 的水平呢,参考咱们前的就是java后端工程师,那个那个那个是p5 的啊,你像pu什么水平呢,大概就这里面给你写了薪水了。
你自己看就行了,好我不想这呢也要跟大家强调一点,就是马老师给你的大纲呢是一个最大值,什么叫最大值呢,就是你把这些全掌握,那你的概率非常高,90%以上的这种概率是你,所以你看上去知识点会特别多。
但是我刚才也讲过,这本质上是个概率问题,我教你,我看了我,我了解了你的背景之后,我觉得你欠缺的点在abcd,我就先优先给你补abcd,这个时候你就可以用一个,百分之五六十的概率去拼,这是效率最高的。
各位能听懂吗,所以大家也不要被这个大纲所吓到啊,拿过来之后呢,自己自己可以考虑去读一读啊,你像做p6 来讲呢,它大概是一个什么样的形式,就是30万~70万左右啊,这基本上就涵盖这个诺曼级别的。
基本上就是从0~30万左右,当然它会有一些重叠交叉的内容,每个人的背景不太一样啊,每个人的背景不太一样,所以呢其实每个人的重点的学习,优先的学习的东西也不太一样,这点你一定要理解。
所以我们教大家的时候呢,就是先了解你背景,你的诉求是什么,然后会告诉你在这个诉求你的背景之下,你应该优先去怎么样去掌握这个速度比较快,这就是为什么你看我们安利的时候有好多事,其实它时间很短。
三个月的业余时间是我们建校的普遍时间,基本不会超过六个月,这里指的是业余时间啊,并不是脱产脱产,那就比这要牛逼多了啊,我们脱产的那个那个那个那个效果呢是去年呃,上海的时间,50%以上是24万~30万。
就是刚刚毕业的同学,22%以上是30万40万啊,3%左右是40万以上,然后没有低于15万以下的那个,剩下的就是15万到18万,18万24万这两个坑啊,这是我们就是线下的那种那种效果。
脱产的效果会更好,但是呢一般你如果说,比如说你你你你你没这个时间啊,或者说我已经有工作,我只想提升,就不建议脱产啊,你也可以说我我先不,我不想出去去去干什么,我就想自己先猛学一阵,我现在学线上行不行。
可以先生搞不定了,再去线下,导致一个概率问题啊。

系列 6:P5:CMS深度解析 - 马士兵学堂 - BV1RY4y1Q7DL
好仔细听,我今天给大家讲cms是什么东西,这是面试的重灾区,这个c m s最重要的一个区域和和,和那个前面的最重要的一个区别是什么呢,前面叫做serial parala,这个叫什么呢。
这个叫concurrent concur,叫并发,并发的核心是什么东西呢,这个emostly concurrent,low pause,collector还是关键在这,low pause什么意思。
暂停时间特别短,t w的时间比较短,看这里cms关键就在这里,这张图你一看就能理解了,这张图是啥意思啊,就是我的垃圾回收线程跟我的工作线程,我们是同时在干活,这样我从外部访问来看。
由于我的工作线程在干活,所以你肯定能给我响应,与此同时,由于我的垃圾回收线程也在干活,空间会诶边玩边整理,边玩边整理,边玩边清理,听上去就爽多了好了,那么你可以想象一下,这是你家空间,这是你你女朋友。
你男朋友好,与此同时,这个时候会有谁呢,要是你爸爸你妈妈他们在干嘛,他们在帮你清理那些小线团啊,哎你们再产生一些小线团啊,哎他们在与此同时在清理吗,那这样的话大家很和谐,一派欣欣向荣的景象。
当然这是理想情况啊,1。8只支持g one吗,必须支持大哥好好,我来跟大家聊一聊呢,这个cms啊到底是它是怎么怎么来呃,能够做到这一点的,就是那个可以垃圾回收线程和工作线程,同时执行呃。
这里面会产生大量的问题啊,我可以告诉你啊,从cm开始往后,到g one到cdc和shindo啊,这里面的最重要的一个一个一个发展的历程呢,就是说怎么解决在并发过程中出现的一些问题,那我们来想象一下。
如果说我们一边产生对象,一边回收对象,同学们,你们想想一边产生一边回收,一边产生一边回收,会产生什么问题呢,会产生什么问题,最严重的问题是什么问题,最严重的问题就是本来你不是标记吗。
你把这哥们已经标记成垃圾了,但是在我后面运行的过程之中,很有可能又有新的引用指向他了,想想看,我又连上了好,我连上他了之后嗯,是什么情况,由于你已经标记完了,你已经把它标记为垃圾了。
你本来要把它给进行清理了,你下一步就要把它给清掉了,可以把它给干掉了,可是在运行过程之中,诶,你的你的女朋友又有啵扔,扔了一根线条,把它给连上了,她又不是垃圾了,那你这时候怎么办,就会产生错标。
这点上大家能想象的出来吗,来能想象出来的,给老师扣一嗯,嗯怎么会重新连上呢,怎么就不会呢,这是一堆的缓存,你得缓存,本来我在缓存里头命中这个了,命中了嗯,然后呢我用完了,然后还没来得及垃圾回收的时候。
本来他可以进行垃圾回收了,还没来及垃圾回收的时候,我下一个县城来了,又把它命中,这不就又连又连上了吗,这个很正常啊,就是我跑着跑着在里边玩嘛,玩着玩着就把这小线头本来扔了啊。
突然之间哎ok我就发现它有用,我就我就再把它连上了,所以这时候就会会产生错误,你懂吗,这是一个最核心的问题,是一个最根本的问题,就是会产生原来被我标记为垃圾的,后来又变成不是垃圾了。
在整个程序的运转期间,这哥们又不是垃圾了,所以我我是要亲它还是要不清的,我后面的清理过程,我是要清他还是不清的,好这个过程来,这个最最最麻烦的问题能够get到的,来给老师扣一。
嗯嗯当然还会有一些其他的那种小的问题啊,你比如说嗯刚才是是是是轻微垃圾的,编程不是垃圾了,还有一种呢是呃不是垃圾的,又变成是又变成是垃圾了,本来你标记的过程之中,这哥们不是垃圾,可是随着程序的运转。
这哥们儿又变成垃圾了,像这种的这种倒是无所谓,这种你下一次在清理过程之中,你就把它找出来了,所以这种叫浮动垃圾,叫floating garbage,但这个有点细了啊,我们先把这么细的东西先放一边。
我们先来理解一下,这个cm s是怎么解决这个问题的,cm是怎么解决这个问题的,仔细听,你your girlfriend,your boyfriend cms是这么干的,它会进行一个初始标记。
上来之后我要清理了,暂停依然是s w,有同学说老师他还是有s t w啊,对依然有各位同学,到目前为止,所有java的垃圾回收器都存在s t w,所以下次不要再问我这个问题了,所以有没有s t6 。
听我说,我再说一遍,所有java的拦截回收器都有sw,所有go语言的拦截回收器都有sw,python也有,只有某种语言的没有,你们猜猜是哪种语言,c那不废话吗,c是自己管理的,我说有垃圾回收器的。
还没有s t w的,就是你不用不是垃圾回收器,就是你不用自己管理那垃圾,然后还没有s t w的,有没有唉,只有一种rust,目前只有一处,ruby no donut,no,rust是啥。
rust是一种馒头的牌子,嗯以后要多吃啊,rust听上去就好吃,你想一个一个一锅大白馒头蒸出来哇,冒着热气啊,甜甜的感觉,rust,rus为什么这么牛,后面讲给你们听,rose的牛呢。
它的原因在于编译它的编译器做的特别牛,它采用了租界的概念,好了不说了,这个扯的有点远了啊,再说,所以c m s的第一步呢是叫做初始标记,这个初始标记干一件什么事呢,他就是找到那些根对象,听懂了吗。
因此它确实有s t w,但是他时间不会太长,为啥呢,因为你的根最小没那么多,跟对象很少的,这是你的根对象,然后根下面啊管理的一系列的list,一list里面有管理,有要练练练上一系列的对象啊。
这个对象里面有一些成员变量等等,这个里面还是大量的找到根对象并不难,因此这个s t w时间并不长,他是可以接受的,几十个毫秒啊,几百个毫秒而已,好最复杂的,最容易产生产生最耗时间的。
其实是跟对象下面找这颗对象树,去滤过滤这边这个这个对象数哦,但是正好在过滤对象数这里会产生它是并发的,就是我的垃圾回收线程一边过滤这个对象数,你的工作线程也可以改变这颗对象树嗯,那么大家你想一下。
就会产生我刚才所说的漏标问题,就是本来这哥们儿不是垃圾,结果你把它给清了,这肯定不行,那怎么纠正这个问题呢,纠正这个问题,c m s采取的标记,这个这个做法是这样的,他下一步再采取一次s t w。
在在重新标记这个阶段里头,听我说cms的区别,jy的区别,z gc的区别,他们重要的区别就在这儿,c m s叫做cms和g one和go语言,采用的都是三色标记,而z dc采用的是颜色指针。
叫color pointers,我们先说结论吧,好吧我我我这个是不是是不是能能说清楚啊,你说的对啊,你说的特别对啊,我错了,thank you,我再说一遍啊,再说一遍,不知道就这点呢是你面试的时候。
能不能跟面试官聊清楚的,关键点,就是你跟面试官聊清楚这个问题之后,我跟你说,基本上是那那基本基本这个岗位已经拿下了,好吧,再说一遍,由于我的病发,我的垃圾回收器跟我的那个工作线程同时进行。
会产生一种什么情况,都会产生一种错标,鼠标的意思是什么,原来这哥们已经被你标记为垃圾了,但是运行过程中它又变成不是垃圾了,但是你一定要保证不能把它给回收掉,那这个机制是怎么做到的。
目前采用的有好多种算法呃,cms和g one他们采用的都叫做三色标记,只不过呢采用这个三次标记,c m s呢它的细节呢叫incremental update,叫增量t增量更新。
而g one呢叫s t b叫natural at the beginning,叫快照,然后cdc采用的是什么,cdc采用的颜色指针,颜色指针,它是采用了操作系统里面的虚拟空间的概念啊,颜色指针对好。
大家先记着这个结论就行了好吧,就是第一遍先先找根儿嗯,中间的过程呃,不断的进行标记,标记标记,然后最后再来一个重新给它,把错标的部分再给它纠正过来,纠正完了之后呢,再进行清理。
那有同学在这可能也会问说老师,你在清理的过程中也是并发的,那这个时候又产生了新的垃圾呢,产生新的垃圾,下一次一个循环再给他弄过来了,所以这种垃圾就叫做浮动垃圾,就是在你垃圾清理的过程之中产生了新的垃圾。
floating damage,好,这个大体的过程除了中间的三色标记算法之外,我再说一遍,整个大体的过程,除了中间的三色标记算法之外,来能get到的,给老师扣一,嗯嗯让我们来那个稍微的复习一下啊。
cm的初始标记的时候只是找到根对象,ok cm s找到根对象之后会并发进行标记,在标记的过程之中啊,注意看啊,找个对象品牌标记,标记过程中,很可能这个地儿啊,你原来已经被你认为是垃圾了。
可是很不幸在运行的过程中,它又变成不是垃圾,由于引用指向它了,好它又变成不是垃圾了,那这时候怎么办呢,会进行一个remark,remark又把它标志变成不是垃圾,然后剩下那个那才是垃圾,把他清掉好了。
你后面要讲算法,想想看是不是有点有点懒累,我们讲实战吧,算法扔一边可以吗,讲实战吧啊嗯讲算法也是要花大量的时间,而且他嗯,这东西你可以在面试之前背一遍就行了啊,三色啊,那个以后嗯我们我们还是聊实战好吧。
来聊想听算法的扣一,想听实战的,想想想想听实战的扣一啊,sorry想听实战的扣一,小宁算法的扣,7695x6443等,最后的结果,呃呃呃呃呃嗯嗯哈哈哈哈,看来还是还是喜欢听那个那个那个实战的,居多是吧。
算法太难了,对嗯你先记着三色流线就300,这东西你弄弄明白一遍就可以,但是我要给你扣算法的话,那没有个一个半小时,我跟你说扣扣扣不出来的,哎这里面细节太多了,就cms的解决方案和那个jy的解决方。
算法就背哈哈哈,也不能是背了,呃其实你理解的算法越多,你个人的水平就越高,然后你你能够产生你的那个那个那个,你你你你你自己的这种思路呢,也就慢慢的建立起来了啊,真的要停算法是吗,好那我正式问一遍啊。
想听算法扣一,想听实战扣二,我看哪个多哪个少啊,那今天给大家讲算法,明天给大家讲实战可以吗,嗯都都都招不到。
系列 6:P50:【2023】你为什么面试通不过?从底层逻辑分析! - 马士兵学堂 - BV1RY4y1Q7DL
下面我们来聊,面试通过的问题,呃首先大家说啊,大家真听,就是这个面试通不过呀,呃这件事情的本质是什么,技能不过关,小部分的原因呢越久越好,这概率不行,后面这个老师帮不了你啊,就你运气不够好。
老师这事儿真帮不了你啊,我我告诉你了,你说你学的这个差不多90%的概率,你能进到大厂里去,但运气不好,但是就是就问这10%,我也没脾气啊,但是我们下面来解决这个主要主要的问题,就是这个技能不过关的问题。
各位同学你们想一下啊,就是说你你写了一份特别牛逼的简历,然后你拿到面试机会了,然后人家问你分布式,人家问你高并发啊,人家问你互联网三高,你该怎么处理,你丁点都不会,你肯定是过不了关的嘛,你说是不是啊。
那这时候该怎么办呢,就是你第一次的面试,你一定是被被灭了,10000%的被灭了,那这该怎么办好,该怎么办,突击恶补,这个是短期的解决方案,正常的解决方案呢,正常的是系统学习,按部就班呢,你如果时间够。
比如说你今年大三研二这一类的,我建议你永远都是系统学习,这成功的概率就高多了,系统学习完了就不展开了,大家都明白什么意思吧,按部就班的,按照你可以你你要愿意找找我们老师,要一下课程大纲。
你按照课程大纲一步一步来,时间够,这是最好的好,这是系统学习,那么第二个事呢叫突击恶补,我下面教大家怎么突击恶补好不好,来准备好的同学,老师扣个一,我下面教大家怎么突击恶补,就是学东西的有些技巧。
有一些非常快速的技巧,教大家,好多同学听我说,我我我们就用,我们我教大家几个学习的技巧啊,这突击我不该怎么补,按照不同,其实不同的方向都有不同的恶补的方法啊,这个你要是愿意找我们老师来带。
你是最最合适的好吧,我们带来的学生也太多了,你们就可以去人家的,不不不蒙你们,你们仔细去看看我们的案例就知道呃,突击恶补该怎么补,这么来补,我们我们就用那个java来举例子啊,适合其他所有的语言啊。
但是有一些那种不适合的呢,可能是这种什么测试的方向啊,然后晚安的方向啊,这种就不太熟,但我教你啊,呃最快速的方式叫项目驱动,请大家一定记住这一点,今天有多少人,今天有多少人是根本就不懂什么叫高并发的。
什么叫分布式的,什么叫那个互联网三高的,有多少人,你给老师扣分,我看有多少,应该挺多的啊,那真的你们差的有点多,不过没关系啊,举个例子啊,这是咱把这个教育官网。

然后往往下拉打下来之后呢,有一个叫马士兵严选。

看上去呢这个东西呢是一个是一个网网站。

然后是一个电电商平台,还是一个网站往外卖东西的是吧啊,你买了买了这个之后呢,你也可以暂无库存,你也可以那个进行相关的一些下单啊,只要并发编程啊,假如购物车立即购买好,你进行登录等等。
你可以去自己自己去试好吧。

这是咱们呃,是这样的,这是咱们开发的一个教学项目啊,一个教学项目好,我教大家呢就是说在你什么都不懂的情况下呢,你怎么样快速去掌握这样一个项目。

你连你连什么分布式什么都不懂啊,如果你打开这个项目的一些个呃细节。

因为这个项目呢,嗯大概啊呃就是我们是二三十个开发人员,大概开发了好长时间,第一版才出来,就是它不是一个那种那种demo级别的项目,呃,他前面看上去比较简单,但它的后端呢其实比较复杂啊。
我给大家列个前面去,我们看它后台的这个架构,看到了吗,比如说我现在就想要一份,对于离怎么怎么怎么去去,我要在我的简历上要写出来,我这个我要了我要了我,我要理解这个后面架构的这样这样一个东西啊。
我简历上我要写啊,说我我我是理解这个架构的,然后我才能有面试机会,对吧好,那么你这时候你怎么去做呢,实际上你应该这么来做,首先去大体理解啊,咱们整个的架构包括哪些东西啊,这是咱们的运营。
这个这个这个这个不同的用户是吧,然后他们管理的是接触到的是哪哪些东西,然后呢,好下面是一些具体的一些呃这种技术的名词啊,技术的组件啊,包括remyself l rocket o s s短信。
e s lock sth开头,然后你像这种那么在后端的这些个支持高并发,高扩展弹性的这个架构里面会包括呢呃网关,包括我们的微微服务设置,包括我们的技术平台,包括服务的治理是吧。
服务制里可能又有一大堆名词,这个名词你可能一个都不知道,that vigate jenkins,docker k8 s吗,这些我就假设你现在连名词一个都不知道,好不好。
那么你该怎么样快速学习这样一个项目,大家听我说,你们的学习,应该首先是快速浏览整个项目的开发过程,如果有的话,你说的是我们vip快速浏览整个项目的开发过程,里面的好多名词你听不懂都没关系。
我需要我需要你建立的是一个这是一棵树,一棵树的概念,就是你掌握一个知识的时候,有两种学习方式,第一种学习方式呢,就是我们从小到大一直在用的,我们必须把这个树枝树叶的树杈。
树上的那点小蚂蚁学完了之后学特别深,最后呢,我们才能够把这个东西组合成一个,最终想要的结果,或者叫项目粗浅的例子,就是我们平时的学习,是我们一定要去深入的学习,e s e s网安装有哪些语法。
然后又该怎么样要去进行调优,怎么样去配置,配置的细节,有什么,这个参数是什么,那个参数是什么,把这个学完,然后接下来呢我要是用c塔,同样的再来一遍叉叉job,好不好意思,再来一遍redis,不好意思。
从头到尾再来一遍,正常的学习方式是这么来学的啊,这个这个大家能理解吗,就你们从小到大的学习方式,基本都是都是这种学习方式,我们摁着一个点,一定要把它学学细致了,学到位了,各种的细节全都掌握住一个点。
掌握不住我这个焦虑啊,哎呀我掌握的不踏实啊,心里有一种不踏实的感觉,来这块能听明白,老师扣个一不知道,我说我说我表达我表述的有没有问题啊,就是这种这是一种学习方式。
我们其实呢是作为一个知识术数知识体系来讲,我们讲一个知识数上,实际上他每一个这些东西都叫做一个树杈,或者叫一个叶子,我们以往的学习方式都是从叶子开始学,但我今天告诉你,最快速的效率最高的学习方式是什么。
听我说,如果你从叶子开始了解整棵树,这个效率一定是非常低的,你得爬遍每一个叶子,最后才能对这个数产生一一个总体的感觉,当然我不是说这种学习方式不好,他会很扎实,让你走的,让你让你早早。
我刚说让你走的很安详啊,这不合不合适,就是让你往前走的很踏实,你心里头不会慌,但是下面我推荐你的是另外一种方式,如果你想快反过来,这些东西全给我略过,说怎么安装,怎么配置,配置细节是个啥。
扔一边啥都不要管,首先去顺着这棵树,把最粗的树干给我捋一遍,怎么与,如果你要听我们课上来,就是教你怎么把它跑起来,怎么安装好,然后呢会告诉你会涉及到哪些组件,每个组件干什么。
我告诉你spring gateway大概是处理什么问题的哦,原来全面来了嗯,流量之后后面有一大堆服务给他服务啊,他需要路由到哪个服务上,这服务之间的又是怎么样进行耦合,怎么样进行调用的啊。
我们压测怎么样进行链路追踪的等等,查他是干这个事的,好,我大概大概明白了,就用那种形象化的思维,一定不要去追求,说我每一个细节都了解特别到位,就是你这种学习方式一定要反过来。
那么这个时候呢你做出完第一步的学习之后,这个速度会很快,你会初步的建立什么概念呢,每一个组件大概都是干嘛使的,gateway,干嘛的,微服务干嘛呢,据中台里面所涉及到的这些sea是个什么玩意。
它处理什么什么什么问题的,就是它是什么,解决什么问题,首先把这件事儿大体你就可以搞定了,哎大家还在听吗,啊这有点有点那个其实很枯燥啊,我就给大家讲这个还是还是有点枯燥啊,不知道大家能不能停进去。
但我告诉你这个速度是最快的好,接下来接下来你用这种反向的方式,首先去了解整个知识体系,知识架构,首先把这辆车你先学会怎么开,然后再去研究什么齿轮是什么,什么样的一个构造,为什么是这样的一个构造。
它的细节参数什么弧度是什么,切切入角是什么什么这个离离离开角是什么,再去研究这些深入的技术问题,而这些问题叫做,叫做非常的繁琐,特别多,成百上千,所有的技术细节。
你想追求百分百掌握这件事情是完全不存在的,我劝大家也不要追求这个,而你们平时的所谓的这个在地铁上的一些学习,看篇文章,基本上就是说我掌握了叶子上的某一颗小蚂蚁,小脉络,看上去每天都在进步啊。
战略战战术上非常的勤奋,但实际上这个效率极低,非常的低,我希望大家呢今天用以后的学习,我建议大家用项目驱动的方式,为什么要用项目驱动啊,很简单,因为我们最终的目标是要做项目,所以我们要用项目驱动。
用项目驱动的方式反过来学,大家你想想看,作为gateway或者说作为security,或者作为promifs或者graph fa这些东西,它里面的细节千千万,我碎片化的知识时间就可以去掌握它了。
上个厕所蹲一会儿,我可以看看cq里一些东西,一些简单的配置是什么,我记住也好,记不住也好,关系并不是那么的大,因为我知道这是一个概率问题,我记住了,我可以拼,那个60%概率我记不住。
我就拼那30%概率没有什么的,反过来学你就没那么焦虑了,反过来学还有一个巨大的好处,就是当你跨越到架构师的时候,你会发现反过来学的时候,天生就具备架构思维,因为你了解了这些架构架构的图。
它大概位于什么位置,每一个是处理什么的,虽然说细节这样东西还不知道什么,怎么拖过来的等等,当然你想我们的话就整合了很多很多东西吧,就是基本上这一个项目下来,所谓的互联网通讯级别的这种项目就有了。
我想这项目重不重要,这种方式学习好像很难找到资料,找什么资料啊,是不是我们老师们讲的基本上都是这么讲啊,我告诉你效率是最高的好吧,来关于这个这种学习方式,如果还有同学有疑问的,你就直接问,没有问题的。
你给老师扣个一,我们就继续好吧,你像作为我们这个项目来说呢,我就教了大家,不仅教大家怎么做那个分布式高并发,互联网三高高弹性,这些还教了大家呢大数据系列的知识是吧,数据多了之后。
哎你该怎么样进行相关的一些处理,这些这些名词你可能都不知道,什么叫互相一体啊,什么叫可怜house floo,什么叫做blog是吧,什么叫flink,你可能都不知道,但是没有关系。
你只要粗略的把整个项目的构建过程,了解完了之后,然后呢再去找对应的细节课啊,我们这些细节课也都有,前两节课一听你就知道了哦,原来这个东西是处理这个的啊,flink原来是实时实时处理数据,一个数据流过来。
我实时对待进行处理,好了你大概大题就知道了,好你这个时候哪怕你这个时候去面试,兄弟们,你们想一下,你跟那个面试官是不是也可以侃侃而谈谈什么,谈大体的时候我接触了接触过哪些东西,各位能听懂吗。
你是不是就有一定的概率去能够拼下来,这个机会了。

我可以负责任的跟你讲,很多很多很多的这种面试,他其实就问一个大概一个粗略的大概知道吧,我不知道有多少同学参加过面试,有很多要求不是那么高的工作岗位,他的面试过程大概就问问你诶。
你们这个用的用了哪些东西啊,呃你们这里是用到了什么位置啊,你在你在这个项目里面是哪个业务点上啊,用到了哪哪哪些技哪些技术框架呀,基本就问问这个,还有这块大,你这时候就已经的概率能拼进去了。
只能背背也是很好的方式啊,同学们就是作为突击这件事情,请同学们记住我,我教大家背还是狼的小伙,我教大家背,就是背是一种很好的方式,你千万不要小看这个背,我跟你讲,你面试的时候背过的东西,噼里啪啦。
把它把它跟面试官讲出来,你的成功的概率是不是就有了,你好好琢磨嘛,这是面试中很重要的一款和一个部分,讲着呢就说我就拿我们课举例子,目前在讲的是咱们的金九银十的突击班啊,突击课。
我们拿以前讲过的突击课来给大家举例子啊,什么叫突击呃,这是那个呃34月份的时候突击课啊,你你可以看一下这个突击课我们讲什么,这突击课呢,大概首先教大家呢hr的面试软技能啊,这个很多人可能不知道。
就一般来讲呢,如果你是一个hr嗯,他上来灭你的时候,很可能会面临一些软的东西啊,比如说你为什么辞职啊,你对心理有什么要求啊,平啊有什么问题还要问我吗等等,这个好同学也答不好,所以我们首先我会教大家。
你怎么去背这些问题,背这些什么问题呢,就是别人问你这个时候应该怎么答,问那个时候应该怎么答,我问这个时候该怎么打好吧,嗯擅长的技术方向是什么,最能概括你的业余爱好是什么,作为面试和大家分喜欢任务。

为什么要离职啊等等这些,这是咱们以以以前讲的啊。

好就说这是一些软软性问题。

这就是让你背的,你突击吗,你突击不背,怎么可能好,接下来还要背什么呀,背什么,教你怎么写简历对吧,然后呢教你怎么写项目,因为现在所有的简历都离不开项目,然后你就开始背了,基础面试题给我背背。
这个就是基础的面试题,那个呃,多线程呢就是并发的面试题给我背一背是吧,这把面给我背一背,没没关系啊,我就我就这么跟你说,你可以不会啊,可以大体就了解一点点,但是你给我背题就行了,还是那句话。
哼我们原来的呢是讲不过大概400多道题吧,包括软的啊,其实硬硬的题大概有300多刀,这个不用太大家太焦虑,因为这个东西呢叫做比方这400多道题啊,你你掌握了你掌握了四道。
你的概率是不是比什么都没掌握要好得多,这题你掌握了100道,你肯定比那个只掌握20道的,是不是概率要高得多,能理解吧,所定越多越好,你可以在没有完全掌握的情况下去面去拼嘛,你用我前面教你的方式。
拿到了很多面试的机会,你这剩下的不就是拼的过程吗,最多的同学灭了32次成功的,但是没关系,你只要解决了心理问题,你就算面320层,你因为你知道你一定会成,怎么突交这么多,我跟你说了,你完全可以突击。
少一些去拼你概率,你一边这叫以,我们叫以战养战,我今儿有一面试,然后我今天来不及了,我只背了五道题,没关系啊,先去面,回来了之后诶,积攒了一下,他问了我一些新的问题,好我们加上新的问题。
加上再背一些新的问题,明天呢我就是15到后天呢就是25的大,后天就是40~50兆,你在一边找工作的过程之中,你这个概率就缓缓步在提升了,我一般不背八股文,直接改源码啊,你牛逼,各各各位这块能理解吗。
能理解吗,所以面试的这个过程啊,就说嗯背是需要你背一些题的,你可以快速的先掌握某一些框架的东西,然后呢别人问你这个框架的时候,你先去背一些这个框架对应的题,你甚至都没有搭搭建过,甚至都没有上过。
手都没有关系,笔试了怎么办,笔试一样吗,笔试除了算法之外,我可以说其他的跟面试,你跟背题有什么区别,除了算法之外,我就问你对不对,好所以突击恶补项目驱动,如果你你大块知识没掌握的项目驱动的方式。
先掌握大块细节知识没掌握的怎么办,玩命背就行了,背题啊,你要有时间去搭搭搭环境,去实验大环境实现一个小问题,能卡你两天,那个是需要时间的,好,我一会儿讲算法,别急,好,这块大家能理解吗,同学们好。
接下来啊,我看有同学问说老师啊,项目问题怎么办,项目问题问的很细啊,这个我很了解项目问题为什么会问的很细啊,他是不会这么问,一般会这么问,那个你们项目给我做个介绍好,你做了一个简简简短介绍。
你们现在用了多少人啊,哪些人都在干什么呢,你在其中的角色是什么,你们项目用开发了多长时间,你开发的是哪个模块,你用到的技术是什么,你做这个技术的时候有没有遇见过一些痛点,难点难以解决的问题。
你们上线之后有没有遇到一些bug之类的,你们怎么处理的,你们这个地儿是怎么设置的,那个地儿是怎么设置的,如果我说这个量突然大了之后,你们又是怎么处理的,同学们,你们想想看,是不是又问这些问题。
我告诉你大概18个,大概18个啊,这些呢老师早就帮你总结的非常到位了,就是每一个项目围绕着,总共大概基本上有18个左右的问题,这个很简单,提前准备,我对学生的要求,就是你最近新做的两个项目。
你要针对这18个问题写在本子上,给我写下来,然后把它背过,背的时候怎么背,对着镜子,前面有一镜子,你要看着你自己的表情,你什么地方该挠下头,什么地方该打下扣,你给我干这件事,以前有一个专科的同学。
就靠我教的这套方案,第一次面直接定汉王,就是当时那个那个时间时间有点久了啊,汉王现在好像也不在了,你知道他们整个班找不着工作,那是忘了就真没法给你列了,我得给你打开,我的我的我的我的那个那个那个教案。
这个这个没法给你列啊,围绕一些新的,你像我们那个比如说啊,跟我们学的这个严选项目,别人问你该怎么答呃,给我们学网约车项目,你别人问你,你该你又改怎么打啊等等,这一节我们都在我们突击班里教大家。
就是一个一个的教啊,别人问你这个你该怎么答,别人问你那个你该怎么答,你的简历该怎么写,所以你排练一下,还是那句话,你不下苦功夫,你不可能得到一个很好的结果,因为你们的找工作是很粗糙的。
随便网上考个简单的模板,噼里啪啦的往上一堆,好多人连错别字都不改,然后就开始海投,投了一大堆,说老师没有人找我面试,那不废话吗,那不可能有人找你面试,你让我这个他不可能他不可能没人找你面试好。
我还是那句话,用的概率,你比方说你第一次不行,第二次第二次不行,第三次你的面试机会只要有,你就可以一直这么试下去,一定有一次你成了大多数人,基本就在十次以内就搞定了,为什么。
因为每一次的面试会间隔开时间,中间的过程你可以找老师来聊,我这次面试哪哪哪编的不好,我需要有哪些新问题需要总结,有哪个问题我答,我认为答得不太好,老师该怎么回答,这是面试陪宝听懂了吗。
好这个时候你一定有一次你成了,但是马上下一次,下一个更加更加难的问题就又来了,马上下一个更加难的问题又来了,好我我我讲到这里,关于我以前下面讲过的这个这个步骤,还有没有谁有疑问呢,有疑问你提没有问题。
我讲下一个步骤更加难的一个问题是什么,待不住,你面过了,面过了,呆不住吗,面试间隔多久比较好,这个无所谓,这个没有一定之规的,你只要间隔开啊,别让他们俩重叠了就行了好吧,上午10。1桌面试。
结果你又安排一个,上午11点昌平面试,那你不完蛋了吗,好下面我们解决下一个问题。

系列 6:P51:【2023】高端岗位和低端岗位该怎么选? - 马士兵学堂 - BV1RY4y1Q7DL
那个,下面呢我来我来给大家讲什么呢,就是说怎么拿到一个高端的啊,各位同学,我现在要讲怎么样拿一个高端高这个高端岗,首先你要理解这一点,这个高端岗跟低端杠它的区别是什么呢,就是高端岗位。
低等岗位说我想要一份普通的工作,只要入行就行,这种的就是就是相对来说比较低端的,搞这种机会会非常的多,浪费一两个无所谓,但是高端岗不一样,我学历还不错啊,这个我们大厂认可我这个学历。
然后有时候来我们学校面试,很多厂子很优秀,我特别想去,但是呢他的要求都比较高,我怎么样增加我的成功成功率,高端这种的叫做面一次少一次,他的每一次面试是非常宝贵的,近量呢用更高的成功的概率去抓他。
你不要说我的概率现在只有10%,20%,我就去试,刚才有同学说过了,说我念完一次,然后我下一次再给我这个厂子,再给我面试机会的时候,只能是半年以后了,这叫做冷却期,这个冷却期不是所有厂的全是一样的。
有的厂子在着急要人的时候,这个冷却期是没有的,原来有些互联网大厂着急要人扩展业务的时候,我这个嗯,就是我我我这个小这个bo这个这个项目组啊,我就不讲了,项目组说bo很多同学可能听不懂啊。
这个这个项目组我我现在灭了这个人,我不觉得不合适,但是我马上会推给另外一个项目,你可能第二天就会收到同一家厂子,第二次面试,另外不同的不同方向的知道吧,所以大家不要认为说嗯一定的,就是我这个一个同步过。
后面还是会回给我免试机会会的,他给你第一次就会给你第二次,但是中间一般会有一个结,严格目前我们了解到最长的也就是半年,短的,那是3月,还有的呢可能就三天无所谓的事情,我觉得这个不够。
但是很可能够你们那个做的这俩能理解能理解,同学老扣一没问题吧,方向的选择有直播课吗,我原来讲过一个四个小时的详细分析,就只有原神一个人对这个理解了是吗,其他人都不理解,好记住啊。
这个高端钢是面一次少一次,所以你也要珍惜,下面我来讲高端岗怎么进,高端岗一个非常普遍的特点,它要求会相对高,所以这时候呢你一定要攒够时间,你像刚才讲的那个方式,那就不适合高端高,除非你呢就是拿高端岗。
想试着玩那个刚才那个方式,你也可以拿到面试机会的,你放心啊,那高德龙怎么进呢,听我说这里面分不同的年龄段,我们讲比较低龄的这些就是你在上大学,大一大二大三啊,这个时候我的目标是要进到一家不错的厂子。
或者说该怎么办,我想我只想拿一份工作这种低段稿,还有呢我呢什么想考个考个公啊什么的,这一类的,他的学习的重权重完全不一样,这一点你一定要理解,高中党的作为成员来讲,第一个权重,第一的是叫算法。
我说的是高端低端岗这块略过,你知道吗,算了,你不用学,你也可以拿到低档位杠,哎没有问题,算法你能算法突击的效果好不好不好,算法只能是成体系的,然后细水长流的啊,这种每天每周都要抽时间来来熟悉学习巩固的。
这样的学习方法,它才是效果最好的,我现在讲的有兴趣的,你给老师扣个一,你们老师不反馈,我也不知道你们多少人想想想变高端的,好好好好还可以还可以好好听我说啊,为什么算法对于程序员非常的重要,我可以这么讲。
算法是选择程序员是水平高还是低的,唯一的一个一个一个方法,做不了假的,你说你背他不可能知道吗,我们我刚才讲你你那种突击找低杠杆,我可以背,对不对,这种方法你背那是不可能的,你绝对背不过。
所以所有的这些个大城有名的厂,他临遴遴选这些人的时候,遴选的比较专业的厂,他的第一面基本都是算法,而且很多长的是赏析题,你觉得你能够背靠背能搞得定吗,搞不定,这没什么可说的。
你从大一我不知道你现在年龄多大,你从大一开始,大二大三,你从这个时候开始练,它的效果是最好的,他成功的概率就是最高的,算法这块到什么程度,能够到达什么样的场,教大家打开了咱们数据结构与算法这个课。
这个课老师叫左程云,左老师,这里有他的介绍,我相信有很多同学应该是听过左老师名字,他原来是在国内是华中科大,国外是芝加哥大学,读完研究生之后,然后进了亚马逊,靠算法amazon。
然后后来在ibm green i o等等这些,然后回来之后再百度,大概的内容的话呢会分成不同的阶段,对应不同的水平,从入门对算法什么都不懂的水平,都可以参加acm大赛的水平,就是可以参加竞赛的水平。
就是在咱们算法课里就全包含了,嗯不需要所有人呢去学习所有的东西,大概对付一些普通的大厂,普通的厂子吧,我们说不是大厂,比如像那种中型的厂子啊,呃有些国企啊等等这些啊,银行类的啊。
这种的大概呢你就把这个体系班搞完就可以了,新手玩建立算法的基本概念,什么初初级的这种排序啊,这些之类的我就不说了,体系班呢你们自己去读好不好,我先建议你们读一下,对这么一个大体的了解。
体系班呢大概会学到什么程度呢,动态规划啊,先论述呃,这个这个这个这个什么n皇后问题是吧,这就叫k m p啊,莫里斯便利吗,nature等等这些图学到这些,这个我可以跟负责任跟大家讲,你到这个程度的时候。
国内的一些不是超一流的大厂,你基本就全可以cover了,呃京东那个快手啊,这一类的场子基本就全cover了,当然如果你想进字节,微软谷歌亚马逊,不好意思,还得往后练,刷题刷什么题啊。
这是每一个都是一道题啊,每每个课时都是一道题啊,都是一些典型的东西,主要是他牛逼的牛逼的点在哪呢,就是他能够帮你把这些题型全给你梳理出来。

梳理出来大概几十个几十类题型。

你看到你看到它的题的时候,你就大概知道该冲哪个方向去去去努力了,知道吧,这是他牛逼的点,当然还有一些押题的啊,高频面试的这个我就我就说了,好到这个时候,你就基本上可以具备全球一一线大厂的水平。
全球一线大厂不可能,小案例看几个,算法单凭算法啥都啥都啥都没有啊,应届生应届生60万,还是要加油的,有个出100万,完了这次没面上兄弟,应届生出100万,当然学历很好,然后再加上算法牛b。
呃这是理想offer,涨了8k的不说了,算法字节的offer是吧,关键点是什么,就是面试的时候,面试算法题全部写出来,难度比平时教练要低一点点,坚持了学习之后,大多数middle级别。
也就是那个中级的这种级别就特别顺啊,都搞定,这个是左老师比较牛逼的一个同学,拿到offer有什么,阿里腾讯,百度美团滴滴快手虾皮,华为招银奇安信大话小红书,自己看就行了啊,怎么说呢。
就是请大家记住各位同学,如果你想在毕业的时候拿到一个很好的大厂的,这个机会,算法是必不可少的,成体系的系统化的学习算法呃,这个它的重要性在于哪里,国内呢招一个程序员除了考算法之外。
还考一些应用级别的这些东西,spring spring这些这一类的应用级别,但是国外你到国外你看看就知道他们就考算法,是其他什么都不考,像前面我所说的,让你背的那些什么j v m的题啊。
一个个背就搞算法就可以了,国外只考算法,所以如果你的目标是要去国外就业,去北美学习,在你没有系统经验的情况下,你没有参加过工作的情况下,他们只会考你算法,咱们算法课除了罗老师讲算法之外呃。
咱们进谷歌的同学也帮大家专门讲了,怎么样去进到谷歌的那个算法题啊,这是咱们在谷歌的那个同学帮他们总结的,怎么说呢,国外呢曾经有一个非常极端的那个案例,中国东莞电子厂的一个女工,你们自己去搜百度上。
到了美国之后,用半年还是1年的时间狂学算法,直接面进去了,谷歌啊,就这么牛逼,这个大家能听懂它的重要性了吗,那有同学说了,老师我有经验,有35年经验了,我想进大厂算法还需不需要需要你。
如果说你的年龄还是在32岁以下,这个算法就都要我再说一遍,32岁以下想杀大厂的同学,这个都要听懂了吗,部分的可能还要年龄还要往上,33岁没准也考你,34岁没准也考你啊,但是基本上你说34 五岁呃。
再考算法的这种大厂不太多了,就因为那个时候他拉你进去,就不是要你在一线去平衡,而是要要的是你的经验,你的架构的能力,你的设计的能力,他要的是你的那个的能力,听懂了吧,所以在你比较年轻的时候,想杀大傻。
不好意思,这个你避不过去,我说清楚没有,然后那么国外大厂我们先讲国外大厂,国外大厂对于呃你你你你已经参加过工作了,社招的同学,除了算法之外,另外还考一个啊,作为作为国外大省来讲,另外只考一个。
也是只考一个,所以国外大厂面试就这两项,这项叫system design,这个也很难,因为这个是落地,这个是设计啊,同学们设计这个东西呢,仁者见仁,智者见智,他虽然他有一定之规啊。
但是他还是需要你透彻的理解和灵活的运用,这个还是比较难的,那怎么去干这个system design这件事,该怎么样去进系统化的补充呢,system design这件事这么来,不如果从大纲里来讲。
我拿我拿我拿大纲讲啊,从大纲里来讲呢,原理和设计要补的都补的时候是补什么,这是架构设计啊,但是对于系统设计来讲讲,你首先要补的其实是我在前面,我就跟大家说吧,其实是第一你要理解设计模式。
设计的一些基本原则啊,等于是设计基本原则,这是第一,这是第一个,第二你需要分析一些框架的原理和源码,这个是你理解别人为什么这么设计,你才能够设计出来你自己的东西,先去理解大师们怎么做的。
然后呢再来想办法,我自己消化,我会怎么做,这个大家能理解吧,这是第二步,那么第三步是什么,第三步就是应用级别的这种设计,就是框架级别以及呢案例,别人给你一个实际当中的案例。
当然这个东西呢就是你有可能会很强,因为你的你的你的技术经验比较高了,也有可能会稍微弱一些,你刚刚入坑,刚刚开始接触设计,讲一个高端一点的案例,你会知道这个设计东西是什么样子,他是怎么样给钱的。
这个我也是印象非常深刻的,这个时候我知道他的你会看到我的头像,在这微信里,我我我我一对一对它进行了指导,这个就是它的设计,自己看,这是腾讯面试的时候面了他的设计题,他觉得自己答的还不算太好。
但是最后腾讯也进了,你如果愿意可以自己尝试一下,这里面也有他大体的答案,你可以参考一下啊,当然这个就是薪水比较高的了,90万年薪,所以通过这儿呢你其实也会慢慢的发现呃,不同的薪水级别。
他面试面试的不同不同不同样的东西,作为大国外大厂来讲,没有经验考算法,有经验考两项,该到了吧,好我们继续回到国内,作为国内的同学,如果你想进大厂,第二个权重叫我把它称之为叫八股,这个八股指的什么意思啊。
一些基础知识基础不牢,地动山摇大厂很多时候就考基础,你不信你去看看那些校招,华为的,校招腾讯的,你去看他们问的都是什么样的东西,这里面的东西就比较多了,操作系统,网络数据库,记住我算法必须的不说了。
如果是java的话,什么jvm呃,什么调优,mysql调优啊,这个jm调优,然后等等这些,还有这个词条u等等,还有什么release这并发多线程单机的,是不是分布式的这些,然后呢嗯release什么。
什么卡夫卡,做keeper设计模式,spring源码等等,这些我就不我就不举例了,大概重点的话呢,基本上是我我列的前面这些这个东西呢,其实就是我所讲的那些叶子,叶子层面的知识,这些知识没什么可说的。
就是越多越好,越多概率就越高,少一点儿,说我能不能成,我以前遇到过就掌握三项就就就也就进去了,就掌握三项jy m并发,然后再加上mysql调优,ok也季节进去了,所以这里头是掌握越多越好。
按权重ip来就行了,这是概率问题,再强调一遍,概率一定要理解这一点,第三个,这个才是应用级别,这个呢对于找那种普通工作的,就前面有讲过这些等内容,普通工作的是第一优先级,知道吧。
去了解什么spring啦,s m了,spring cloud啦,spring boot啦等等这些,但是对于你想进高端岗的这些应届生来讲,这些只能排在第三优先级,所以他的学习顺序和权重完全是不一样的。
你的目标不一样,你记住你的目标不一样,你的学习顺序和权重一定就不一样,第四个呢它是一些加分项啊,比如大数据,与原生让内地址就行啊,等等吧,ai了等等,这些个呢可有可无,有的话更好,没有的话无所谓。
英雄级别,包括项目经验啊,这个比较重要演,所以你看看你想进大厂,但我说的这个点来我讲清楚没有,想在好,我不知道我说清了没有啊,看看各位同学对这块还有没有什么有疑问的地,方,这一问题啊。
你有什么特殊的稍微ai硕士出来,有机会晋升当科技吗,有啊为什么为什么没有投啊,投降你投出去,年龄大现在年龄大,现在根本不理月神,你是后面才进来的吧,你是不是后面才进来的。
我觉得你应该是因为你你如果前面听我讲课了,你不应该问说出这种话来的,所谓的大龄兄弟们,我现在讲这个大零,今天有多少大龄同学让我扣个一项目,多少个表格,是看你多少度,就你简历写几研究工作经验啊。
先看大连的案例啊,看你的大连的案例,找一个比较特殊的吧,大零的42,大零,17~18 41岁。

系列 6:P52:【2023】大龄程序员应该怎么在当下的环境下生存于发展? - 马士兵学堂 - BV1RY4y1Q7DL
或者说所有的中年危机的核心点,其实就在于你没有匹配这个年龄,应该匹配的素质,年龄匹配能力的,我们拿i t的技术人员来讲,有n多人我是见过的,他在32 三岁,34 五岁的时候,他干的活还是c r u d。
他和那些个23岁,23岁的人的区别就在于都能干,他更熟练一点,无他为手,熟尔干了10年的cd还是cr v,你豆芽子长一梵高,他还是个菜,他脱离不了豆芽的本质,所以你必须具备。
这个要和年龄有对应匹配的能力,下面我告诉大家年龄匹配的能力长什么样,听我说年龄匹配能力长什么样,一般来说就是由精到宽,我们我们我们先聊技术啊,技术呃,一般来说就是由经。
到宽如果你在30岁的时候还意识不到这一点,孩子呢追求各种各样的技术,细节线到里头拔不出来,我跟你讲,你再牛逼牛逼牛逼不到哪儿去了,我们讲我们学的技术叫工程技术,没有那种说只有你会,别人不能会的。
也就是说你不具备那种不可替代性,你就是把那个linux底层的源码,你全给他背过,你也不是说不可替代的,甚至说你好多时候都是用不上的,就说这是你的能力,但是你能力未必能够发挥的了,你还是用不上。
你也是浪费,这时候要由经到宽,就什么叫由经到宽呢,刚当你最开始的时候,你入行,你可能做的呢其实就是1米宽,但是你做的特别深,你要能落地吗,1百米深你就专门做这个齿轮了,我就找一个车厂专门去做这个齿轮。
我就能进去,但是你这一辈子如果只做了一个齿轮,你在这个车厢里头,也就只能像一个螺丝钉那样钉在那,如果你想追求更好的发展,更高的职位,更好的收入怎么办,让你的技能站慢慢变宽,不能变得宽的,可能没那么深了。
慢慢可能会变成1百米宽,23米深,深的可能78米深,ok大多数23米深其实就可以了,你认为一个架构师他会懂各种各样的语言吗,所有的语言全知道,所有的框架全精通,并不是他只是了解大体的大概的。
然后有一些特殊精通的地方,原来做过的,但是呢它能够综合运用,把它消化掉,另外呢能够和业务结合,也就是他的沟通能力上来了,我不知道大家发现了没有沟通业务,然后技术呢由精到宽。
也许在你最开始找一份工作的时候,我只会一个前端js我就能找到工作,但是当你慢慢的要想出人头地,要想成为那个护士长,要想成为那个车车间主任,你说该怎么办,你懂得要比那个简单的车工,铣工罢工要多一些好。
你该你该你该怎么去做,你可能要你就算没有做过大数据,你大概要了解你没有做过ai,你至少要大概了解他他是个什么东西,大概用什么干,干一些什么样的事情,跟别人聊天的时候能聊得出来,然后呢,你没有做过前端。
你可能不是主做前端的,但是你至少要知道前端断定跟哪些框架,一般来说做什么样的东西,当用多少时间等等,没有做过ui,没有做过设计,没有做过产品,但是没关系啊,你是不是打过交道啊,多了解一些,多了解一些。
只有这样,然后你才能带领手下方方面面的小组合到一起,完成一个完整的产品,能理解吧,说我只懂这一块,反正我只感兴趣这一块,我只留在我自己的舒适区,我我我不出来,我反正现在感觉自己素质很好。
只当你一抬头看路的时候,突然间发现哦,原来其实我差很多了,多了解一些宽度,多一些,你才能够慢慢的走向技术加管理的岗位,我这么跟大家说,所有的稿如果只存留在纯技术,纯工程技术,其实到头呢薪资也高不到哪去。
最后一定是要技术加管理的,大家千万千万不要对管理这个词,抱嗤之以鼻的态度,或者是报那种无所谓的,或者说对自己一个定义,我就是和人打不了交道,我就天天我就喜欢天天和机器打交道,那你没办法。
那你就只能把自己作茧自缚,缚在那,好多人说技术的岗位,慢慢的啊,我要成为初级程序员,中级程序员,高级程序员,架构师,中级架构师,高级架构师,产品架构师,业务架构师和我的解决方案,s solution。
architect,解决方案架构师等等,产品经理呃,项目项目经理,技术经理啊,c t o等等,但是你想过没有,其实到项目经理到产品经理,到呃我们的这种c t o这种级别,它实际上已经结合管理了。
发现没有,所以就是技术加管理这条路,你要你要走啊,有好多人不爱跟人打交道的,你要走出那个舒适区呃,以前有同学说,老师啊,我那个原来搞技术的,现在有一个机会让我带一个团队二三十位,但是我有点费劲。
我不知道该怎么搞,没有人天生会美国,没关系去干,都是在打仗之中慢慢学会的去干就是了,他带给我的挑战,有可能拿到更好的薪资,甚至有或者是有可能我拿不到原来的薪资了,都听我说,所有的收益都带有一定的风险。
管技术是一个特别确定的事情,他非常确定我给他一,他一定输出一,给他二,他一定输出二,这就是好好多技术人呢,他到最后呢他他他就喜欢搞这个了,因为他听我的,你知道我能把控,但是你管理会是和人打交道。
人可不一定听你的,ok表面听你的,背地里未必听,就算听你的,你做的决策是不是对,是不是合理,能不能配合好,也不一定,所以呢它带来的是一种不确定性,请大家给我记住一句话,确定性给你带来的有可能是不可替代。
在这个位置上,你们公司就这么就这么一个人,就会就你会的技术比较精啊,你就研究特别多啊,你就一定程度上的不可替代,但是同时也带来的是不可提升,说这个人不能替代,我能不能够提升他,兄弟们。
你们好好想想这件事,这个人坐在这个位置不可替代,我会不会提升他,10000%不会,所以一定程度上你保稳稳了就没有收益了,就没有风险了,你你怕风险就也也就没有收益了,所以走出舒适区去迎接,去拥抱那个风险。
就为什么我们在课程到最后的时候,给大家讲一些管理性的东西,就在于这,我希望大家会展开自己的视野,走出自己的舒适区,舒适区去拥抱那个不确定性,这时候带来的才是更大的收益,管理到一定程度。
我离那个公司的赚钱业务逻辑,最近c t o我离得很近,我赚的钱一定比那个离得远的人赚的多,当一颗螺丝的人,我肯定比他赚的多,如果说我自己对这个业务都了解了,你了解怎么技术怎么实现的,也了解生产了。
也了解,运营运营了也了解市场了好,但这个时候呢我觉得这个平台已经控制不住了,那下一步你就去创业,你的人生就打开一个更新的空间了,是不是啊,同学们嗯,所以呢你的年龄要匹配你的能力呃,各位年龄大的同学呢。
也不要太过于就是过去的事情让它过去啊。

也现在呢也不要太太太太自豪啊,太说我我纠结啊,说我过去我没有努力过,我现在努力还来不来得及,我跟你说任何时候的努力都来得及,褚时健是80多岁创建的出城,ok呃,任正非44岁才创建华为好吧。
你们比他年轻多了吧,好多啊,这种案例非常非常多。

去干去干就是了,所以不要老跟我聊,说我35岁了就怎么怎么样,35岁还年轻的很,我我给你看几个我们年龄年龄的案例。

这是42,42岁的41岁,ok他通过一段系统的提升之后呢,他为他原来还是c r u d啊,就是就是就是那个啥好多视野都没打开,通过我们的提升之后,你自己看值不值好不好,17万,现在28万。

老师给给的任何的案例都是实实在在,真真正正这里头没有任何一个是给你屁股。

或者给你给你干嘛的啊,38岁50万变60万。

百尺竿头更进一步啊,你得去拼拼才有机会。


这是咱们的一个女程序,印象很深刻啊。

我们周老师为她服务,可以这么说,就特别费老师啊,特别特别费老师,就有好多时候啊,这点学费其实就是老师的单独辅导,就已经很直了,特别特别费老师,就是但是他到最后的时候,你要知道一点,他原来是搞不定工作的。
38岁的大龄的女成员,最后原来是搞不定的,到后面开始挑工作,拿了40万offer之后,后来我们了解到的是还不太满意,又跳了又涨了,就这么牛逼,干就是了,这就是他的肺腑之言,有的时候呢我们见到这的学生。
我们也很开心,虽然说费了很多心血。

虽然说费了很多心血,但是还是很开心的啊。

嗯还有你像女成员里头有那个32岁。

带带带娃的宝妈,两个娃2年没工作了,出来之后我让他拿了30万还是多少,忘了啊,2年没有参加工作,每天学习什么时间学,娃睡着了,他自己学,学到后半夜,想有点想有点成就出来拼好吧,怎么三,虽然说我才想明白。
其实我跟你讲,我想明白这件事情啊,年龄也很大了,所以大家也不要纠结,我年轻的时候也跟大家一样啊,傻帽愣头青都一样好不好,也希望大家伙能够早点认识到这个问题之后,你的路会比我所的通畅通顺啊。
但是我能做到一点,就是我不管年龄多大,出来做事出来拼,ok我也希望你们能做到能做到这一点,提升自己永远在路上好吧,学英语是不是对计算机特别有帮助啊,不是啊,英语其实要的要求的东西并不是。
就是要求的英语并不是很多啊,你是浮起来,很多人其实能浮起来就就很好了是吧,都是一个缘分,ok那个关于大理这件事,我们就聊到这里好不好看的呢,关于其他方面的层面的问题呃。
关于女生这件事还需要我单独聊一下吗,各位女同学,咱们考研是吧,行我先跟大家聊一聊考研的问题啊,行考研,然后女同学好吧,呃我先来聊考研这个问题,就是考研这件事情,对于计算机这个方向上,我是这么来理解。
第一个呢就是好多人考研是为了推迟就业,因为他就不了业,所以赶紧来考研,但是你考完研究生之后,发现还是就不了业,有的是啊,所以最重要的你要一定要提前针对就业,要做准备,针对就业这件事要做准备。
你要愿意过来,老师带你教你,该实际当中怎么用呢,该怎么做,你早点过来,越早越好,早一点能让你进大厂,晚一点,只能这样让你进中场啊,因为他需要时间吗,尤其是算法需要时间,好多人是推迟为了推迟就业。
那推迟完了之后呢,又开始醉生梦死,如果是这样的话,你读完研究生呢还是救不了研,第二个呢对于研究生这件事情,它的本质上是比较你的3年工作经验和赚的钱,能不能抵上3年读研,以及它它的后续长远发展。
大概本质上你是实时做这个比较,你在脑子里一定要有要有这个想法,听懂了吧,就是我如果现在不去考研,我争取参加工作,然后我工作3年,我赚了60万块钱,假如然后呢我读3年研究生,大概我花了10万吧。
假如嗯然后呢,但是我出来之后呢,我很可能嗯工作3年我能赚100万,明白吧,就是你你你你需要比较这个比较这个啊,就是我现在3年赚60万,或3年能不能再赚100,我们单纯从钱的角度考虑。
当然一般来讲我是这么想的,就是嗯不错学校的研究生,研究学校学校挺不错的,在业界也比较受认可,这个呢我真心建议你好好读研,这个出来之后呢,往往会超过你3年的工作经验,听懂了吧。
但是有一些不太好学校的研究生,其实读或者不读它的区别并不太大,所以这个呢具体问题具体分析啊,你说哪个学校的研究生值不值得读,你先能考上再说啊,另外呢考研和你学习技能并不冲突,考研也要玩算法计组。
操作系统,网络面大厂,这个是第一梯队的,权重是第一的啊,在这我也教大家一个大厂模型,大厂模型教大家一下所有的大厂,第一权重是算法,第二权重是基础知识,我们叫他面试,八股文大概有12门课,四门考研的。
然后再加上一些个特定的一些语言语言,特定的jvm多线程,并发了redis了卡夫卡租机,p本设计模式等等,准备源码,他们好,第三个才是应用级别,spring spring cloud,分布式微服务做项目。
第四个呢是流行的大数据了,ai了云原生了这些,这个是这四个权重,听明白了吧,这是进大厂的权重,那如果说你只是想拿一份工作,把第三权重提到最,提到第一去,算法扔一边,其他顺序不变好,这块大概能听懂的。
老师扣个一就是不同的目标要走不同的路,就是为什么我们这里呢是老师要针对你的特性,给你指一条路出来,是因为每个人他确实有不同的路呃,马老师设计整体的课程叫做全,因为我一定要特别全。
我才能够在里面给你进行各种各样的路线组合,有的人需要a快速的需要a,有的人需要b,有的人马上需要的是c,他将来才需要a,我们只能慢慢来,就是你看我的客人,为什么他课室量这么大,三四千个小时,为什么。
原因就在这儿啊,就是想让大家伙呢针对不同的人,不同的学习方式,效率会更高,这个呢大概就是考研的一个一个大概的建议啊,呃关于考研这块,看看大家伙有没有什么问题,只是我个人见解啊。
你们根据自己的实际情况来采纳好吧,好我们下面来聊关于女同学这个话题,其实我也不知道为什么,每一次都要把女同学给单独列出来聊,我们很多女生很优秀的,你像腾讯,你们可能不知道,至少有一半就是至少1/3吧。
就是往往一个项目组里面七八个人,才有一个女生,但是呢在腾讯里面,你像这种优秀的公司,好多都是女生,好多领导都是女的,知道吧,水有很多都非常的有水平,所以首先第一点,各位女同学一定不能妄自菲薄。
有很多女同学和男同学的区别就在于这里,她怕丢人,怕得更厉害,他不敢拼,不敢拼的更厉害,大概有一个机会,男生可能有58%,我就冲上去了,概率嘛还是那个概率,但是女生很多时候得需要百分之百的把握。
才敢往上冲,才敢表现自己,我觉得这个是女生优先,第一要解决的最大问题,我原来手把手带过一个女同学,我手把手的教他怎么样去做徒弟,怎么样去做面试,但是他就过不了心里这关,我也没脾气。
所以我希望你们女同学应该突破这一点,人生啊你就记住了你个人的人生,没有那么多观众,没有多少人去关注别人的人生到底长什么样,没那么多观众,你放松一点,该拼使劲去拼,拼不了,下次再接着拼。
呃就是原来在电子厂做女工呃,机缘巧合到了美国练了半年算法,面进谷歌,牛不牛逼,突突破,很牛叉啊,所以本质上来讲啊,就是我们搞技术的女同学和我们搞技术男同学,本质上没有区别,你在技术上跟他拼就是了。
其实好多时候,好多女生的细致程度还要超过男生的,ok好多女生的架构师,好多女生的高级成员,有的是ok你既然进了这个行业,该拼继续拼,该学的技术和男生没有区别,该掌握的能力和男生也没有区别。
你该掌握的视野了和其他人也没有区别,唯一区别的就是性别有点区别,你说其他的还有啥没有没没有什么区别,有同学说了,那都是大多数女生的想法,是我那个我回去,要不我照顾家庭吧,然后那个照顾娃吧,这个没有办法。
这是性别的差异,但是当你照顾玩娃,然后家庭这件事情是双方共同有责任的,不是说只有你一个人留,对不对。

叫个娃娃,你的事业该起也要起,我奉劝大家一句话呃,目前封封建社会的女生没有事业,所以只能做男人的附庸,但是现在不是封建社会,你自己的努力能够养活你自己,哪怕你赚的钱比你老公要要少得多。

比你男朋友要少得多,但是你是一个独立完整的人格,不然你只能依附于别人,所以不要去做,想着说去去去做那个那个那个家庭主妇啊,不要去那个说有机会我不拼,反正难受的事在前面顶着,该是你的,该怎么拼怎么拼。
其实就是了啊,就是还是那个那个那个例子,你你我就这个这个印象太深刻了啊,他是做了2年家庭主妇,后来实在受不了了是吧,但是出来之后发现什么什么都不会,原来会的是现在人人人人人人家都不要了,对不对。
那怎么办好,我们带他40万,ok比她老公赚的还多,家庭地位杠杠的,现在面试全是外包,脑袋疼,外包这件事情,你过度过渡期嘛也没有什么关系了,四struts jsp的公司能进吗,如果没有其他选择。
什么公司都可以进,至少这个公司每个月给你提供12000的薪资,15000的薪资,你每个月有钱赚先进去,并且呢在你有钱赚的情况下,用业余时间再去提升和努力,说这家公司不太好,没关系啊,我业余时间。
因为咱们的课都是业余时间学的吗,晚上的时间ok碎片化的时间线,掌握了框架之后,你就可以用碎片化的时间去掌握了,业余时间再有提升了,然后再去找更好的公司不就行了吗,对不对,所以说其他的方面,比如说女生啊。
可以说大数据做起来,要比那个程序要稍微轻松一些啊,呃但是如果你想后期的要想拿更好的薪资,那也要成为架构师,也要懂后端,对不对,也要懂前端,要懂懂管理,懂懂业务等等啊,其实大概差不多呃,做去做产品经理。
ok这个会相对来说轻松一些,但是也并不是就任何的各行各业,不是说你看上去的想象之中的那么容易,产品经理的薪资好多都比那个成员差远了,对不对,然后呢,产品经理,如果你没有过一些开发或者测试相关的经验。
你想做好产品经理也不容易,还有呢最终呢我们的综合素质,那我们去了解业务,了解市场,了解这些,你不了解的话,你的产品经理也做不好。

就是所有的所有的所有,到最后我们都是一个综合素质的竞争,具体问题具体分析好吧,学生会有前途,比如oracle oracle,我认为没什么前途了,oracle现在在国内都被替代了。
现在好多oracle都已经被国产的数据库给替代了,比如我们在里面讲的o o b,我们课程里讲的ob oa是mx 4 coa,这些个都是用了国产替代的,为什么国产替代啊,国家安全问题,这东西是趋势啊。
这这没什么可以改变的,明白吧,pg pg和mysql基本上是一个量级啊,pg mysql基本一个量级,就是说你们说的这种专门的数据库呢,其实有一个工作岗位叫d b a d b a这种的呢。
他就是小动脑啊,目前要求目前人并不多,竞争的也没那么激烈,但他薪资也没那么高,反正你就是愿意的话,可以朝这方向走,但是你一辈子只能干这个,记住了,他某种程度上就是专门的大数据。
专门的某一种某一种数据库的运维岗,就是你可以入行的时候,1米宽1百米深,还是那句话,你用oracle,用pg,用mysql来入行,这个没有关系,但是长远发展一定是要慢慢走向更宽广的方向,好了。
双非一本想进微软有机会吗,双非一本,双非一本,这个要看你们历史上有没有微软去你们那面试,这我感觉够呛啊,我感觉够呛,实际上国产和数据库的性能都有点问题,没有关系啊。
你要知道oracle最开始的时候他也有问题,慢慢演进呀,你不演进的话,怎么可能会没有问题,淘宝刚上线的时候,2000个人就能把他干崩了,你现在呢别说2000个人,两个亿都干不崩,但是史蒂文不断演进的。
用发展的眼光去看问题好不好,国产数据库再有性的问题,那也是自己国家的,是不是我就是一直不强,那也是保护我的啊,你就是那边再牛逼,你就是b two特别牛逼,那是打我的,对不对。
所以不要在这个城维维度上考虑问题啊,双非一本说的社招,双非一本社招的话呃,据我所知啊,就是筋道微软的多数的学历都还是不错的,我觉得你就别考虑这个问题去试,你投简历,投过去,你做好了准备之后就投,对不对。
你只要我靠,我还有算法基础知识,然后架构啊,实际当中的设计能力对吧,你准备好了之后就投就是了,微软能接受就接受,接受不了的话,看淡啊,不就不就完事了吗,二不是因为什么现在被替代,我不跟你说了吗。
国产替代吗,国产替代oracle,美国的没准有后门的,能理解吧,去rush好吗,明显不太好,rush现在并没有太流行,去微软需要啥条件嗯,你打开微软的招聘,然后仔细去读,这就是他的条件。
每个岗位每个岗位不一样,一般来说学历稍微好一些,算法务必要给我,啊这是必考的,我们小姐提醒喂,哈喽哈喽,又断掉了,太他妈讨厌了。


系列 6:P53:【2023】Java应届生要找到工作需要掌握哪些技术? - 马士兵学堂 - BV1RY4y1Q7DL
怎么样进行进阶,不管你是自学,你愿意愿意愿意掏钱,快速的学,或者愿意慢慢的自学都可以,这无所谓,我都我都告诉你很好的路线,你该怎么走怎么走好吧,那个从教育找工作来讲呢,其实是分人,人群是分层次的啊。
我跟你讲,就是现在我觉得最难的应该是应届生,我不知道今天听听课的有多少是手头没工作的,就想找第一份工作的,有没有,有的话给老师扣个一,我看一下,看一下有多少,就说我手头现在一份工作都没有。
我就是找不着我,我就选那个就是就是应届生,我就想找一份工作,好好ok ok好,还没开始找,ok呃,这关于这个应届生呢,大家听我说,就是应届生找工作这件事儿,就入行这件事呢,嗯我先说入行的手段。
这个以前也重复过,入行手段呢大概有三个,一个是那个嗯,先给你先跟大伙儿聊这个入行的那个路线吧,好不好,入行路线先先聊路线啊,就说入行的路线来讲呢,其实比较简单,不太难。
入旁路线呢你首先第一点呢你要先选定方向啊,认真听,一定要先选定方向,就是我想问哪个方向去,比方说入行弄的有好多啊,比方说有java后端呃,go on后端go on或者是java的这种游戏后端。
然后呢呃前端,然后呢安全嗯,然后比方说像ui设计产品,产品啊等等等等方方面面,咱们只聊i t啊,咱们不聊说去什么做做餐饮之类的啊,还有像什么测试对嗯,c加加的c加加目前大厂招的比较多呃,或者是什么呢。
结合那个i o t,就是结合那个呃去硬硬件驱动的,这样的开发比较多啊,c加加的,然后嗯iot的这个ai ot的,其实你看一眼还有好多啊,我就不一列了,其实你看一眼光i t来说呢。
它就有好多好多的细分细分领域,你的你的第一件事情呢是一定要认准一个方向,兄弟们,因为有很多人在平时学习的时候,他他学来学去,实际上学的是那个不同方向的内容,不同方向内容没有用的。
所以对于咱们刚刚入行的兄弟们来说呢,就是说你的第一步啊,画个图啊,你的第一步,最开始的最开始的同学是要求是1米宽,1万米深,他是这样的一个一个一个知识体系结构,明白吧,呃当往后的时候,越往后的时候。
他对宽度的要求就越宽,到架构师的话呢,它很可能是这个这个1万米宽,但是每一个只有1米深,明白吧,整个面积是一样的,这块咋能理解,能理解,给老师扣个一了,能理解这件事情这件事情吗,就是最开始的时候。
你其实对对你的要求是1米宽,1万米深就越深越好啊,宽度可能不需要太宽,那么这里面呢首先你第一步呢要选定整个方向,这块呢,我3月我大概在3月12号的公开课里面,我3月12号公开课呢,我大概讲了四个小时。

基本上把每一个方向都给大家分析了一遍,所以呢如果对方向选择有疑问的。

去找一下那个录播,好好听一下,我就值得值得听,值得付出,你要干一件事情,一定要做一个提前的了解,没有调查就没有发言权,是不是啊,同学们,所以呢先做出自己应有的调查,你听我这个呢也是调查之一。
我今天呢也不太可能想说,我们每一个都给大家介绍到啊。

我用现在最宽泛的,现在目前整个市面上最宽的,假如后端来举例子。

java后端go on后端咱们课程里头的大纲都有,你可以去参考大纲,也可以也能知道整个的学习路线,招后端是最明确最简单的一条路线,它的就业面是最宽的,两个就业面是最宽的,一个是java后端。
应该是前端啊,这两个是就业面是最宽的,到目前为止听懂了吧,所以呢你你们可以去了解了解这两个方向呢,他的学习的这种嗯路线是什么样子,我用我最熟的java后端来给大家举个例子,后端的话呢,其实到目前为止。
他的那种学习的路线是非常非常明确的,而且就一条线走,你从从头开始走到底就行了,那么这条线是什么呢,就是javs e,大概就是这样的一条线啊,jvs e,然后呢数据库那就是mysql了是吧,gdb c。
然后注意这个这里是web前端,那么前端的话呢,差不多就是a t m l c s s g s啊,大概这这这三个语言大致了解就可以啊,然后呢是后端,后端主要了解的是select,然后spring框架。
还有呢就是嗯spring boot,注意到这里的时候,其实在很多中小城市可能到这里啊,在一个项目这个必须要加项目了。

兄弟们嗯,到这里的时候,其实在很多中小城市。

就有可能找一份几千块钱的工作了,有可能啊,说的是把握性并不大,如果你想比较有把握的拿下,各位同学,这个是必须要的,spring cloud还行哦。

到这儿其实最最小最小值就有了,这是最小值,大家听懂了吗,嗯我说的是最小值啊。

当然有同学说老师我消息中间件要不要了解redis,要不要了解缓存要不要了解,当然是越多越好,越多越好,我说的是最小值,所以各位应届生同学来说呢,你到这里的时候,你就开始有希望了,讲到这儿大家能接受吗。
能听懂的老师扣个一来。

大家呢你也可以从这个java后端工程师,这个系列里面,当然我们给的值呢不是最小值,给的值是一个挺大的一个值,因为有同学呢想要速成。

我就教你是最小值是什么,从咱们s来说呢,我们s一开始就有项目。

然后呢各种的s一的进阶前端技术呢有好多,然后嗯my max spring mvc,spring boot的项目和家园的项目远程调用呃,我们给的是值是比较大的,是一个是一个大的值。
但是实际上你们用的可以考虑,如果你们对就业薪水要求没那么高的话,可以考虑最小值,但是大家不要小看spring cloud,虽然我只是加了一个spring cloud。
spring cloud这块呢是挺重要的一块,这块呢因为它有好多组件构成,最起码有这个注册中心呃,nicos,然后配置中心nichos,然后santino和那个open fan gway和那个sa等等。

听我说就知识点来讲啊。

其实学起来并不太难,那个所以最小值的话大概就这么多就够了。

其实想是不是比想象中要要要简单一些啊,这大家能听懂吗,大厂的最小值比较难,一会我给大家讲一下大厂的最小值好不好。

大厂最小值有的地方呢比这个还要少一些啊,呃这是找工作的最小值好吧,呃但是各位听我说啊,如果你们找工作的,我了解我接我接触到的应届生找工作的时候,他的最困难的点呢,不是说他没有掌握这些。
他有好多人呢是不管是自学也好,不管通过培训也好,他是掌握了,但是呢他那个掌握的比较稀松,比较稀松了之后呢,他写简历就不敢写,他写简历不敢写,他那个简历写出来就非常非常的烂,他写出来非常烂的。
他投出去就没没反馈,所以这里面呢我就业这块最核心的点呢,其实还真的不是这些个技术点,这些核心技术点在老师看来啊,带你的情况下,其实很短时间就能让你掌握住,就是掌握到就业的就业的层次。
但是最核心的点是什么呢,最核心的点是,找工作大家不会找,很多应届生根本不会,嗯这跟大家说啊,go on怎么样,go on大家可以,你可以去咱们的那个网站上啊。

我这个也就太多了,我也我也不可能给大家介绍太完全。

大家到网站上可以去找咱们的那个嗯。

目前的go on的课呢。

正在也在那个不断的更新之中,go on呢是目前主要做中间件的开发,做区块链,然后做游戏后端,大概集中在这三个方三个层面上好吧。

但是从他的招聘量来讲呢,比java后端还要差不少啊,呃找工作很多应届生根本不会相信我,教大家找找找工作的技巧,各位同学认真听,尤其是应届生,同学们,你们呢按照我我讲的去试一试。
你就会发现找工作就没那么难了,这里面呢其实要求最大,电或者的最最重要的一点是放弃不尊心,我有印象,我记得我年轻的时候刚毕业那会儿,那会儿我的自尊心是最强的,我受不了任何的白眼儿。
受不了任何的那个那个挫折的,如果有有人白眼,我一定要打反击回去啊,大家听我说啊,就是说呃你你找工作的第一件事情呢,你要放弃自尊心,还有一个呢,就是要有一个对自己一个正确的希望期望值,呃我告诉我告诉大家。
大家前一阵子可能听说过北大的博士,去做那个城管的,我的同学里面他的他的他的孩子啊,也不是我的同学,就是我的师兄,他的孩子有在北理工读那个计算机系,研究生读下来之后呢,也找不到很好的工作的。
呃我的亲戚里面也有那个在北师大的数学系,然后毕了毕完业之后呢,也找不到很好的工作了,就是我整个了解下来之后呢,实际上是咱们的小孩们呢不太会找工作的,他不会,他也不理解呢。
找工作这件事到底是一件什么样的事情,呃找工作其实非常简单,人听进去啊,那个呃不是北理工的,那个是最后是找着了啊。

他那个工作不是很理想而已。
系列 6:P54:【2023】转行Java后端如何快速入行、通过面试并稳定工作? - 马士兵学堂 - BV1RY4y1Q7DL
我教大家用一个系统化的方法去看它,各位同学日常接触到的很多知识都是碎片片化,碎片化的知识会增加焦虑,系统化的知识会让你看到问题的解决方案呃,看这里,而且碎片化的知识对你做决策其实用处并不大,看这里。
我首先帮大家呢说找工作的问题,就是入行的问题啊,入不了行这个问题怎么解决,其实我们讲呃找工作这件事情就两步就能搞定,第一步就,写简历投第二步叫去面试过,只要你写简历投出去。
然后呢得到机会去面试过了就拿到工作了,就这么简单,就这么简单,千万不要想太多,但是呢这里面呢其实大多数人遇见入行的问题,有两大问题,第一个问题是你投出简历去,没人理你来,这是第一个问题,叫投简历没人理。
第二个问题是什么,有人理你,面试通不过,好这是第一个问题,这是第二个问题,我们再重新投一遍票,所有的人入不了行的人告诉我,你是第一个问题还是第二个问题,二二嗯1212,2g多一也不少。
我快速把一帮大家解决,这里面呢跟你的面试,跟你的什么都有关系啊,他前前后后都是一个一个体系的,同学们听我说呃,当你写简历投出去没人理的时候,你想想看这是什么原因,在这里呢,我给大家呢,呃,就是纠正一个。
你们日常中经常会遇到的一个错误的观念,就是不重视简历这件事,好多人写简历是什么样子的,网上找一份模板,然后呢自己会什么往上一写一填改吧改吧,往外一扔ok了,这就是一份简历,这个说起来挺好玩的啊。
我给大家讲一个最近的事,就是刚刚的,就是我太太那边在招聘一个他们的工作岗位,这个工作岗位呢基本上要招985的博士生,然后就比较好玩的是什么什么呢,有一个条件非常好的学生,然后就投了简历,投完简历之后呢。
里边那个写的东西呢叫驴唇不对马嘴,就是招的工种是a,他实际当中写了一大堆关于b的技能,然后为什么呢,实际上后来分析一下才发现他在网站上选,我到底要选投哪个岗位的时候,他选错了。
就是那个下拉条里面他选选错了一个,非常非常的不认真,各位同学,你们平时我不知道你们干什么事还认真啊,就是说这件事这件事是关系到你一辈子的事情,可以说这件事是关系到你一辈子的事情。
你如果一点都不认真投简历,还能投错,里边还有什么错别字,格式不好看,我跟你讲这些都是重大问题,所以第一件事你要重视你要写的格式,要写好了,错别字不要有一个错别字,让你的印象直接从100分就掉到20了。
你在里面还有错别字,还有那种,尤其是特别好玩的,是你投技术工种啊,还能把那个这就把那个,把那个技术名词给拼错了,ok这个就太搞笑了啊,javascript写少写个s是吧,嗯少写个j,少写个a啊。
然后大小写不统一等等,所以这件事情我一说大家应该都能做到,我今天讲完,请各位回去润色自己简历,先把最简单的那问题给我解决掉,格式问题,好看问题好不好,这个这个不难,但重点的呢是不是说你好看了。
简历你投出去就会有人理你好,简历里面呢有各种各样的那种细节的技巧啊,比如说呃字斟句酌的什么样子该说什么样子,不该说什么样的东西该写,什么样的东西不该写呃,然后那个照片该不该贴贴多大的拍照的。
应该是大头照还是半身照还是全身照等等,这些问题呢都是细枝末节,在这我希望纠正大家伙一个观念,就是简历,很多人把它当成一份作业去写,当成一份作文去写,完全错了,简历是一个广告,请大家记住简历是一份广告。
我再强调一遍,简历是一份广告,你投简历其实就是投你自己的广告出去,这个广告的产品是谁,宣传的产品是谁,就是你自己,所以你要做的一件事叫做一定在你的广告里面,突出你个人的呃吸引力,我这么说。
大家能不能理解,如果有很多的那种应届生写的写的简历啊,然后我又会ps,又会ai,又会photoshop p s服的时候吧,然后又会后端啊,有参加过什么团团委会活动,又又又又做过各方面的组织活动等等。
一大堆列上去,完全就没有看这份广告的客户是谁,广告最重要的一点是什么呀,让客户认可,我们都不认可,各位同学们,我们客户是谁,是不是那些个企业呀,兄弟们好在哪些企业里面,怎么认可我们。
就是你一定要投其所好,找到他的需求点,这点没问题吧,投其所好,什么意思,对方要什么,我往上面写什么,对方不要什么,不看重什么,我就把它去,各位同学,请你记住了,简历是一份广告。
我下面教大家一个特别牛逼的,基本上肯定能拿到面试机会的方法,就是我们第一步写简历,第二步呢怎么写才能投出去,才能拿到面试机会啊,略过这些投的技巧,投其实也有技巧,但是呢在这儿我教大家一个特别牛逼的。
只要是你正常写,就一定能够拿到面试机会的,这样的写法,认真听就是很简单,就这四个字,投其所好,我们可以这么来理解它,具体做法怎么做啊,具体做法这么做,每职位易简历。
我一会儿一会儿我给大家打开那个招聘网站,给大家举个例子啊,每职位的简历,这不是,哎呦我勒个去,美职位建立,这是什么意思啊,我们随便找一个职位吧,打比方说今天来的前端多,后端多啊,应该前后端都有啊。
我们随便找一个啊,我们就就拿java来举例子,搜一个java好,同同学们看啊,随便随便打开一个啊,因为我这里是长沙,我们调到北京,薪水看上去稍微高一点点是吧,15000~2万,高级工程师。
我们看看这个呃,当当你仔细阅读他的这种招聘描述的时候,实际上你能读出很多很多东西来,就是你能够是很明确的,能够看出来它的重点放在了什么地方啊,有这个的优先看到了吧,唉也要求你熟悉这个啊,熟悉这个。
ok下面是一些岗位的职责,当你仔细去阅读的时候,你至少能从这里面找出来,你有哪些东西匹配不上,你有哪些东西能够匹配,这一点应该都能理解吧,兄弟们好,那你如果同样的还是这个java工程师啊。
我们换一个和薪水和他差不多的120002万,我们打开来看这两份呢你做一个比较,我相信呢,很多同学应该能看出这其中的一个区别来啊,我们再找一个找这个150002万的,ok你会你你看看啊,这是我。
我们来截一下,这是岗位要求,ok关于技术上的一些东西,然后呃刚才这个我们看的是这个啊,我们和他对比一下好不好,好这是这是这份工作的,同样的都是15000~2万,同样都是java工程师。
你看看上面这些要求,跟下面这些要求有没有区别,有没有区别,嗯有这个是要求什么呀,设计模式在o多线程分布式,分布式系统设计,应用缓存负载,负载均衡恢复服务等等,这个要求是什么。
tom cat web logic struts,spring hibernd,w r t web等等,有没有区别,兄弟们能看出来吗,呃我我们讲就算是对面有两个小姐姐啊,对面要求呢就是那个是相个亲啊。
都找个男朋友,但是即便是对方这两个人的条件差不多,给的钱都差不多,但是他们对于男朋友的要求,也一定有细微的区别,兄弟们这个能不能认可,应该没问题,所以如果当你你你手头你打开你的简历。
你发现你熟悉的是weblogic ssh,那么你投我刚才的第一份成功的概率又高,但是你投刚才的第二份,你成功的概率就极低,我这么说能不能理解吗,兄弟们,这是第一个,对不对,但是呢你简历里头写的啊。
比方说高并发分布式微服务,你投第二个概率就高,投第一个建立这个概率就低,来这会我讲到这儿,各位能理解的,给老师扣个一,老技术嗯,oracle都是银行,没关系,我们现在是找工作。
当你没有其他工作机会的时候,我觉得这个也不是说不能选k,所以各位兄弟们,如果在这里你自己写了一份简历,在想象之中呢,你写了就是你你觉得企业要什么,你都往上写,什么p s了什么,写了一堆。
你扔两扔这两个工作岗位,你扔哪个都不行,所以你最想你,如果非常非常想拿到这个这个面试机会,你怎么办啊,针对第一个,针对第一个职位润色,你现在的简历,突出你的ssh with logic。
oracle p r c o,针对你的第二份简历,突出你的jvm多线程并发io缓存,我讲清楚了没有,这种是成功概率最高的,当然这种也是最麻烦的,我讲到这儿,一定有同学会说。
老师我那个s s s也不会哈哈,什么并发的分布式缓存什么的都不会,我咋办,没有关系,你先写上,各位兄弟们,你先写上,就是对方想要什么呢,你先写上,写上东西不会,写上东西不会怎么办。
这个如果让我给你一个最简单的解决方案,就是学嘛,最简单的就是学我们课程3000多个小时,涵盖了上面所提到的所有东西,学就是了,而且学怎么这个,我这个也先先先不说这个问题啊。
就是很多同学呢就是写简历的时候,他有一个特别特别非常严重的误区,就是我现在会什么,我就往上写什么,我不会的东西他不敢往上写呃,它是一个静态的看问题的这种概念,就是我今天不会,那明天能不能会。
后天能不能会大,后天下周能不能会,他没没想过这些事,他只是说我现在不会,所以我不我网上写,但我个人的建议你啊听我的,你写上去写上东西,怎么这个不会怎么办,学就是了,有同学说了,说老师啊。
这个缓存我从来没有接触过,我是给他写上去了,可是对方问我,我能答得出来吗,没关系,我下面来解决,其实对方问你答不出来,这件事就面试通不过的问题,我下面就来解决这个问题,就说你写上去了,但是你不太会好。
我教你不太会的东西去面试怎么过,这个够牛逼了吧,我前面讲完的,我前面讲完的能听明白的,给老师扣个一,就是你大胆要往上写,因为你不往上写,兄弟们记住了,你不往上写会后果是什么。
不往上写的后果是没有面试机会,就好像说你现在要找一个女朋友,你你这份简历写出去,人家那个女生那边要求身高一米七五,你身高一米七四,那完蛋了,人家直直接这些系统给你刷了,能理解吧。
你先把1米75这件事写上去,至于后面你是用这个呃增高鞋垫啊,还是有什么其他办法,这个随你,但是你先写上去,你先写上去才有见面的机会,见完面才有可能成我这么讲,能不能理解,所以这件事一定要想清楚。
还是这句话,你你你你你如果写出去投出去简历没人理你,没有面试机会,那你怎么可能会得到面会,会入行,怎么可能会得到得到工作机会,你好好琢磨琢磨这件事,所以不管你会或者不会写上去,另外我讲过不会的东西。
学就是了,学就会,你哪怕只学一个问题,好给你举个例子,我们用缓存这件事来举例子,我知道很多同学可能缓存没有用过,不知道该用什么好呃,举个最直接的例子,你今天投出去简历,然后明明天上午九点钟。
人家要求你去面试,听懂了吧,好,你今天上午九点投出去的简历,上面写了缓存,我会,然后接下来明天上午九点钟,人家邀请你面试,你有一天时间干什么,学学什么,学缓存,一天有同学说了,老师你跟我这扯淡呢。
一天时间学会能能能能能学成什么样,一般来讲,下面我们就来聊这个面试的问题,面试的问题的核心是什么东西啊,简历的核心是广告啊,本质上它是个广告,这点你一定要知道,那么面试的问题的核心是什么东西啊。
面试的问题的核心是概率,这里面呢很多同学的认知呢,就是面试是一场考试,我需要拿100分,如果你这么认识问题,那你办这件事就难了,面试的问题是一个概率,再说一遍,面试的问题是个概率问题呃。
举个最简单的例子,如果缓存,你想要你想百分百拿到这种关于缓存的这样的,面试的这个全全部都通过,那么假设你需要掌握100个知识点,100个知识点,但是呢由于你的时间比较短,你做了一份突击,就学了一天。
在老师的指导之下,告诉你这种的某某一方面的一两个知识,他考的可能性是最高的,然后你就开始晚一晚上猛背,背了五个,很差吧,对了五个,告诉我有没有概率能通面试,想一下,琢磨一下,有没有概率,5%的概率。
我们简单说就是5%的概率,但是5%的概率就意味着,如果你能得到20个面试机会,那么就其中有一家就成了,我们讲入行有一间长了就可以了就够了,你没必要说你一二十点五,20加加加成。
那么如果你想得到那样的那样的选择机会,等于二前面20个小姐姐让你让你随便挑,如果你想得到那个机会,那就得成体系化的锻炼,把各种知识点全掌握住,但是你没那么多时间怎么办,没关系,拼就是了。
拼本身就是个概率问题,正好就是那那那五个,对不对好,我讲到这里,呃再跟大家伙说一个颠覆大家认知的问题,就是当你写简历的时候,你写上了不会的东西,然后呢有的呢是写有有的,因为他害怕通不过啊。
因为有的人呢他脸皮比较薄,他害怕通不过,他一般只写上他自己会的东西,而且这东西比较好玩,我以前接触的同学们呢,越是学历比较好的,呃,实际上他本身水平也还是挺高的,他越不敢写,你懂吗。
呃我理解的是越是学历比较好,学习比较好的同学,他这种呢,就是越认为他接触到的不会的东西就越多,他就会越认为呃我应该谦虚一点,我在写简历上呢应该谦虚一点好各位同学,下面我就问你一个问题。
简历是谦虚一点点好还是不谦虚一点好,你你你你,你怎么认为简历是谦虚点,好像不谦虚点好,其实我给我给我,我给大家举一个最浅显的例子,你自己选啊,谦虚有谦虚的好处,不谦虚有不谦虚的好处呃。
有一位同学我们假设他的水平是100,但是他写简历写了80,有一个同学他的水平是60,但是他写的简历也写了80,好注意面试官没有见过你,没有见过你的情况下,我怎么认识你这个人到底牛不牛,会不会啊。
你写会我就认为你会,你写不会,我就认为你不会,对不对,所以在面试官的眼睛里,这两个100和60他是看不见的,他只看到了,他只看到了这80,只看到这80就认为是两个人是等价的,是一样的,能理解吧。
兄弟们在他就在他眼睛里是一样的,ok然后最后的结结果大概是什么样子呢,由于他写的就是第一,第一个同学,他写的比较保守,所以他成功面试成功的概率就会非常的高,高到什么程度呢,他灭了十家。
很可能成了八点支撑吧,那么第二个同学呢,由于他写的太夸张了,有好多他还没有完全掌握住,他就是靠这种使劲拼,然后拼概率,呃呃呃拼出来的大概练了十家,那就成了两件好,我就想问你这俩这俩哥们有啥区别。
没有注意,在面试官的眼睛里,你俩都都是80分,那就意味着原来这哥们儿能够拿4万块钱的,由于你只写了80分,所以不好意思,你只能拿3万,然后原来这哥们是拿应该正常拿2万的,但是他比较吹牛逼。
吹吹完了之后呢,正好用一定的概率呢去把这个牛逼给cover住了,他拿的到了3万,你告诉我,你想做第一个人还是想做第二个人,你自己选,这里面我们再说一个性别问题,各位女同学,今天今天有没有人。
今天有没有女同学,这里面涉及到其实其实我讲起来简单,涉及到很多这种关于关于呃,心理上的一些问题啊,各位女同学,今天女女同学在的扣个一啊,应该也有你,你要知道就是各位女同学们啊,那个,各位女同学们。
就是是,你们平时是非常不乐意展现自己的成果的,而且呢基本上干什么事情都要求有百分百把握,然后才去干的,以至于你们丧失了职场上的很多机会,这是女同学的一位通病,在这儿我告诫各位女同学不要这样干,麻烦呢。
你干了什么牛,在什么地方把它说出来,甚至吹出来,只要有50%左右的机会,赶紧去争取,内部要提拔一个去争,不要等着说我一定比旁边的人强,我才怎么样怎样的,听懂了吧,然后呢你要做第一个还是做第二个。
麻烦你们自己选好呃,在这儿呢我看看啊,我想想那个书名给大家顺带着推荐两本书吧,呃,就是第一本书呢叫叫,地方是叫这个名字啊,那为什么越无知的人,月支线,呵呵这本书没事,大家可以去读一读,嗯比较好玩嗯。
孙子兵法,你那那那个不要吹的太玄了,那个你你一定得到一个月里我才能推荐给你啊,孙子兵法,这些都是你到了一定阅历之后,可以考虑读的东西,呃,什么易经啊,什么这这些啊,但是一般人读起来没有。
能够对你现实当中的认知又有提升,那个为什么越无知的人越自信,你们可以去读读这本书,就就就挺好玩的,就是说了这里面就揭示了就是说为什么呢,有好多好多人他其实水平挺高的,但是他不他不敢。
他不敢把自己的3万的水平说成4万,他也不敢把自己2万的水平说成3万,以至于他最后实际上是亏了,看上去他成功的概率很高,10x8概率很高了吧,但实际上他亏了,就相当于呢这个如果说我们简单的说说a a a。
a a a b c d这个男女四四个水平是吧,呃你这个作为呃呃a的这个人呢,你总是去找这个c的,那确实你的成功概率会非常的高,但是如果你是c的人,你想找这个b的,你也可能有一定的概率能成功。
你要去拼这个概率,那么你就赚到了,对知道的自我就发现不是自己,自己不知道更多了,没错,它就跟这个小圆圈是一样的,井底之蛙,他能看到的天,井底之蛙能看到天就这么点,对不对,当它窜出这个井口之后呢。
他突然间发现外面的世界很很大,以至于外面这些未知的东西就更多了,所以它会变得比较谦虚,但是呢经理的话认为天就这么大个,所以他就会不谦虚啊,在这我就不说了,不多说了好不好,我就讲到这里。
这个下面我们来讲这个概率问题,就说我们怎么提升这个概率,提升概率最好的方法是什么样子的,我们还用这个缓存来举例子,最好的方法当然是进行系统化,系统化学习,提升概率最好的方法当然是系统化学习。
这个没什么可说的,你从头到尾扎扎实实的呢,把它把它学好了,这个肯定是嗯概率概率最高的,但是我很可惜的是,我们大多数人并不具备,第一很好的学习习惯和方法,第二足够的学习时间,我教大家怎么解决这两个问题。
第一个呢就是很好的学习惯和方法,呃,各位想进行系统化学习的,一个比较好的学习方式到底长什么样,我在这简单给大家推荐好不好,那个大家听我说学习学习这件事情呢,在我看来有两种啊,尤其是以以以以我们参加工作。
以我们做项目为目标的这种学习,它一般有两有两种方式来学,第一种是我们从小学到大的方式,就是从细节开始学到整体,细节到整体,这这种是什么意思呢,呃就是我们从小,字体变一下啊,就是我们从从小啊。
呃你回想我们从小学到初中到高中到大学,这种学习方式啊,我们一定是按着某一个方向上的细节,先学到头啊,然后我们上学学高数学,数学学的很深,然后呢呃就计算机器来讲呢,我们可以学硬件啊。
学到底电路学到这个电路怎么设计啊,弱电强电,然后呃这个这个呃数字电路,模拟电路全写到这里呃,但是我们在学习这些的时候,老师其实并不会告诉你,当然高校的老师很多没有参加工作,所以他有这方面的局限。
他不会告诉你说我学完这个之后,我能干什么,我能完成哪些东西,不会不会告诉你这些事儿,呃,以至于我们学起来会第一时间花的很长,第二呢很痛苦啊,我这种学习方式是我我也是从小学到大的,我就会让你比较痛苦。
那么第二种学习方式叫做从整体到细节来学,那么这种方式呢完全反过来,这种方式指的什么意思,我给大家举个形象点的例子呃,在大家伙学怎么,你比方说你现在要学习怎么造一辆车啊,机械系的我们学习怎么造一辆车。
当你学习怎么造一辆车的时候,你上来会去淹研究什么呢,会去研究这个车的一个齿轮的某一个细节吗,就是你的,你现在面临的目标是我做一个完整的项目,或者叫完做一辆完整的整车,你的第一步研究会从哪开始下手。
你会不会把车上的一个齿轮给拆下来,好好的去研究这个齿轮的应力,什么样硬度,怎么样弧度是什么样子的,怎么给它加工出来,你会你会不会这么研究,同学们一定不会再给大家举这个前面两个例子,你要看一座山。
它长什么样,你要去山里头去研究研究研究一些一些东西啊,不说庐山真面目,你要研究这座庐山的时候,一种方法是你钻到庐山里面一个山沟,沟里面一个树底下去,扒开这个树根,去好好看蚂蚁窝。
你觉得你能认识整个庐山吗,你肯定不能,当然有同学就抬杠说,老师我把那个庐山所有的细节弄完了之后,我再形成一个整体,没错,这种是可以的,也是我们比较熟,这个学习方式,也是我们比较认可的学习方式。
这么学我们不别扭,因为我们碎片化的东西,这种就是从碎片化到整体化吗,从碎片化的地方,我们碎片的东西我们时常就是这么学的吗,我们学的很开心,我们很认可,我们很熟悉,但是效果不好,时间很长。
形成一个整体的时候,可能都过去2年了,ok另外一种是你坐着飞机在整个山上掠过,看清楚山有哪些主要的脉络,把它画下来,然后如果需要的话,我再去钻研这个脉络上面有什么样的树,有什么样的动物去做去再去下去。
哪种方式更好,更省钱更省时间,你好好琢磨,省经理能理解吗,所以第二种呢叫做整体到细节,我永远推荐是先整体后细节,先框架脉络,然后再细节,具体一点,我们将回到我们的a it行业,我们具体一点。
不管你是前端项目,后端项目,你应该做的一件事情是从项以项目驱动学习,项目群众学习就是我们在我们的教学体系里面,我们有很牛叉的项目,大概有十个左右,我推荐大家伙的学习方式呢,是你在建立一一简单的基础之后。
能够理解项目的讲法之后,就可以去听项目课,因为一个项目学下来之后呢,突然突然间你你你可能会发现,一个项目所涉及到的各种各样的框架,你大致就能理解了哦,你理解这个项目是由前端团队,ui团队,设计团队。
然后呢产品团队,运运维团队,测试团队,开发团队全部来构成,开发里面有前端和后端来构成前端,ok它用到了主要用到了哪些东西,后端又用到了哪些个框架,是分布式还是分分布式,如果是分布式的话。
又用到了哪些个具体的1234567,当你建立起来这个整体感之后,实际上就对这辆车呢,你大概了解就大概成了这样了,这辆车是由车身的底盘,发动机三部分来构成,然后这个时候呢在驱动着你。
我下一步要去研究哪一个更小的单位,是我是驱动驱动组件,转向组件,还是说其他的这种什么电路,当我去了解啊,我要转向组件,我要去了解好,当我了解完转向之后,转向会涉及到了哪些个轴,哪些个万向节。
哪些个传动传动机制,我再这么一步一步深入研究下去,我是从整体到细节,这种学习方式速度最快,效率最高,当你熟悉了之后,你就会发现,如果用这种方式学习十天,可能顶这种方式学习一个月,移动端的,卧槽哈哈哈。
先有上帝视角,是的来各位也不知道我说清楚没有啊,呃来这块大概能听明白的,老师扣个一当,这种方法论的问题,我尽量给大家举例子,不举例子,光说那个理论说不清楚啊,ok呃然后听我说。
我再给大家举现实中的一个例子啊,你比如说啊我们拿刚才那个招聘网站来举例子,你看这里啊,看这里同学们呃有呼叫中心等项目,电子优先,假设你前面的呃都知道都差不多,先简历投出去呢,人家那个面试官看完了之后啊。
就说哦大概有100份简历差不多都能匹配,但是如果说你能够在你的简历上写上呼叫,呼叫中心,了解呼叫中心,甚至你只要加这一句话,了解呼叫中心,ok熟悉呼叫中心业务,兄弟们,你说你的面试机会会不会多很多。
会不会一定会吧,那好下面我就教大家呢一个投机取巧的方式啊,我们讲系统化学习是最好的,但是前提是你得有足够的时间,下面我就教大家呢,就是当你时间不足的时候,时间不足的时候,听懂了吧,说我现在时间很紧张。
我遇到很多同学是刚被开掉的,遇到很多同学是开到了之后已经在外面找工作,找了好几个月,就是回回不来的,遇见了很多同学是我毕完业考完研研,研究生没考上,我现在着急找工作,我再不找工作,我都没钱了。
家里条件也不好,我现在第一件事要干嘛,我一定是要解决,我先入了行,赚上钱再说别的,如果你是这样的,你认真听,那时间不足的问题该怎么解决啊,兄弟们,各位你们认为找一份工作,大多数人的认知是这样的。
我一定呢呃要有这份这这项工作的经验啊,这个人家招呼叫中心,我一定要了解呼叫中心,所以我才能去干呼叫中心啊,我如果没干过,以前干的是电商,那我觉得这机会我就拿不着了,我就干不了了,实际当中是这样的吗。
我们现在假设我们的目标就是要拿到这份工作,领了这份薪水,我们就干这件事,他的薪水2万,我就要领着2万的薪水,那么你会怎么办,你会玩了命的想办法去领着2万薪水,怎么想办法在你的简历上写,我会这个。
但是你不会呀,我教大家怎么在时间不足的情况下恶补好不好,一般我们把这个称之为叫冲刺好吧,我们冲刺的目标是什么,首先你这个这件事一定要搞清楚啊,呃以前有同学认为我们冲刺的目标呢,是赶紧的学会该怎么去做啊。
说我原来没做过分布式,我原来没做过微服务,我现在要赶紧学会,我现在要赶紧做好各种各样的调调调试啊,各种各样的bug,遇见了我能解决,no,完全错了,如果你是这么想事的话,就完全错了,我再重复一遍。
比方说人家招的是分布式微服务,人家招的是呼叫中心,呃我现在的目标啊,我觉得我的冲刺的目标是什么,我冲刺目标是赶紧,我得快速掌握呼叫中心怎么做,赶紧快速掌握呃分呃,分布式的东西该怎么样进行搭建。
怎么样进行开发,怎样进行调试,你如果这么想,你的时间永远不足,因为你们在学开发或者学别的,或者学习别的技术工种,其实都一样,我告诉你,你们大量的时间是花在调试上,90bug,同学们。
你们学一个知识点其实挺快的游戏,你去看看,有好多人看,看完一篇文章,一个知识点就掌握了,但是让他亲儿子开始动手做的时候,才是最费时间的时候,一个bug能卡你三天,当你时间不足的时候,从哪里把时间挤出来。
很简单,不挑十bug就行了,不听是bug,哈哈你这个时间就出来了,有同学还说这个这个我讲的都能理解吧,就是你们回想你们学习的时候啊,你们大量的时间是花在什么地方,是不是花在调环境。
调bug去想办法纠错了,你好好想想,你大概基本上,80%的时间都花在这个上面,如果你把这部不干,你的时间就一定很充裕,就不不能说很充裕,就是你的时间一定是比那个要好得多,你的你的时间的利用率。
所以你现在要搞清楚这个冲刺的目目的是什么,注意冲刺的目的是通过面试,这是我们冲冲刺的目的,你不要想着说我,我现在冲冲刺的目的是干嘛,我马上会做精通,你这个想想多了,冲刺的目的是通过面试,各位兄弟们。
因为为什么,因为你通过面试之后,是不是你就拿到了这个岗位,你是不是就开始赚钱了,你告诉我,你说linux我不会没关系,我听完一遍之后,我大概知道linux系统是干嘛的了,我就记住了一个命令fs。
其他什么都没记住,k可不可以呢,也可以,他面试的时候很有可能就考的这一个命令,其他命令没考,你说好玩不好玩,运气运气真好好听,我说我知道一定有同学说,那试用期有挑战,没错是的。
我一会帮你解决试用期挑战的问题,ok听我说行,我再强调一遍,我冲刺的目的是什么啊,一定要给我记住了,这里面我我我给大家纠正了好几个,你们日常上的这种观点,这个观点很重要,是能帮助你快速的能够进入行业的。
第一个简历是一份广广告,要给我好好写,怎么写,吸引力怎么写,最理想的是美职位简历不太理想的是美,不同分类岗位一点力,比方说有的人能干技术岗,有的人能干管理岗,那么你技术岗写一份管理岗,写一份听懂了吧。
那么最不好的那就是一份简历打天下,当然你一份简历写的比较通用,也能打天下也并不是不行,但是如果你一份简历不能够打天下的时候,就一定按照我说的每职位简历怎么来,听懂了吧,这个时候你的效果就会比较好好。
这是第一,这是第一个,你的认知的问题,就是简历是一份广告,那这份广告我是打得谦虚一点好,还是打的夸大夸张一点好,这个取决于你自己的认知,有的人喜欢我,我80就是写80,有的人喜欢80写100。
有的人喜欢80写60,但是我个人推荐大家呢是稍微往上提一点,这个对你来说你的收益率是最高的,具体问题具体分析啊,有的人说我那个呃,内部推荐已经肯定能拿到面试机会,那你稍微谦虚一点,别人问你问题的时候。
你还能拿得出,对不对,所以具体问题具体分析,但是普通情况下,我个人永远推荐是这种往上提一点点,因为这个时候你本来拿2万的油,真的有可能拿到3万,而且你会很开心的拿到3万,这方面的案例比比皆是。
我手底下的学生,超越他自己预期的情况比比皆是啊,你去干,当然这个时候就会牵扯到你写的东西呢,呃你你你面试的时候通不过,所以这时候我们要认识面试通通过是怎么回事,面试通过是一个概率问题。
概率问题你怎么提高概率,最理想的情况是系统化学习,这是我永远推荐的,如果在你时间不足的情况下,我推荐你冲刺,冲刺完了之后,然后再进行系统化学习,这一步是永远绕不过的,这步是永远绕不过的。
你必须你早晚得得走这步,全体是先走还是后走的问题,我推荐你冲刺,先拿了钱,拿了工作,拿了薪水,然后再去进行系统化学习,这个也也也可以去,这个我不用我说了吧,应该比较简单的道理,就是如果你在这个节点上。
你是2万,现在你要充3万,一种方式是我一定要学到3万人,然后学学,大概比方说六个月,我学到了3万的水平,然后在投简历拿到3万,注意在这六个月期间,你拿拿到的是2万每个月,另外一种方式是我冲刺,我突击。
我玩了命的冲,然后呢我用一定的概率去拼,我用一个月的时间我冲下来了,这3万那么就相当于你你后面的每个月,你每个月都拿3万,能理解吧,虽然说最后效果都是一样,我都拿到了3万,当然这种不牢固。
所以你翻回头来还要进行系统化的补充,能让你这个3万给他稳固下来,这两种方式,我这么说来听明白的同学,给老师扣一两万的本事,干不了3万的活,别着急啊,我一会教你好不好,看这里啊,我再说一遍。
如果你现在比较着急,要拿到钱,要拿到岗位,我已经入不敷出了,这个时候怎么办,你记住了,你的冲刺是通过面试,只要通过面试,你就得到工作岗位了,面试完了,你人家已经发offer了,对不对,你就可以去工作了。
有工作就一定会领到薪水,ok这时候你就有钱了,至少是好,那怎么样去冲刺呢,你就记住通过面试需要你现场调程序吗,需不需要你调bug,需不需要不需要,绝大多数不需要,所以你是不是在学习的时候。
就把这件事可以先省下来,学习的时候呢,你就先听老师讲了一个项目,还里边涉及到了方方面面的调试配置,我的天太细节了,我跟不上没关系,囫囵吞枣的先给我听一遍,听完了之后哦,我知道了,原来这里面会涉及到前端。
后端缓存,分布式并发,ok然后我再去玩命的去背里面的题就可以了,我们拿缓存来举例,子,缓存最常用的redis,redis最常问的问题,12345,我给他背过,背过背就可以,ok当你背过了之后。
别人问你缓存问题,是不是就有可能有一定的概率来通过呀,兄弟们,而且当你的面试越来越多的时候,你会发现一个很好玩的现象,这个现象呢是这样的,要面试的问题我换一敲吧,就干什么事呢,你总结好规律啊。
就就就好干,听我说啊,就是说呃你会发现好玩的现象,这个现象是面试的问题都差不多,我说的这个意思呢是说,同一种类的公司面试的问题基本都差不多,问的问题都差不多,比方说第一个公司你问到redis问题的时候。
他基本上问了12345,第二个公司问的,你会发现呢,他可能问的是1245,第三个公司可能是1234,也就是说问来问去,很多时候起,其实最常问的就这么多问题,那么你第一家答不好,翻回头来要不要好好总结。
那一定要对不对,就算是我哪个问题没有答好的,我们的学员他会把问题录音录下来,我们老师会帮他听你哪个问题到底没有打好,下次同样的问题不要再犯错了,那么当你的面试机会够多的时候。
哪怕你只是通过面试总结来学习,你通过面试,后面面试的概率就一定会变高,你第一份面试通过概率1%,那么你第二份很可能就到5%,第三份很可能就3% 8%,第四份很可能就10% 12%,录音会不会违法。
不知道,你查一下,你找个律师咨询一下,很可爱啊,我们的这个这个同学们,有的时候问的问题真的是很可爱,好你会发现面试问题都差不多,所以当你面子足够多,我们以前有学员30多次面试,最终才成了一个。
当然我以前的记录呢大概是十天,用了十天时间培养这个同学,他原来只会html css,任何编程语言不会十天,然后让他入行,采用的方式差不多也都这样,你要收起你的自尊心,你要把我讲的这一要深入地理解到位。
其实你会发现呢你开始拼这份工作的时候,你会发现,这个工作呢并不是想象中的那么难拼啊,不是说我一点工资都拼不下来,听懂了吧,我看这里,这是这是我们经常会遇到的问题,就是面试问题差不多,所以你通过积累。
通过总结,往越往后你的概率就会越高,ok所以你你再想想看,你今天呀你就上午面了一家,下午面了一件,那么你晚上的时间用来干嘛,用来总结,用来继续学习和冲刺,当你总结和继续学习和冲刺的时间,越来越多的时候。
牵扯的东西越来越多的时候,你的成功后面成功的概率就一定会越来越高,ok听懂听明白了吗,在这儿呢我在给大家调整另外一个问题,就是心态问题,这个问题呢比我想的要严重的多,我以前觉得这个问题不是大问题。
但后来才发现这个问题才是最根儿上的,很严重很严重的问题,这心态是什么意思呢,总体来说呢就是有的人呢不敢这么写,简历60写成80,有的人呢也不敢手上东西,也也也不敢往上写,也不敢往上写。
有有的人的时候我写上去了,我不太会,我就不太熟,我就背了一个题,我都不敢去面试,然后有的人呢说我面试了之后呢,我怕通不过别人把我给开了,好这个心态问题总体来说就一个事情,就是怕丢人,这是核心的自尊心强。
其实我觉得吧还有一种可能性就是没有,我受过社会的毒打了,当你真的在这个社会上混了一段时间,你连饭都吃不下去的时候,你的自尊心你会发现叫一文不值呃,举个以前很早以前那个小例子啊。
那会儿呢有一个学生他去面试,面试三星准备了很充分,然后呢三星的面试呢给了他很大压力,当时呢那会三星啊在中国发展还可以,他面试的时候是别人面试,就是一个面试官在这问你各种各样的问题。
三星的面试就是三个面试官,然后坐在前面让你在黑板上答题,然后他一下呢心态一慌,结果就是答了半天,什么都没答出来,原来会的问题也都忘了,满头大汗呃,后然后回来了之后,这个郁闷郁闷了好长时间啊。
躲躲在屋里不出来了,后来呢没办法,还得我去拉他啊,把他拉出来,然后好好的给他讲解释这个道理,其实呢他就是他就干嘛了,他就是丢了人了,丢了人了之后呢,结果呢嗯把自己给打怕了,再也不敢出来了。
我不知道有多少人是有这样的心理的,这样心理的人大概大概大概长这样,你你你反思一下,是你你是不是有这个问题呃,你喜欢一个女孩,但是从来不敢去表白,只能暗恋,那么你看中一个机会。
但是呢我总觉得我自己就是不行啊,我怕这个别人别人别人给我拒了啊,所以我连试都不敢试,就是说我怕结果不行,怕到我连尝试都不有,没有这样的兄弟们,有没有,有的话也老是扣个一,如果真有这样的嗯没有。
ok应该有啊,各位同学,麻烦你把你们的自尊心真心的告诫一下,给我收起来,包括各位女生把你们自尊心给我收起来,因为年轻人的自尊心是最不值钱的,年轻人自尊心只有自己,只有自己这么说,只有自己看着看着特别重。
但别人根本把你没有把你放在眼里,所以你也不要太把自己当回事啊,你的生活也没有那么多观众丢人好,我们分析一下他三星3星这件事,他丢人丢到哪了,他丢到了三星,丢了多长时间,半条顶多半天。
我不相信三星3个面试官还会记着说,今天有一哥们过来面试,他的名字叫卡尔萨斯,答题答的贼烂贼烂的,他的名字叫大贤是吧,能不能看到能不能看到弹幕肯定能看到啊,但是我没有办法停下来打每一个人的问题。
他丢了半天,好丢人的范围,三个人,也就是说这三个人半圈,记得有一个哥们儿叫大贤,来了之后满头大汗,什么都没答出来,最多也就这样,第二天你再问这三个人中任何一个说。
昨天那哥们不这满出满头大汗的哥们儿叫什么,他一定10000%忘了,是不是这样的,所以就因为这半天三个人的丢人,你把自己卡在家卡了七天,然后还影响你后面干事,连干都不敢干,连尝试都不敢尝试,各位兄弟们。
你们去尝试个面试,会损失钱吗,会损失色吗,会损失财吗,你们什么都不会损失,为什么不去试,你一定要去试,好不好,别的不说,这个心态问题以后大家不要有能做到吗,能做到的,给老师扣个一ok。
一面试就考试说不出话去面,所以后面你喜欢哪个女孩给我去表白,对不对,你喜欢哪个男孩给我去表白啊,给我去勾引去干,面多了自然就就好了,面试口吃没有关系,面多自然就好,是这样的,什么东西,你不是啊。
你你不就是没有人,任何一个人到了一个新的这种呃,就做一件新的事情的时候,他不遇不遇见点困难,不紧张呢,没有啊,那成神仙了,去世好吧,所以呢我们就大概解决了啊,听我说我再说一遍。
我们就大概解决了什么问题呢,第一个是写好怎么写好几份简历,美职位,看看看人家要什么,网上写什么,ok这是最好的方式,当然也有一些普适性的啊,这个我现在没办法教大家啊,这是第二个呢,就是你这种简历。
你投出去,你刚才有同学还说呢,说我33了啊,我投了100份简历,只有一个面试通知,是不是我刚才有同学看到了,应该有一同学说说说过,我翻一翻,我刚才没理他,大数据入行年薪,想规划一下未来,这个一会再说啊。
我们先先解决单的层面的问题,找不着了,刚才有同学我记得他说了,他说我30,我记得他他他这么说的,我33了,投了100份简历啊,只有一个面试面试通知,那么你想想看,为什么你想过没有,我你听我讲完这个。
你你都没想过是为什么吗,你为什么投出去100份简历,只有一个人找你面试,why想过没有,有没有同学能够告诉他,对啊,你简历写的不好吗,你广告打的不好吗,你广告肯定是打的不好啊。
哪怕就是说你我再跟你说一遍,哪怕你就用一份简历海投也没有关系,你把这份简历给我写牛一点行不行,需要需要我给大家看几分简历吗,找几份简历给大家看看,这个简历是年薪120万的啊,大家愿意看也可以看一看。
这个是年薪120万,有同学说我我我我我那个里边这里边写东西,我好多都不知道啊,先写上去,先写上去,按照我说的方法,自然会驱动你去学习这些东西,比方说你我们拿第四条来举例子,我随便找一条。
拿第四条来举例子,精通分布式事物,阅读过two p c tcc相关组件源码设计,可靠消息,最终一定有方案,最大努力通知方案,saga好,各位同学有多少不了解第四条的,有没有。
了解不了解这四条得老师扣个二来,我看看,franklin,ok嗯,有应该有,对不对,好你你自己评估一下,如果是让你来,同学们,我问你们一个问题,你们自己评估一下,如果你能够在简历上把这第四。
第四条给我写上去,你大概要花多少时间,忘记了没有关系,你们觉得应该能能你们觉得把这条写上去,把这条写上去,用一定的概率去拼机会,你们大概要花了多少时间,十秒十秒,就是说你一定的概率,一定的概率去拼。
我觉得30,我觉得30,我觉得30给的给的比较比较到位,就是半天到一天,我再强调一遍,其实你了解分布式事物,你一篇文章很可能就把这里面所涉及到的东西,全读过了,全全就全了解过了,但是呢你很可能落不了地。
你懂吗,但是对于你来说,去通过一定的概率,通过面试,半天到一天时间肯定够了,能不能理解,我再说一遍,不要想着你现在就啊什么写源码或者干嘛的,你只需要通过面试,用一的概率去拼的话,半天到一天肯定够了。
是不是这样的,所以没有大家想象中的那么的难,ok比如说两天时间,不管你多长时间吧,我们讲我们假设每每一个大概需要1~2天,这18条18条30多天,是不是也就30多天,这可是年薪120万的简历啊,兄弟们。
你要是能30多天,然后就有一定哪怕5%的概率,3%的概率,1%的概率去拼一个120万年薪的,你愿不愿意去尝试一下啊,面试背了记不住,没关系,多背啊,第一次没记住,没说上来,第二次会不会记住,说上来啊。
当然这个有点夸张了,我突然间那个那个什么了,这个简历就就就不带不带大家那什么,看了24岁的简历哦,sorry,这是我们一个一个对不起啊,这是一个学生的简历啊,这是一个学生的简历。
我们来找我们自己的简历模板啊,这是我们简历模板,这是二,这是24岁的,当时这是真正真实的简历,啊啊667 10万当时拿了ok,这个吧,我们比方说这个京东常见io模型和优化策略,来各位同学们,各位同学。
如果让你简历上写这么一条呃,你需要花多长时间写上去,并且以20%的概率能够能够拼下来,你到底要花多长时间,一天两天呃,周老师就是我们周老师在讲这个io模型的时候,他公开课讲过。
他讲完这个io模型和基本的优化策略,大概需要花两个小时到四个小时,也就是说你听完一天公开课之后,你基本上呢就能够有基本的了解,然后再通过复习,再加两个小时复习,大概需要六个小时,六个小时。
ok 6个小时,差不多,你就能以20%左右的概率能够通过这条,当然有同学说精通啊,这个我可不敢写,你们就是你写精通,然后你你你了解你精通了其中的10%,他有没有可能正好问到这10%。
你表现出来的就是精通,就算你不敢写镜头,你可以写熟悉,对不对,可以写了解,难吗还还还还那么难吗,我给大家讲完,这个大家伙还真觉得,这个简历写出来稍微牛逼一点,还那么难吗,兄弟们,几个人敢写精通,对对对。
你是不敢啊,你为什么不敢啊,不是你写精通会死是吗,京东确实不敢写,你京东不敢写的原因是什么,是不是别怕别人呃,我使使着劲的刨根问底的问你,对不对,你不就是这个这个这个这个想法吗。
就是你我们就拿精通这件事来说,说到这儿了,你随便聊会儿天儿,就是你写完精通,你害怕什么,你害怕什么啊,因为不精通对你其实最怕有人刨根问底的问你,问你你答不上来,对不对,好听我说如果你答不上来。
那么他问到了,你说a,如果我们按照问题的深度,分成a b c d e f g7 的问题,g是最深的问题,一般来说呢面试官会从a问题开始问,发现你答上来a顺着在问你b顺势再问你c好,我们假设你第一次面试。
第一次面试呢,他问到b的时候,你就已经答不出来了,你答不出来,他不会杀了你啊,你放心,这一点他最多认为你写精通了,你这么破小子,明明是啥都不懂,就了解一点浅呢,你就敢敢跟我说精通,对不对,你扯淡呢。
对不对,好币,你不会了,那么翻回头来你回来有半天时间,你恶补了一下b好,第二次面试官问到你b你不会了,问到你c你不会了,再回来你又恶补了一下c,然后第四次第五次你恶补了一下gf。
就是你们老用静态的看问题,我现在确实不精通,所以我不敢写,但是你发现没有,也许你用几次面试加总结,大概几十个小时的时间,别人在问你问题的时候,他问的你是那些所谓精通的问题,你就能答出个123来了。
哪有这么多面试机会,我往这儿写啊,当然我推荐啊,我再我再说一遍,我再说一遍,我推荐大家进行系统化学习,一定时间的准备之后,那你这时候的面试机会也多,成功概率也高,我现在讲的是当你比较着急。
时间不够的时候,听懂了吧啊一看精通,就是培训机构写出来的,没过没关系关系就是各种不同的简历,各种不同的简历是不是不一样的,就是说你不同的这种呃,不同等级的简历写的是不一样的,你要了解这一点呃。
应届生写的简历和30多岁,40多岁写的这种简历,他应该是长得不一样才对,呃现在还有一个问题,这说起来有点太远了,就是简历的技巧呢n多n多,我们有一个服务就是帮大家优化简历,呃,经过我们优化的简历。
有一些案例大家可以到我们的网站上去看,随便给大家搜一搜,做个小广告。

就是我们的呃,专业的专业在什么地方啊,简历指导成功涨薪。

对这个只是涨了薪而已,我给你找那个,就是只修改了简历啊,就别的什么都没干,建立涨30%成功跳槽面试突击简历指导。

就是突击加简历啊。

这是涨薪的概概念。

这个比较典型,就修改完简历两天收获十几个面试邀请,这是咱们周老师给修改完的简历啊,呃效果特别好,按简历按照您的指导改完了,当天有一个大胆猎头给出30~40到一国企。

你们提出的很多问题呢,跟你们特定的这种这种条件都有关系,所以我没有办法有一个通用的答案给大家解决,但是通用的原则我给大家讲清楚就行了,就是呃简历这件事情呢,其实不同的我们说不同的阶段的人。
他的写法是不同的,你如果说都是用那种应届生式的写法啊,什么精通了了解了熟悉了,这是最普通的写法,这是年轻人的写法呃,如果待会儿想看一些年龄大人的,应该应该什么样的写法,想看吗,想看给大家打打开看看啊。
稍等我给大家找一找,就是说其实你会发现简历的写法呢方方面面啊,不一,不是说就一种写法,稍等啊,刚才我们简历模板给大家打开几分呃,这是一份大专生的简历,他大概是32岁,32岁。
然后拿了是60万70万之间,因为他有一些股股票的激励,所以这个具体数额大概在60万70万之间,呃,你再看看这里还有精通吗,仔仔仔仔细看,你仔细看还有精通,还有还有没有精通,看看老程序员怎么怎么写的。
对,这就是老程序员吗,你还有精通吗,一个精通都没有,一一个精通都没有,ok还有精通吗,我没看到,ok不是说一定要写精通,也不是说要一定不写,你这点一定要理解,就是说不同的写法适合不同的人,不同的层次啊。
面试要面子,你写镜头我一定会恶补,他是不是就逼着你,你就真正的精通了,你灭几回你就真精通了,所以你写个精通又能怎么样呢,死不了人试试嘛,对不对,这是30多岁,我们看一个40多岁的,不对啊,40多岁的。
这是那个40多岁的,他是呃要当时要求的是月薪8万到13万月薪,还有还有精通吗,有啊啊,还而且还强调真正精通,这肯定是特别精通了,对不对,但是你还有说我还有还有那种列表式的。
说我精通这个精通那个各种专业名词吗,没有了,你发现了没有没有了,ok,啊jvm调优一般人就不会,我如果告诉你,用两天时间就可以把jvm调优写上去七吗,这个我们试过没问题啊,你背就行了,你不要不要干别的。
你不要真正去调,你只要不真正调十几天的学习,你可以压缩到两天,ok,好了我讲到这儿差不多能解决了吧,差不多能解决了啊,嗯我看看还有没有我我上面讲完的这些问题,还有没有同学有那种大的层面的疑问的。

有没有。

有吗没有了是吧,没有了,下面我们就我们解决下一个问题,突然感觉又行了,对你只要肯试,你是真正的行啊,你去试就行了,就怕那个就怕就怕你们,我其实最害怕的是什么呢,就是你们不敢上战场,你们实际上是被吓死的。
这是最害怕的呃,这方面要学多久,不需要学多久,这玩m的话,如果你想通过面试一定的概率去通过面试,比方说50%的概率通过面试,你大概需要学两天,但是你想真正的去进行操作,去进行方方面面的调优,搭环境。
这个大概要十几天,肯定肯定要十几天啊,35岁有人要吗,换了吗,不是那个各位兄弟们,你们有多少人是35岁以上的,35岁以上,给你给你看几个案例吧,好不好,我就说大龄的这帮人,我们找几个大龄的。
这是大龄成员,但是没写多少岁啊,呃38女生那个原来搞不定工作啊,我们后来压着他搞了一份40万的,这是老师们带他的过程。

当然戴起来很费劲,我就直接告诉你啊,39岁的ok杂七杂八的翻了一倍,44岁的这个我印象也特别深刻,被外企给裁了,裁完之后呢,我们帮他规划好了该怎么学习,学完了之后最后达到的效果。
最后他原来被裁之前是33万的年薪,他想达到45万,被裁了,44岁的女生,想达到40 45万能不能达到,最后问他的时候说薪资是不是达到预期了,答案是达到预期了,ok但是这是他的肺腑之言。
我也希望能给大家以警醒,不会在温水煮青蛙,就说你要进步啊,简单说就是你不能够只闷头干活。

不抬头看路啊,不抬头看看我到底还缺什么,对。

这个我也印象极为深刻,32岁的女程玉儿,他是两个娃,在家里大概当家庭主妇待了当了2年,后来实在受不了了,想出来工作,学习时间没有怎么办,每天两个娃睡着了,学到后半夜出来。

40万年薪,嗯怎么说呢,每一个人都有自己不同的人生和具体具体情况,但是我觉得其中一个你是应该必不可少的,就是提提升自己好不好,你可以不跟着老师学,可以不交钱学,你免费学也无所谓,提升自己这件事。
麻烦你持一个空杯状态,其实你会发现有好多好多的机会,在你慢慢的努力之中,一点点的努力之中,他就出来了,呃还是那句话,不怕战场上战死,就怕你在战场下面被吓死,ok,一会儿我我我我我给大家系统性的讲。
就是大连的问题怎么解决好不好,我们现在下面解决下一个问题,就是当我们写了一份好的广告,当我们呃以一定的概率通过了面试,因为我背题通过的嘛,背题通过的,我通过冲刺,通过突击冲冲这个这个通过的。
那这个时候我们有一个很大的担心,是面试进步,面试机构不了,sorry,试用期过不了,呃各位同学是不是那个也有担心,有有有有有这方面问题是肯定有,是不是试用期过不了,为什么会那么大家,你想一下试用期啊。
为什么会过不了试用期,过不了的一个主要原因是什么,就是当你开始真正上手干活,不出活,你肯定你已经面面过了,你过了之后呢,人家认为你很牛逼,但实际上呢你是通过冲刺嗯,冲上去的,冲上去之后呢。
现在你上手干活,然后不出活,你不就这个原因吗,只要你出魂,你面试机会,不过我不信,就你不出活,所以他不过好,为什么不出活,因为你不熟,为什么不熟,因为你没操作过,所以你面试期想通过该干件什么事。
第一个了解,真正,工作环境呃,所设计我说的这种工作环境是指具体的环境啊,用什么服务器用,用哪个框架,用什么开发工具,用哪个数据库,能理解我说的意思吧,就了解你这个真正的工作环境呃。
我们作为作为我们马士兵教育来讲,我们给大家采用的呢大概是,3000多个小时,接近4000个小时的课,一共229门,不敢说百分之百都包括了你们所遇到的环境,但基本主流环境在这里都有,我得登录一下。

我记得我登录了,刷新一下,我登录一下啊,登录完之后呢。

就会看到咱们具体的课程啊,大概从第一门开始,一直下面呢有229门课呃,从项目课到基础的那个那个,那个不同的这种框架课啊,怎么说呢,别的不敢说市面上最全的,我觉得这个应该没有问题啊。
你应该找不到比我们更全的课程,因为老师大概怼了20多位老师讲一门课,然后呢再加上十几个项目,还有一个呢,就是尽量的为大家还原,实际工作环境是什么样子的,呃,所以如果你说我们学员就很简单了。
当你了解完真正的工作环境之后,去找到咱们和你真正工作环境对应的操作课程,晚上偷偷摸摸努力,晚上偷偷摸摸努力就行了,听明白我说的意思了吗,白天不要在那里学课,你已经上手干活了,人家在盯着你呢。
晚上偷偷摸摸努力,然后白天呢好好的调bug,然后去去去去出,是努力的去出你这个活,然后呢还有一个好处呢,是你如果真的有思路上的问题,老师不会帮你帮你调你,实际当中代码这个没有没有这个时间。
但是你如果真有思路上的问题提给我们老师,老师来帮你解决,这个会大大的帮助你通过试用期的概率,我不能说百分百帮你通过,但是会大大的帮助你通过,这个没有问题吧,那好啊,那么还有呃第二个问题啊,就是说。
不论你怎么努力了,因为我们知道我们学过学过技术的人都知道,有的时候一个技术点卡,你可能卡好长好长好长好长时间啊,呃就是你无论如何都搞搞不定,他也许在你睡了睡一睡一觉之后,没准他他才能搞得定。
但是呢已经时间已经过去很多了,呃没准领导让要是你出的活,你不出不来,但这时候我们面临的最严重的后果是什么,就是试用期,不过就是我们面临最严重的后果,就是大不了试用期,不过没有过去,好我先问你。
剩下没过这个严重的后果会严重到什么程度,你们能不能承受,其实有的有很多人害怕结果,害怕结果就是他没想明白,这个结果最严重会是什么样子,我能不能承受,我向一个小姐姐去表白,我最严重的后果是什么。
为什么我就我会害怕她,她去向她表白,为什么,因为我最严重的后果是被他锯掉,这是最严重最严重的,应该没有严重,他不会打你一顿,那除非那太变态了,ok他也不会把你抓起来,好像我们讲试用期没过,试用期没过。
最严重的后果是什么,你能不能承受,想清楚能不能承受最严重后果,拆掉好在你开掉之前大概会经历这么几几几,大概会经历这么几个阶段,第一个阶段是近来的熟悉阶段,这个阶段呢叫做就是你进来之后呢。
他不会第一天马上上手,你就开始写代码,第二天就得给我交,结果不是这样的,你上来会进行一个呃业务上的熟悉,环境上的熟悉,一定会有这这么一个过程,入职培训等等这么一个过程,这个阶段呢短则两三天。
长则好几个月啊,大概我们就我们以一周来举例子啊,我们就拿七天来举例子,好不好,就一周五天吧,五个工作日我们大概说这个熟悉阶段,其实这个熟悉阶段你就完完全全可以放手,去努力的玩了命的去学。
你们真正的工作环境应该怎么样去操作,晚上好好认真的练,你白天成功的概率就会增加很多,然后呢接下来他怎么才能看出来哥们儿你不行,这个也是要经过一个阶段的,我们假设快一点,假设又又一周啊。
一周说这哥们儿真不行,没出活,好接下来这个时候领导的脑子里就想,我要把你干掉,不让你过适应期,能听懂吗,兄弟们,有同学说,晚上我要熬夜废话,你现在是投机取巧,我再跟你说一遍,你是系统化学习的话。
你应该六个月之后才拿3万,你现在经过一个冲刺呢,一个月就拿了3万,你现在投机取巧,你晚上再再不努力,你没走过的弯路,没踩的坑一定都得踩一遍,这个这个少不了只是先踩还是后踩的问题。
但是我现在起码让你入了行了,拿上钱了,这个没有问题,对不对,一周没出活,这个领导就开始脑子里要想了,这哥们儿我得干掉这哥们儿,这个应该是不行啊,把我给懵了,ok遇上一渣男没有关系,同学们。
你这一周是白过的吗,你这一周至少应该熟悉了哦,我我我原来的工作环境大概长什么样,同事们是什么样子的,部门怎么配置,办公桌椅长什么样,我以前从来没就没入过行,对不对,我们假设你这个时候啊。
就是你什么和别人打好关系了,就各种技巧了,什么都都没用啊,直接就把你干掉了,也就是说你经过了两周时间,两周被干掉好,这是最严重的后果,这基本是最严重的后果了,ok那我那我想问你两bia。
你的损失是什么呢,损失了一个工作机会,两周后面你简历上连写都要写啊,无所谓的事,然后那个你的收获是什么,我们想想你的收获是什么,熟悉了真正的环境,就是你你以前那个没吃过猪肉是吧,这次起码见过猪跑了。
那以后再跟别人说,我是在哪哪工作,什么中国这些日常上的事情是吧,哎跟跟同事怎么交流,六的座位是什么样子的,你起码不会出问题了,对不对,注意了,这种环境锻炼了动手能力,更重要的是半个月的工资,没问题吧。
现在还有没有一个单位敢不付试用期工资的,ok,这是你的收获,那么在这种收获的前提之下,你原来这种情况下,这种情况下都能拿到这第一点机会,你现在在又有进步的情况下,ok又升了级了啊,又打了boss了。
又增加了buff了,你现在能不能拿到第二家面试机会,可不可以,那你拿到了第二家之后,你能不能给我坚持一个月啊,原来是坚持两周,这次坚持一个月行不行,坚持一个月又被踢了,再下一下第三件的时候。
能不能坚持三个月,坚持三个月还没提,那就一定不是技术问题,那就一定是你人品问题了,心理素质得多强大,这个世界上呢心理素质强的人赚钱,心理素质弱的人陪跑,还有一个呢是我现在教你的是快速回来。
你的心理素质呢,大概很多人的心理素质是被逼出来的,呃原来我们志愿军上战场的时候,有好多小战士上战场都都都吓尿了,然后整个战一个战场逼下来,打下来之后成为老战士,那心理素质杠杠的。
其实很多人的心理素质不行,主要的原因是没有逼到这个份上,如果真的有一天你吃不上饭,一周饿了3111,一周饿了三天,我我不相信你的心理素质过过不了这一关,听明白了吗,好这是突击的方式,当然我再说一遍。
如果你想真真正正的踏踏实实的说,我不需要多强大的心理素质,我就能能那什么的话,进行系统化学习,这个系统化学习如果按照我们的内容,那就比较多了,稍微打开稍作展示,但需要的时间也会尽量多,我个人推荐啊。
还是以阶段化的目标驱动来驱动学习啊,你不要老想着从0~100,就跟你的老老搞瀑布式开发是吧,一定是把那个100个功能全做完了啊,一一百个知识点全学完了,然后我再我再去面试或者干嘛的,那如果是这样的话。
那你肯定是那个那个那个那个呃,先是花的时间就就就太长了,而是我我建议你们也是迭代式的,就以我现在是2万,我的下一个目标是3万,我3万,我应该学什么,我该怎么办,就以这个为目标就行了,ok。
所以对学了前面后面忘前面的,因为你一一下搞太多了嘛,嗯这是我们系统化的东西,这份大纲你从头到尾读下来,我相信你就对庐山就初步的具有了印象,这份大纲永远值得你从头到尾读一遍,你跟不跟跟我学无所谓。
麻烦你把这份大纲从头到尾读一遍,你就连自学该在哪里下手,你就知道了,入门开始到架构师的进阶呃,不念了好不好,底层知识性能调优架构的设计,service mesh云原生嗯,服务保障。
这是咱们那个那个那个后端的课啊,前端的课呢去找前端的老师,要前端的课一样的,在这里呢给大家规划出了一步一步,怎么从零逐步的我迈一个台阶,我下一阶段目标,我现在是零,我要入行好,以1万多来入行。
该走到什么程度,这是第一步,入行之后呢,我下一步要达到3万,该达到什么程度,下一步达到年薪60万以上,该到什么程度,年薪百万以上应该掌握哪些,一步一步地由老师来带着你做规划规划出来。
这样的话呢你你学起来也不用说学,学了后面忘了前面的一步一步一脚印踏着走,你不要从头一下子把百万的全部都学完了之后,然后出去面没有这个必要,好不好,嗯大概有八个模块,这八个模块呢,这是专门的突击啊。
就是我刚才讲的突击的办法,大家不要小看突击这件事,突击是让你快速的赚到你以后呢系统化学习,然后赚到了钱,但是你你你你提前好几个月就把他赚到了呃,我们突击的效果呀还是很好很好的。

这个是你看啊,这是这是咱们几个突击的效果,给大家举几个例子就行了,这是面试突击,大概拖了15天,从1万涨到了10055天左右,ok超市我这边面试成功入58k 15薪,试用期全额工资可以吧。
第三件就面试成功了,ok突击完了再搞吗,没有没有什么关系,应届专科七天面试突击12k。

100多个突击的案例啊,我随便随便随便给你找几个就行了,面试突击26涨35k继续再往后规划。

35以后该怎么做的,报名四天突击学习,涨了7k突击有突击的神奇之处,系统化学习有系统化学习的优势所在。

不同的阶段采用不同的方式,传统企业1。5个月突,其实111个半月左右的业余时间啊。

涨了4000,1年5万万还可以吧,案例比比皆是。

就在这儿不给大家一一看了,呃这个网页是对外公开的,大家呢打开这个网页,1000多位学员的案例啊,总有一款跟你差不多,还没有说你付出了努力,在老师的带领之下拿不到效果的,ok呃这里面的任何一个呢。
没有任何一个马老师可以拍胸脯向你保证,没有任何一个是p的,没有任何一个是假的,嗯你找出一个来,马上这课就可以送你了,好吧,好我大概给大家大致解决,入系统化入行和那个快速入行的问题。
我个人推荐快速和系统化相结合,就你一边系统化一边进行快速入行,毕竟你早入行一个月。

系列 6:P55:【2023】如何短期快速找到工作? - 马士兵学堂 - BV1RY4y1Q7DL
呃今天我们就聚焦找工作,然后呢我先教大家呢,怎么就是怎么怎么怎么分析,怎么去具体的找找这份工作啊,呃我今天讲完,你一定会有收获,你呢,这么来做,我会先讲那个普适性的,假如说普适性的不适合你的。
咱们找咱们的老师来帮你一对一的做分析,目前这个服务是不收费的,好吧。

我们能帮一个是一个好,各位同学认真听。

今天我们就聚焦找工作这件事,呃,其实找工作这件事啊。

本质上是非常简单的事情,这个它基本上要分成两部,由两部构成,第一步呢就是投简历,第二步呢面试,当然面试呢可能会有好几轮嗯,有有什么技术面了,有什么项目面了,有什么那个hr的。
这个这个交易类hr的面试了等等啊,这个可能会有好几轮,但无所谓,大的过程上来讲呢,就是就这两步,第一个条件里,第二个面试呃,你们记住一点,就是一个困难给你们带来焦虑的时候,如果你只是聚焦于焦虑本身。
这个困难是解决不了的,但是当你开始认真分析这个困难的时候,我可以负责任告诉你,这个困难就已经解决一半了,好下面我们就来拆解大家伙遇到的困难,不就找工作这件事情吗,有的人可能是刚毕业找不着,对不对。
有的人可跳槽,找不到合适的,对不对,有的人是转行转不了,有的是遇到职业瓶颈了,不知道下一步该怎么发展吗,不就这点事吗,你下一步职业发展,你你总是还是要找一份自己更愿意找的,薪水更高的,不就这样吗。
所以我们聚焦在这上面,同学们,你们仔细考虑找工作这件事就两步,第一个叫投简历,第二家面试,那我想问你的第一有多少人啊,这里面会遇到两大问题啊,其实投简历呃,假如说你投的不好。
你遇到的是第一第一类问题就是没人理,没人理,这是第一第一类问题,没有人理你,伟大堆人理,你有十个面试,但是你没通过这个呢就通不过,那我想问你啊,我们先看这个通不过这件事,通过我问问他句。
面试通不过你说这是什么问题啊,是不是叫技能不过硬啊,运气不够好,基本上是由这两部分构成,因为你的技能不过关,人家问的,你不知道第二个呢运气不够好,什么叫运气不够好。
a b c d e f g7 个知识点我会ab,但他问的就是f和g是不是这里头呢,记住无论你通过或者通不过,这本质上是个概率问题,解释一下,面试,通不过是概率问题好,喂hello,我还在吗。
电脑刷了一下,喂,hello,我还在不在,嗯嗯在在ok ok好,那我们继续啊,我们一点,我会一点点把这个细分的步骤给你,给你给你拆分清楚啊,因为通报是一个概率问题,为什么叫它概率问题,同学们。
你们想一下啊,假如说你整个的我们要找一份工作啊,他大概需要的知识点啊,大概我们说说100个,然后这里头呢你只掌握了两个知识点,两个知识点你只掌握了两个,那如果说正好面试的时候问的就是这俩来。
你告诉我你能不能通得过,能听明白吗,同学们是不是正好问你这俩,你如果这俩就答对了,是不是你就能通过了,当然问你这俩的概率呢,就看有多少人去问了,你能不能蒙蒙的对了,这是运气问题,概率问题啊。
那么有的人呃,他因为知识点非常琐碎,没有人能掌握百分百的啊,包括我包括我们所有的老师,我们所老师加起来可能都未必能掌握百分百,那么这时候有人掌握了90%,够牛逼够牛逼的吧。
但是有没有可能人家问的正好是那10%,这个叫运气不好啊,虽然你概率很高,但是你运气不好,ok那我同学说了,老师我如果概率上通过了,我会不会面临下一个问题,所以下面其实还有一个问题叫做面试七。
试用期待不住,或者我们简单说一下,工作待不住或者叫待不长,大概所有人遇到的基本就这三个问题啊,我们一个一个来说啊,概率问题能够理解的给老师扣个一,概率问题能够理解的给老师扣一啊,一定要理解它的本质呃。
有同学因为以前有同学特别轴,你知道吗,找老师说,老师那个你能不能教教我怎么去搞定一份工作,我的目标就是进华为,那我告诉你,你这么着这么着这么着,他就问我,你老师我这么着了之后,我一定能进华为吗。
我我我实在没想到啊,咱们这个成年人会问出这种问题了,到现在为止,如果有人告诉你一定能干某件事,同学们,你们琢磨琢磨,这不是这不是骗子,是什么,有什么东西,它会是一定的吗,没有都是一个概率问题,好吧。
就是我告诉你这么走的话概率会非常的高啊,那么走的话概率会比较低啊,就这个意思一定要理解这一点,好吧好吧,先先解决第一个问题,第一个问题是最容易解决的,就投简历,没人理呃,有多少人正在遭遇。
或者说以前遇到过这个问题的,你给老师扣个一,我看有多少正在遭遇的或者以前遇到过的投资,投资就剪进去一定大堆mi,现在正在对好,大家听我说,虽然说啊投简历是一定一定技巧啊,比方比方说我给你举个举个例子。
你是在早上八九点钟投,还是说是晚上投,是海投还是怎么样投这些技巧呢,我在我们vip课里都有教,但是呢这个不是最核心的一个点啊,嗯比方说我再教你一个小技巧,我给你讲讲,你说一份简有有有的人是这样的。
就一份简历打天下,兄弟们,有没有人这样,我给你,我给你举个举个最简单例子,有哥们儿42岁了,找到我老师,我下一步想去找什么样是什么样的工作,我说你把简历给我发过来,我看看他简历大概是这样的啊。
项目很丰富,然后技术占了一半,管理占了一半,我给他的建议非常的简单,就是你一定要打那个有有针对性的仗,如果你要找的目标是架构师,只写技术,不写管理,如果你的目标是带头人,项目项目经理,多写管理。
少写技术好,这点大家能听懂吗,就是当你的目标是多多种岗位,你都可以去cover的时候,分开写,这都是小技巧,最牛逼的分开写的技术,我教大家叫做一个岗位简历,一对一,好,1号位简历,我这么说。
不知道能不能理解,这样我我我打开招聘网站吧,打开招聘网站啊。

我就打开这个招聘北京站,然后我们就随便搜一个这样吧。

搜一个我们打开这个随便打开就是第一个。

好的,我们听我说啊,大家注意看呃,我不知道有多少同学有人细致的去读过,人家这些招聘网站的需求的啊,呃因为这里面呢有很多同学,他的习惯是我写了一份简历,这份简历上写着我会啥,我叫我叫什么,我几岁了。
我会啥a b c d夸夸夸往上一写,然后呢看着简历哎,这这边在招等人发出去耍,好听我说那种的成功率是最低的,成功率最高的是我下面讲的这种,就是你你你你看上这个了,对不对,你打开来看看看人家要什么好岗位。
职责是要求sars的,那首先第一点你想一下,你想一下,如果我的简历上体现出sars来,是不是会更有优势,那这两家能听懂吗,给各位老师扣一,所以说你要看人家专门需要的是什么,你看啊,人家看的是sars的。
对业务快速了解基础上保持一定的前瞻性,如果你能了解一些前瞻性的技术,会不会有优势,比如说于原生大数据,大量数据的处理,ai的入门等等,你琢磨琢磨会不会优势好,只能说3~5年可能无所谓,你投的时候。
这个你可以忽略掉,你,哪怕就只有0~3年,我水平够了,我就可以投啊,你放心还是有机会好,你看看人家看中了io泛型多线程并发的知识,对不对,j v m的调优的经验,spring rainbow。
my bad is a pc好,mysql,redis eh base等等,好高并发多线程分布式系统合理嗯,加技术架构啊,这这个有点强,强调架构的,对不对。
寻访的时候重点强调spring sql是数据接口。

多线程是个数量,看到了吗,人都给你说得非常清楚。

如果你当看到你这份简历,这个东西的一个需求的时候,你的简历上该体现什么,心里有数了吗,有谱没有,做一个非常粗浅的道理。

叫做你写你的简历啊,这是这是最理想的以岗为简历,当然有同学可能跟跟跟我抬杠,说老善的,我以岗位简历的肯定是太太太累了吗,确实有点累,如果你一件事情想要效果好,然后还不累,你觉得这他他本身就矛盾。
本身你要干一件事情就得把它干细了,效果才会更好,当然这个确实有点累,那么至少你要干一件事情呢,就是通过我刚才讲的这个,你要你要理解一点,就是你的简历体现什么,你简历体现的东西是什么东西呢。
对方的需求这个很重要,就是人家厂子要什么就业单位要什么,而不是我会啥,你知道有同学,尤其是那个应届生,同学们写简历,我会打乒乓球,我会ui,我会photoshop,写一对,人家要求的是java的后端好。
我跟那写c sharp,写python写一个,你有意义吗,同学们,我们面前100个小姐姐,我每一位小姐姐都提出了自己的明确的需求啊,有小姐姐1米75以上,有乔小姐姐1米80以上,你非得跟简历上写。
我身高一米五八,我就问你有没有人会去找你面试,所以我们讲的第一条原则叫做,你写简历体现的东西叫对方的需求,你这份简历是个广告企业,就是你的客户,你的客户想要什么,你要在广告里体现什么,而不是说我想说啥。
你别你们你们那个那个厂子必须听我的,那这块能理解到位的,给老师扣一,当然我讲完这个东西马上就会跟有人跟我抬杠,说老师我不会呀,对吧,这这一堆我一个都不会。

那我咋写啊,不会能不能学,就算我长期掌握不了,我短期能不能冲刺一下,比如说我现在我只会ssm,对不对,我什么这个什么什么高并发呀,什么分布式啊,我啥都不会,但是我可不可以短期冲刺去囫囵吞枣。
大致了解一下好了,这就回到概率问题了,只要你有一部分的冲刺,哪怕你冲刺两个小时,做一个粗浅的了解,你的概率会不会提升。

好好自己想一下这件事儿,好接下来再讲一个更粗浅的兄弟们,前面100位小姐姐要求1米75以上,1米80以上,体重多少多少斤,你1658体重300斤,但是你现在要的是一个什么东西啊。
兄弟们是不是一个相亲的机会啊。

这是你所担心的。

前面一大堆漂亮的小姐姐,然后呢,人家要求挺高,我一看我明显明显不行啊,这玩意儿咋呀,不行不行,我还是自己在家焦虑吧,躺着吧,那个焦虑一下,多多舒服呀,嗯跟别人出去喝顿闷酒,整天在家里跟着焦虑焦虑。
你们的核心的思想不就是说脸皮特别薄,怕挫折,丢面子,怕丢人,是不是这样的,我想问你,你现在是1米58,然后你在简历上啊,你在跟小姐姐的这个信上讲,我是1米7吧,可可不可以可以吗,那你写1米78身高吧。
身这个身高一米七八,然后体重80kg,诶小姐姐是不是会给你一个相亲的机会,面试的机会我们就有了,来这会儿能听明白,老师扣一,就这块我要求你的你的第一步啊,简历这件事情解决了什么东西叫面试机会。
你就给我记住,只要你有面试机会,你这个概率就一定比没有要强得多,而且他跟具体的这种相亲还不太一样,1米58,在实际当中你不可能长成1米78,但是即便这样,你只要见到小姐姐,你就非常你就有一定的概率啊。
哪怕1%,你跟他好好讲,好好沟通是吧,好好聊,你们有一定的概率会成功的,但是你见不着他永远成功不了,这个能理解吧,但是我们实践当中技术呢技术不是这么回事,技术你现在是1米58,但是你通过一段时间的恶补。
你完全可以补到1米7,1米72,1米73,1米74,在垫点增高鞋垫,你就是1米78了,所以不会敢不敢写,解决这个问题,先我讲完这个,请大家呢对自己说不会的东西,我如果真啊你你的前提是你你投你的简历。
没人理你,那么你就要考虑到,现在你不会的东西也要往上写,这怎么还在这儿跟我这儿要不到面试机会呢,我现在不就教你怎么样才能要到面试机会吗,那这块能听能听明白,老师扣个一,就是你怎么样要到面试机会。
还还还听不懂,我刚刚进来,先慢慢听好吧,现在我们解决了就是要到面试机会的这个问题,这个东西也适合什么东,西,也适合那些想提升的提高薪的忽悠,你赢了哈,你以后一定不要忽悠啊,做一个乖乖的好孩子啊。
嗯啊各位同学,嗯在这儿那个我我我对,就看你忽悠这个词,那我就有点感触较深啊,哎呀有的人那个研究生的自述,或者是你去做任何的面试,考研的面试,以及那个有一些大学的这种自主招生之后,他有一个面试环节。
嗯那你要尽力的表现你自己啊,那个那个东西你认为是忽悠吗,所有的人你在不管你在工作中学习之中,你最终还是要把你自己的东西给大家秀出来,那都叫忽悠吗,你如果那人认为那叫都叫忽悠,那就算了啊,好大家听我说呃。
现在呢我们解决了第一个问题,就是说我们怎么样去呃,拿到了一个机会,这个东西记住记住,这个东西还有它非也也适合于所有的高端保,而且高越是高端的岗,对这个的依赖度越高,那个有不少同学找到老师说,老师啊。
我现在已经是年薪50万,老师,我想拿到年薪80万,那这时候我该怎么办,我教他就很简单,你先给我写一份年薪80万的简历,先给我写出来,老师帮你判断值88万,然后照着这份简历,你什么地方有短板。
恶补恶补的差不多了,拿一定的概率去外面拼就行了,这是大家能听懂吗,因为有很多人他其实不敢去拼,他自己没有信心,最核心的是他怕丢面子,怕丢人,他不敢去拼,呃所有的人,我建议你们把你们的自尊心看得。
不要看得那么重要,年轻人的自尊心一文不值,我可以这么跟你说,但是年轻人的脸皮儿反而是最薄的,你们好好想一下,在你们20多岁,20多年到40多年的成长的过程之中,你们所谓的这个自尊心对给你们带来过什么。
没有,有的时候你拉下脸来去追一下你们班的班花,没准儿那个机会就是你的了,就算不是你的,你也尝试过了,你尝试过了,你就不会后悔啊,你不会想说,哎呀当年我要是尝试一下,没准半块就是我,因为你怕挫折。
怕被人拒好,我们翻过的时候来说找工作,你说你找工作,你写了一份简历,你去了,然后没练过你,你你的损失是什么,兄弟们,我想问你,假如说你你你到了一个一个一个一个企业这里,然后有一个面试官啊。
上来噼里啪啦把你diss了一顿好,你的损失是什么,你的损失啊很简单,没有什么,就是有一个面试官觉得你很差,而且呢你们是第一次遇见,以后,在这辈子遇不上,但是你的收获是什么呀。
你的收获是增加了一次很不错的面试经验,你会知道对方会问你哪方面的问题,哪方面的问题我没答好,而且如果你要愿意找到我,把你的面试录音发给我们,老师还会给你给你进行分析,这叫面试的陪跑。
是咱们冲刺里面的一部分服务,只有收获啊,只有收获,没有任何损失,这点大家能听懂吗,所以我建议大家带你去试,没有问题吧,你不会也可以写,写了之后拿到机会,你就算没有任何的冲刺去补这些技术,你可以去试。
试完了,哪怕他今天问你的三个问题,a b c,你把a b c下来背过了,你再去试下一件,很有可能问的还是a b c,这块大概能听明白的,老师扣个一小北说大厂半年不能灭这个岗。
现在我讲的是找一份工作是特别差的,如果你想大厂,我会提前告诉你,你该准备到什么程度再去大厂,是这样的,你原来你用2%的概率去拼,还是用50%的概率去拼,还是用90%的概率去拼。
嗯老师会告诉你学到什么程度,你可以到90%的概率听懂了吗,但是我前提是你你不要把你自尊心看看太强,脸皮稍微厚点,我希望大家后面的整个人生的过程中,都能做到这一点,有工作的机会去争取。
有好的带头的机会去争取,有有喜欢的姑娘去争取,去表白,不就是被这被拒嘛,对不对,最严重的后果就是被拒,你不会被抓进去了,不就ok了吗。

我们解决这个问题好吧,所以这个时候你再投出去简历去,如果再没人理,那就说明整个就业市场全完的,百分之100%的一片黑,到目前为止远远离这个情况还远着呢啊,不可能好吧,国家最近的刺激政策一大堆呃减税的。
然后呃那个那个那个呃的专项债了是吧,然后那个呃汇率贬值,利率利于出口,出口行业的等等一大堆啊,我就不信,现在没人招聘,如果没人招聘,为什么我们这边还有一大堆的同学们跟着就业,还涨薪啊。
所以去争取去争取去争取就有机会,哪怕1%的机会,你试一下,有可能得到,你不是永远得不到,这里就要求你要做好什么样的心理准备啊,悲剧我要原来我是八次能找到一份工作,现在我要是可有可能我要试20次。
我要做好这方面准备,比如说你的心情淡一点,再淡一点,做出那种平淡的,不影响自己心情的正常的一个努力,一个争取就行了,看淡结果,注重过程,好吧,我们就到这o这部分我们就到这儿啊,听进去啊。
好可以继续的给老师扣个一,我一会给大家解决那种什么详细的问题,什么简历烂了呀什么的这些啊,别着急啊,就是这种特殊的问题,我一会帮你们解决啊,哪怕你非常特殊的问题,老师已经帮能帮你找出路来。
那个我先先解决普遍性的问题,就是找找工作,投简历,没人理,对不对,这个这个我们解决了啊,投简历出去,你按照我的方法来,他就一定有人理好,我们下面马上遇到的第二个问题,就是我写了一大堆我不会的。
我们假设说我写了一大堆我不会的,其实讲到这儿,我要再稍微问问大家一个小小的问题,我假设你的真实水平是40,假设你的真实水平是40,那你这个写写简历的时候,你写成你这份简历看起来是是写成60合适。
还是写成50合适呀,还是写成30合适呀,好兄弟们,这个你们想过没有,如果你的真实水平是40,你的简历上是写50合适,还是写30和十,写50,为什么呀,why为什么,还是个概率问题啊,兄弟们,你们记住。
如果你的水平是40,你在简历上写50,那么只是你的通过相对概率会比会变低,你可能只有20%的通过概率,十家灭了十件,只成了两件,听懂了吗,如果你的水平是40,你写了30。
那么这时候你的概率很可能是面了十家,成了八家,我就想问你,你面十家乘两家跟面十加乘八家,本质上有没有太大的区别,假如你对,不是说非得去灭那个特别高的一些互联网的,这种大厂啊,特别心仪的这种企业。
我需要达到90%以上概率,我才感觉我才需要去灭,我才重视他了,如果不是这样的话呢,其实两个没区别,因为我们只能二里面取一个或者八里面取一个,我们最终只能有一个,是不是这样,同学们好。
这两个的区别还有一个区别点在什么,40你正常应该我们假设你拿4万的月薪,你正常应该拿4万的,当你写成50,这两件里头,你给你的是按照50给的,是40给的,按50给的,你是不是拿的是5万,兄弟们。
而另外一个呢拿了是3万,所以你们记住,永远不要说我面试的时候一点难度没有,然后我就给进去了,我是特别开心的一件事,我告诉你亏了,好吧,人家给你的是按照30给的,你亏了1万。
你本来正常跟俩哥们都是40写50,那人挣了5万,你写你写了30,你挣了3万,然后大概每个月差2万,我就问你亏还是不亏,你亏飞了,所以一定要往上写往上写往上写,这个本质上也是说我不会的,我也可以写。
好吧好,那下面呢我们就来聊说我面试通不过的问题,ok好我们现在假设你你你呢就就是一个冲刺吧,给大家看几个冲刺的例子。

我水平特别烂吗,我水平特别烂,然后我就想快速的。

我都玩了命的,就像短期内就能搞定,那怎么办,就是冲刺突击啊。

我们叫突击,那这里就是突击了,一个月涨了6万。

1年涨了6万以后,年年有6万涨,你就问你开不开心好吧。

突击我们找一下啊,突击的,因为我们突击的这个这个案例特别多,这里八八十二项专科学历突击了半个月,新增超级贝斯伤害,这就是突击做了做了一个突击,突击的学习好。

我下面讲你突击什么东西好不好,这是快速突击了一个月,这个长得不算高,这是最近的情况啊,要搁以前的话,那肯定比这个涨幅高,是1k到13k啊,贝斯带技能。

然后这是突击三个月,其实三个月的学习就算是比较系统。

就不算突击了啊,当然但这个的话呢薪资就高多了,就翻倍翻倍了嘛。

这是突击了半个月涨两涨2k啊,嗯这个这个一般般跳出外包了。


突击不到三个月涨了3k啊,突击了,这是面试突击,突了三个月,薪资翻了三倍啊,这个这个也比较牛逼的,这是咱们这位兄弟的最好的说法啊。

就是我看到这种消息,我就特别开心,29岁可以吧,还。


就是我教你怎么突击,突击重点是什么,我下面教你啊。

系列 6:P56:【2023】如何从外包进到大厂? - 马士兵学堂 - BV1RY4y1Q7DL
这是快速,那么有有一部分有一部分工作是不适合快速的,这个我不知道大家知不知道,下面我们来聊一个就是不适合快速突击的快速,只能解决是快餐,快餐都不好吃,只有你在走投无路的时候,我建议你吃快餐。
但是当你的时间比较充裕,你应该去吃点那个好吃的米其林餐厅的好不好,就不要吃快餐了,那么什么地方不适合走这条,走这条路呢,有一个是极其不适合的,就是进大厂好,有多少同学自己想进大厂的,给老师扣个一。
我们来简单聊一下,就这个是没有办法走快餐的啊,除非你原来基础够,只是欠缺某其中的某一两个部分,这个可以,其他都不行,好我们来聊进大厂这件事情,进大厂这件事情,大概不同的年龄,不同的策略。
如果你是小孩儿应届生,那么你的策略是第一种,如果你是32岁到35岁,那么可能是另外一种,如果你是35岁到更大一些,这可能是另外一种,再说一遍,不同的人,不同的背景,不同的策略,我们一步一步来讲,首先。
呃首先第一个,我假设你是应届生或者是相对比较年轻的啊,几几年工作经验的这种这种小朋友,呃,我我有一个意愿,我想杀进一线互联网大厂,我想进阿里,我想进腾讯啊,快手字节,甚至我想啊进谷歌进微软。
那这时候怎么办呢,首先第一点,我刚才所说的那个无限复活那件事情,无限复活策略是不好使的,为什么,因为全国的大厂就那么几家不,他不会给你来来回回的复活机会,这个大家能不能听懂啊,你不能拿它去练手,你练手。
你只能去找那个呃那个广大的中小企业去练啊,你不能拿大厂去练手,那是你的最终目标,你把他当当练手的,你过不了,你不很亏吗,你亏死了,是不是,所以这个时候呢就需要你非常详尽的准备,你的各种的策略,呃。
我们先讲应届生怎么进,应届生呢,仔细听这个嗯,关于乐队生来说呢,又分好几种情况,我先说就是比较普遍的啊,你需要准备什么知识,听懂了吧,这个知识的第一第一权重,这个很多人可能不太知道,第一权重是算法。
兄弟们有好多应届生,我看到那猛学呃,学那个各种应用的知识啊,学js啊,学甚至学photoshop,学ui哇,哦跟那稀里哗啦稀里哗啦学了半天,结果学的全都全都是不重要的啊,人家要求胸肌发达啊。
你搁那练了半天,就跟那狂练肱二头肌啊,搁那狂练那个后后后背肌没有用,所以就是老师的作用是什么,你就是能起码能告诉你,你的重点该放在什么地方,深度应该放在什么地方,这第一个呢是是算法第一,这是第一权重啊。
仔细定制,这是最重要的,算法课是一个非常硬核的课,这个课是非常硬核的,这也是为什么大厂喜欢考他的原因,你做不了弊,你知道吗,华为想进三道算法大题,其中一个必然涉及到图,字节你想进,不好意思,你算法的话。
可能动态规划都是那个都是相对不太难,不太难的那个题目,明白吗,所以这是非常硬核的,你根本是做不了b的,你要知道在整个国际上,北美微软,谷歌亚马逊这些他们考应届生只考算法,他不会考你,jvm是个啥。
县城是个什么东东,那个操作系统是个什么玩意儿,他不会考这些,他只会考你算法听懂了吗,呃江湖上流传着一个故事,一个真实的故事,东莞电子厂的一位女工,阴差阳错到了美国之后,大概自己在那边学算法,学了半年。
你猜怎么着进谷歌了,这是真实的故事,你们在百度上还能搜到,不信你自己去搜,有他的名字,能听懂吗,所以这个是你们的第一权重,所有的包括这些应届的,包括你们小年轻,32岁以下这个东西啊,是你避不开去的。
避不开的一道坎儿啊,这是没有办法走快速的,就是其他所有的课都能都能都能走快速路线,唯一的是算法,算法为什么难,也为什么值钱,嗯难其实也谈不上你这样子。

我原来呢其实大多数的讲讲基础课的机构啊,不太会讲算法的,有的话呢也就是基本上就简单带一带。

目前成体系的讲算法的,咱们肯定是讲的讲的是最多的呃,这个主要的原因呢,是我想让我们的学生呢再高端一点啊,就是说拿到拿到拿到拿到工作机会啊,再高端一点,再高端一点。

当然这个课就会比较硬核。

那么这节课的老师呢叫左老师,请宗老师过来也很也很不容易呃,朱老师是本科的时候,是华中科大,研究生呢是那个芝加哥大学,在美国那边的ibm待过啊,在亚马逊待过,那么在中国这边呢在百度啊呆过呃,到现在呢。
嗯全全程好评,那个上网课的内容呢当然也会比较多,大概是这么多,尤其是那些个对于非计算机系的同学啊,你一定要认真听,就说你想补计算机系的专业的知识,算法是第一位的,因为所有的不管是软件还是硬件。
不管是设计还是编码,其实最终的最核心的它就是算法,那么我们会一般会首先给大家讲那个新手,就是你对算法什么都不了解的时候啊,这个这个新手班的内容呢倒不会特别多,主要是讲什么呢,讲一些链表啊。
讲一些简单的题目,讲一些二叉树啊,讲一些排序这些,国内国际的大厂,那么这个体系班的内容就会非常的多呃大概会,比方说各种的深入性的排序问题呃,堆的问题加强堆的问题,前缀数的问题,二叉树的一系列的问题。
贪心的算法啊,贪心算法也比较重要,并查集,这个应该考的也是蛮多的,就是那个字节特别喜欢考并查集的问题,那导问题是字节经常考的,华为必考,经典的递归,然后暴力递归到动态规划,动态规划的话呢。
其实我们编程很少遇遇见动态规划的问题啊,这这都是学术上的一些东西了,但是呢呃很多大厂是要考考这个,考这个内容的啊,然后呢再到什么呢,窗口的最大值就是呃就是滑动窗口的问题啊,单调站的问题。
然后k m p的,当时那个自己考个手写k m p啊,嗯mannature是吧,莫里斯便利啊,蓄水池p p r t等等,然后呢线段数就是各种数的问题,ac自动机哈希函数啊,这是红黑树啊,有序表。
卡特兰数啊,sb数等等啊,我就不一一念了好吧,就是这部分呢大概是帮大家总结了,各种各样不同的问题,用一系列什么样的规律去理解它,当你遇见一道题的时候,那么你的脑子里就能浮现出来,对应的那个规律是什么。
这是左老师给大家解决的最大的问题啊,看不懂就对了嘛,大厂要是考的考的东西,你你很容易就能看懂,那就没意思了,呃在这个基础之上呢,基本上我们每周都会把大厂的面面的题,哈哈给大家讲一遍,这是以往的录播呃。
这个是下面的下面的直播,new的来自网易的面试题啊,来自字节的面试题,来自京东的,来自学员的问题,大概讲算法课,我觉得讲到什么这种深度的呢,基本上我我我在市面上调查了一下,没有啊,嗯咱们跟京东呢。
也曾经就前两天刚刚举办完,那个全全国算法大赛,呃,以前跟搜狐举办过那个算法大赛呃,就这么跟大家说,如果大家伙现在还在大一大二嗯,大三还来得及,还还来得及,让老师来训练。
你其实最好的进大厂的方式是参加一些个呃,常见的这种面试,这种算法的竞赛,然后拿一个小的名次,哪怕就是一个鼓励奖,对你的简,这就是你简历上特别特别增光添彩的地方,这是进大厂。
当然你你说老师我我那个学历不太好,我现在还没有办法进到大厂里去,没有关系,你的第一步先拿份工作入行,入行之后再进大厂的办法,也有的是听懂了吧,这是第一,这是第一权重,这时候下这个我们我们梳理一下啊。
就是说我们现在是讲的进大厂的问题,进大厂里面的三类人群里面是比较年轻的,这批人,好年轻的这批人进到大厂,那么怎么这个时候是什么什么样子的呢,第一权重是算法,记住了吗,这是你的第一权重。
那么第二权重是什么呢,第二权重是基础知识,国外不考,但是国内就会考基础的底层知识,那么这部分包括什么东西呢,这部分主要包括的是,如果是在校生操作系统网络,祭祖数据库大概这四门,其他的什么什么。
你要是软件的话呢,什么电电路了呃,集成电路数电模电了,这个肯定是不需要的,然后参加工作的同学,这vm注意这是加相加的关系啊,前面也是需要的,jvm多线程就是并发的问题嘛。
然后比较常见的redis be one卡夫卡或者rocket是吧,然后mysql调优还有设计模式dp啊,设计模式design patterns,还有,部分源码就是说我源码我建议是读spring。
spring是最经典的源码,没有之一,常见源码就源码原理基础知识,这是你的第二权重,好的我们讲第三权重是什么,第三权重是spring系列组件的运用。
直接从spring boot到spring cloud的七八个组件的综合运用,加项目,这部分叫应用,所以第一权重是算法,第二权重呢面试八股文,我们简单把它称之为叫八股文,背面试八股啊,了解原理。
背第三部分叫应用,就是你日常开发,每天敲代码干的事,这是你的第三部分,剩下的是加分项,加分项有大数据,big data ai,有云原声,有高并发架构的设计与处理,好这些全是加分项,来这块能听明白的。
给老师扣一,所以你们大多数在校的很多学生,使劲玩了命的学这块,那不好意思,这块对进大厂的帮助并不大,ok最大的是在前面呃,越年轻进大厂就越容易,年龄越大,进大厂的要求就越高,那么下面我们讲进到大厂。
如果我年龄稍大了一些,32 35啊,30~35吧,差不多这个这个水平,那这个时候我想进大厂的时候是什么样子的呢,其实非常的简单,就是大厂对你的要求和这批人是不一样的,首先呢很多大厂依然会要求这部分内容。
也有部分会依然会要求这部分内容,另外呢除了这些之外,因为这你到30岁,你干了好长时间了,像这种内容应该早早就早就搞定了啊,早就搞定了应该,所以第三项内容你应该早就搞定了,那么还需要一些什么样的东西。
因为30岁往上进,大厂往往要求的是设计能力,它可能不是落地明白吧,他并不是你要求你去落地,要求你去敲个代码,只是要求你这点能力的话是不够的,他这时候往往要求的是一个设计能力。

那设计能力要求的什么样,我给你举个案例你就知道了。

找一个案例。

这个案例我比较喜欢举,因为它比较典型,这个是小伙,大概是34岁,我忘了啊,大概我依稀记得,要么就是33 34左右,这是那个进腾讯的时候,腾讯考的面试题,那么你自己看,他就已经和年轻的时候考的就不一样了。
进行一个架构设计,春节抢红包雨30秒抢1亿,数量1000万,用户3000万,连续抢只能成功一次就给方案,然后再进行资源评估,这是骗方案,你牛啊,你你你真值得,你真值得别人骗方案,那你下次别面试官问你。
你不跟他说啊,娘的骗我方案不跟你说嗯,我跟你讲,我跟你讲,我送你四个字,送你四个大字,叫就是你什么东西都往特别不积极的看看问题,叫敝帚自珍,写错了啊,你们你们自己想去吧,就是拿个破扫帚还当宝贝。
就你那破方案,有人有人有有人愿意要吗,有人愿意要,你得高兴才行,大哥哎呀,别这样啊,什么片代码片方案怎么了,你就给他,你就给他,你有没有进行练习。

历史上再一个这就是态度问题啊,这个多多扯两句,我想起来了,就跟大家多扯两句,因为今天就随便跟大家聊会天,我们讲那个一个公司里面能够得到提升的,提升速度最快的人会是谁,是多干活的人还是少干活的人。
是愿意主动承担责任的人,还是不愿意主动主动承担责任的人,是给我多少钱,我就干多少活的人,还是我先把活干好了之后,我再下一个钱,是下一步问题的人,你们自己琢磨去好不好,因为有一批人所处的自己的处事态度。
大概就是这样子的啊,就是说你给我多少钱,我就干多少活,有一个人有一个成语呢叫能能者多劳,那么还有一个呢叫劳者多能,ok,好然后腾讯骗了他的方案,然后他把方案给腾讯了,腾讯给了他90万年薪,然后他就去了。
嗯你你腾讯下次问你,你千万不要告诉他方案,这个不能告诉他啊,那么大概会会加到这种程度,就是架构设计,关于架构的设计呢,主要包括这这些方面的东西啊,咱们年龄稍微大一些的,我多说两句呃。
关于架构的设计主要包括的是什么呢,第一个是大并发量的设计,大并发量,ok第二个是大数据量的处理,这是这两大块,并发来的时候要求稳定性,要求效率高,呃这种内容呢其实还是还是蛮多的。
就是这种设计上的内容还蛮多的,设计上内容呢其实要求你掌握了哪些个常见的,各种各样的中间件之后,就是你常掌握了那个常见的那种,那种各种的中间点之后啊,呃然后呢还要去了解,他的选型问题吗。
这是咱们的一个课程大纲啊,你可以通通读完课程大纲之后,其实你会知道你的那个整个的知识体系差哪些,嗯大概从理论讲理论角度讲的话呢,有这有这些方面的设计需要你考虑,就是高性能的架构怎么做分流设计。
怎么做服务的并行与并发,缓存的设计,存储的设计,可靠性的设计,应用保护性的设计啊,就这个设计原理懂了之后呢,尽量多做一些案例,就是各种各样的案例,比方说12306的,比方说那种那种互不互关于点赞的啊。
比方说秒杀的,抢红包的,微博互关的,把你那些个原则性的东西用起来,这样的话呢,别人在问你这些问题的时候,你就答得出来了,听懂了吧,当然不是说,我不是说你所有人都能拿到腾讯的90万年薪,但是从架构师角度。
刚才给大家搜的那种五六十万,你信你就需要这些内容了,嗯大概是这部分,那么我们说年龄再大一些的呢,其实年龄再大一些的时候,很有可能算法就他就他就不会再问你了啊,我们有一位兄弟是37岁吧,杀杀到美团。
他就不会再问他算法了,为什么哪些方面内容呢,有可能会涉及部分管理内容,ok有可能会涉及设计的内容,架构的内容,这些都是需要你掌握的了,但是管理上的内容,有可能有可能会涉及涉及到一些了。
但是他的要求会非常的高呃,因为由于我手头案例比较多,但是我不想再举了,因为大多数人到不了这个这个层次上,我先就不给大家举这种案例了好吧,你有需求的再再问我好吧,我讲了怎么拿入行性的工作。
我讲了怎么杀到大上去呃,是大厂的训练,正常的情况下呢需要半年到1年,那么这个时候嗯是比较容易进的,会大大的增加你的概率,嗯那个你肯定要付出一些自己的劳动好吧,我集中上几点就这样说,我我集中再问一下。
就是说其他方面的一些问题,大家比较典型的呃,有管理团队的课吗,呃首先大家大家那个管理团管理这个课,有有有有有感兴趣的,给老师扣个一,就管理这件事情,我也顺带跟大家讲。
就是说年龄越大之后该怎么样进行进行发展,好不好,举举举一个案例啊,还是举例子吧,举例你就明白了,因为我刚刚刚光跟你讲肝体系,你是不理解的,呃,看一个简历的模板,我的简历模板呢,我手头就这几分啊。
但实际上很多的44岁的这个大专生的,百万年薪的这个简历,我们不是看他年薪有多高,他这年薪也是在前几年行情比较好的时候,拿到的,其实近几年再拿的话,很可能用新手到不了这么高,要降低一点点,不过没有关系啊。
我们主要看他的那个整个的发展过程,他写的是硕士,但他实际上是一个大专的同学呃,我们看他的这个这个这个教育经历,往这看就行了啊,呃它是原来扬州大学的,热加工工艺设备的专科生,然后第二专业计算机。
我不知道他大专是怎么读第二专业的,这个不太了解,这个不管他啊,高等学校高等数学成绩名列第一啊,数学生大赛竟获得一等奖,好各位同学呃,我讲到这儿,稍微的那个偏离主题一点点。
我想问你就这玩意儿写出来有没有用,这有用吗,这10000%有用,但是对于大多数那个应届生写的里面的像什么,呃,我是团员啊,我是学生会学生会会员呃,我组织过什么时候活动,我喜欢打乒乓球,那个有用吗。
屁用没有,这是和专业有关的东西,你那个是和专业无关的,能理解吗,好这个东西呢是说呃,就是说你比方说我什么,刚才讲就是大家伙可以去参加某一些比赛,然后呢,你说我我我竞赛我得过奖,你实在不行。
你们学校举办的比赛,你说2021年啊,陕西理工大学,然后那个全校是吧,计算机算法大赛啊,我得了二等奖,有人会去会去会去会去做这个背调吗,好什么优秀毕业生对,没理你啊,什么东西叫做简历技巧。
简历的技巧有好多,这是其中一种啊,因为这种简历呢我一看就能看出来,但是呢hr不一定能看得出来那个这种技巧,那还有一些什么样的技巧啊,比方说我学历不好,因为今天学历不好的同学应该也蛮多的。
我刚开始还没讲课的时候,就一直说我学历卡,卡学历怎么办是吧,这个卡学历哎呀娘的卡死我了,我就找不到工作呀,我是一破大专网络大专自考大自考的大专,来对学历有疑问,能给老师扣个一,各位同学认真听啊。
要对卡学历卡专业,就是说现在呢嗯你搁以前的话对吧,你学历你随便找一个完事儿啊,现在呢你学历都是学信网直接可以查的,对不对,所以你学历是什么样子就是什么样子,所以现在我认为现在是正常的啊。
以前呢真的是各种的那个手段,花活多的是,那现在呢不要去不要去玩各种手段,花花大家认真听,第一个麻烦你提学历,他是大专生,但是他是自考的本科,看了吗,南京大学的自考本科生,ok自学考试,好吧。
所以麻烦你把提学历这件事放到日程上来,我这么跟大家说,学历呢会变得越来越不值钱,有同学说老师不值钱,我还考啊,那没办法,那只能说就是越往上越值多多值钱那么一点点,比如说举举举个例,举个案例。
那个最近有什么北大博士,什么清华的研究生什么的去去呃,去什么保安的,去什么去应聘这个应聘那个的,对不对呃,全中国的博士生1年的毕业大概12万呃,所有的科研机构加起来大概的需求是4万人。
剩下8万人是需要自己去搞定一些自己想干的,干的活,干的工作的,以前有个计算机系的博士生,然后还是挺不错,学校的计算机系的博士生啊,在北京的话呢,他已经30多岁了,差不多才拿30万年薪,我看了也挺可惜的。
就是路没路没走,对,非常可惜啊,其实稍微点拨点拨乘以二总是不成问题啊,呃有些人呢总是自以为是,觉得老师你就骗我钱的,你什么都不懂,你就是割韭菜的,所以呢就是好多话你老师讲给你听,你也不听。
这课程课程没什么价值,我走了没什么关系,就是说咱们只只度有缘人好吧,那个,当博士变得越来越不太值钱的时候,你就想研究生会值钱吗,本科生会值钱吗,更不要提你专科生,那这时候怎么办呢,麻烦你往上提一提啊。
你反而是应该提一提,因为很多很多的人在招聘招聘人的时候,他有可能第一个就给你限制,必须是本科对吧,然后有同学说老师我提学历好不好提,能不能提得上去,提学率办法有的是啊,你要是我们小姐姐。
我们自己也有合作的院校,他提起来呢,其实这真真心不难,你不需要花太多的那种精力进去啊,几千块钱差不多就搞定了,大概但是时间比较长,这个是没有办法的,你提一个学历,从专科到本科,那你肯定得23年左右。
所以你一定一定要提前把这件事放到日程上,兄弟们,你千万不要在35 六岁的时候写出简历来,还在那写着,我是个专科生,你想想看你的竞争力会会会好到哪去吗,10000%好不到哪去好吧,所以这件事要提到日程上。
提到日程上来,职业生涯也可以,也没有问题,就说你的学历往上能往上提,往上提一提,所以老有同学问我说在直言值不值得读,我说时间精力,经济条和条件允许你能读,完全可以读,而且呢油它一定比没有强。
最简单的其实就是这么回事,当你是一个专科的时候,那么能接受你的人就这么多,十家里头三家,当你是一个本科生,十家里头五家,当你是研究生,没准十家里头七家大概是这么一个概率,这么只是这个意思。
就是你的选择面会更宽,来这会儿能能听懂的,能听进去的,苦口婆心的给老师扣个一,好不好啊,至于说专业不对口,各位兄弟们这个关系不大的,我跟你讲,你学历比较差的人,我以前也教过一些写简历的技巧啊。
今天免费公开,你看看看看这里,那是什么叫什么叫给自己,什么叫给自己那个那个那个贴贴金是吧是吧,诶给自己吹牛逼看了吗,不就是个大专的学校的,一个大大专学校的一个计算机系吗,哎吹牛逼,看到没有。
录取率仅为10%,牛不牛逼,你最差最差的可以这么写,当然你不你可以不写,你可以那个跟hr讲啊,见不到hr的时候,你可以写在简历上,对不对,你说哎呀,我高考的时候啊,哎呀我本来能上985的娘的。
当时发了一阵子高烧啊,只发挥了20%的水平,不好意思,进了大专,家里又穷,不想再重新考1年了,唉大专就大专吧,但是我在大专里面奋发图强,拿了哪个哪年哪年的奖学金,拿了哪年哪年竞赛的奖啊。
在我们大专里面仅有一个人,百分之几的人能够得到这种奖,你猜那hr会不会高看你一眼,也许以前没有的机会,没准你就争取到,就是看你争取还是不争取,我都讲到这里了,你就不要跟我讲这种话了,说这个难搞啊。
那个难搞啊,想原因想办法,你刚搁那儿发感慨,那有屁用,发牢骚,谁不会拿解决方案,想原因,想想解决方案,想办法,这个也是你干的事儿,所以这篇这篇简历里其实有各种各样的技巧,当然人家是除了技巧。
只有是硬硬的玩,不过你的时候才会玩软技巧,如果硬记能够谁跟你玩软技巧,所以你往这儿看,他在提学历好,我们下面看他的下一个学历,这个学历是工商管理硕士,就是俗称的m b a来。
有没有了解过nba读一个mba要多少钱,有没有了解过的,对于nba要多少钱啊,这个大家知道吗,便宜的十几万对,像中欧清华北大三四十万到百万之间,唉好各位同学,他读的是合肥工大的nba,我不知道多少钱。
哎你就说这这兄弟他妈的哎呀,这提升自己简直是是吧,那个那个太太舍得花血本了对吧,我一个月才赚2万,我1年才24万,我读一nba 180000,哎呦,我可要我,我肯定不多,我亏死了,我,是吧。
我一个月才赚了3000,买马老师一个课是吧,1万多块钱娘的亏死了,绝对不能买,来我们看它的收益,他为什么要去读nba,这是上海的架构师呃,大数据方向,大叔就是一会我给大家讲一下,架构师分好几个层。
好几个不同的方向和层次呃,这是他是8万到13万的月薪呃,你自己算的年薪是什么,麻烦你对自己的认知上的投资,一定要舍得花钱,那么一点点好不好,就是说这这份收益啊,就是远远超过你所有的投入呃。
学员的这个数值来讲,大概平均是三个月左右涨5000块钱,这是在疫情之前发生疫情之后呢,这数字稍微降低一些啊,三个月左右涨了三四千块钱,大概1年的涨幅5万是起步价,投入是,1万块钱多一点。
因为我们课非常的多嘛,然后呃每年至少多赚回5万,注意这只是1年的,10年就是50万,你怎么也得工作20年吧,我们说假设你以后再也不涨钱了,你就涨了这么多,以后再也不涨钱了,20年也是100万。
这就是你的投资收益,其实,在大家举个小案例,也是一个大专生,这是我的那个10年以前的学生,10年以前他杀进阿里的时候,3000块每月听懂了吧,现在多少百万以上大赚,呃那么这个小小伙子。
当然他不只是我的学生,他也学了好多好多课程,那个他当年我记得最搞笑的是,自己不会谈恋爱啊,报了一副一报,报了一个谈恋爱的课,然后报了一个指导怎么样去学习的课,打台球,找了一个台球的专业教练来教他。
后来我推荐他又去读了nba,40万读的,我们便宜的多,也实惠的多,m b a呢,其实在我看来,当你去算这种成本的时候,你永远都不会觉得说值这个值,这个就三四十万块钱啊,我认为那可能也不值。
但是他换回来的收益,如果你运用的好,那就是这么高,就这个意思讲到这里呢,我个人推荐啊,我们不讲nba,我们不讲管理上就是专业管理课啊,因为管理是一个特别大的学科,那么但是我个人推荐。
所有的超过32岁的同学,如果你愿意有经济上,经济上允许眼界也能够打开,愿意把自己的眼界打开,可以考虑nba,有同学说老老问我说读m em呀,在职研呀,还是ba,我跟你说,一分钱一分货。
nba为什么说我推荐大家,原因就是打开你的整个的大的适应,这个要稍微的往上拔一拔啊,刚入行的同学,你就听个热闹就行了,就是说所有咱们我们,我我们举一个最简单的案例,就讲这是公司的核心的业务。
比方说你们公司呢就是靠电商呃,来支撑支撑的是吧,就是卖卖货,网上卖货,那好我就想问你啊,离这个业务越近的人更容易赚钱,还是离这个业务越远的人更容易赚钱,各位兄弟们,一定是离你的核心业务越近。
你赚钱就越容易,那什么样的人离核心业务越近呢,想方设法往这里靠好,我问你啊,我们跳出技术来看技术,就是我跳出这个纯技术人的层次来看这个技术,你会发现,技术往往在整个公司里头是最不重要的,在很多公司里啊。
我不是说在所有公司里说我们公司就是核心,就是靠一个专利的高科技,那你技术就是最牛逼的,好好吧,但是跳出技术来看技术的时候,你会发现在整个一个公司的运转体系里面,技术往往不是那个起码不是那个。
起码不是那个最重要的,但是技术人往往认为自己是最重要的,我我搞技术的时候,我也这么认为,我搞技术的时候说妈的我要辞职,你的这个这个他们公司离了我,他还能赚几天,结果你会发现离了你人家做得更好。
来有过这种感觉的,给老师扣个一,然后就觉得我他妈就是最牛逼的,谁要谁要离了我那个就赚的更好啊,我相信有好多好多好多人有这种感觉,因为我年轻时也有这种感觉,我根本根本根本就不行。
但实质上你发现优秀的公司就离了,谁都行,记住了吗,如果你要有有朝一日去创个业,你慢慢的你就会发现你你们公司的核心竞争力,其实只有一个就叫管理,当然能领悟到这一点的同学,就已经层次比较高了。
但我希望你保持一个空杯心态,听老师多唠叨两句啊,往这方向去一去,你就知道了,好不好,就年龄越大的时候,所以我们说年龄越越大的同学,技术沟通业务管理叫好几条腿同步发展,你会发现你的职业空间突然间打开了。
o就不再局限在某一个狭窄的面儿上了,你的人生的广阔空间也就开了啊,你就不会再担心什么35岁问题啊,40岁问题,什么50岁问题,60岁的问题,褚时健80多岁创建的出城怎么样,几年时间干到几个亿。
唉所以说年龄不是你想的那么的重要,就是你要匹配跟你年龄对应的,你的水平跟跟你整个的格局的打开好吧,软考的项目经理和p mp怎么样,挺好的啊,这个比没有强,各种证书啊,呃你你有机会有精力有时间考一份。
总比没有强啊,比如说那个es elastic search,你知道我们靠e s e s这个认证,中国也很少嘛,大概几百个人,100个人,200个人才有吧,然后拿到了之后就涨薪,拿到了之后就涨薪,爽不爽。
其实非常爽啊,对excel认证没错,不要想你一会儿工作了,我得叮嘱一下我们的,没什么工作,这刚才啰里吧嗦的讲到讲到什么地方了,嗯讲这个学历的问题了是吧,嗯我们讲了怎么入场,怎么杀大厂啊。
这个是学历的问题啊,我看看大家会有一些什么样的典型的问题,如果没有典型问题,我下一步打算给大家讲一点什么东西呢,就是关于语言的问题,这也是大家伙最容易困惑的点,关于语言哎。
我到底是搞这种语言好还是搞那种语言好,这个是不是大家伙比较困惑的点,如果是你给老师扣个一,我是搞java好,我是搞go on好,搞c加java好,搞什么好,我要我从这个语言要不要转向。
另外一种报道这种问题啊,好我们我们把前面的讲的内容答小小答一个疑,或者打个一给大家看看,大家伙有什么有什么什么典型的问题,没有啊,双非研究生应届生想和本科生搞点不同的,找到自己的定位和对标对标岗位呃。
没有什么特别不同的,因为不会有说专门针对研究生,应届生和本科生应届生的不同的岗,没有这个岗可能急招研究生,应届生,也也可以招本科生应届生,但是呢呃举个最简单的案例吧,那么就这个同学啊。
就是我们刚才我看有同学想要说,那个面试的资料是吧,面经里面呢有一个非常经典的啊,稍等就这个我们的面经里面有一个非常经典的,就这个面经,这是阿里七面的面筋,就是这个点这个同学帮他们总结的。
他呢是那个念了在阿里那边练了七次,一共练了七次,进了阿里淘系,叫阿里国际啊,阿里阿alexpress,那那那那个港那个在阿里内部,应该算是比较重要的一个岗位吧,一个部门吧,好像是啊。
这个有今天有没有阿里的同学,也可以也可以求证一下,大概的话呢练了七面才进得去,他是一个研究生的呃,应这个应届生,然后天津的一个学校,然后呢,进去之后在杭州工作,差不多毕业的年薪在30万左右,可能高一点。
可能低一点啊,具体我不太记得了,那么如果是本科生的应届生呢,这个薪水会低,听懂了吧,这就是它最主要的区别啊,所以同样的岗比研究生过去呢,很可能你的薪水薪水会高一些,你的本科生过去呢可能薪水会低一些。
即便是同样的岗,理解了吧,同学们很简单啊,所以但是他没有没有那个那个那个是专门的,我就抄研究生应届的或者什么样的,除非除非各种特殊的公司啊,这不去管它嗯,看看还有一些什么典型的没有啊,甲骨文数据库。
阿里云,华为云这种呃,这种含金量怎么样,比没有强,挺好的,就是说遇上专门做这些的,他会他会很看重这一点,像阿里云,华为云这种认证呢,比如说你在三四线城市,二三线城市那个杀伤杀伤力更大啊,就是云原生。
到目前为什么说建议大家去要去,要去了解我们课程体系里为什么要加云原生,就是很简单,就是在呃那个那个和一一线城市,都是都是有要求的,那个好多二三线城市呢你可以吊打别人,可以降维打击啊。
你会你能体验体体体会到那种优越感,我研一22岁去了某大厂实习了几个月,下一份工作知名度和工资都不如上一个,还要不要去,感觉这个业务更核心,嗯哦你呢问这种问题呢,其实本质上没有意义,看这里啊。
那个以前老有同学问我说,老师我面临一个公司要不要去呃,如果你只有一个选择,你你如果你只有一个选择,你认真听,你有不去的这种资格吗,我就想问问你能不去吗,你不去就没工作呀。
所以你应该去争取更多的offer,我一般想找我们。

我们自己学生问我的时候,我一般都会建议他,就说你如果有多个offer,你怎么办,你给我一个列表,要我有两个offer。

一个是这个,一个是那个用的技术是什么,做的业务是什么,公司的规模怎么样了,老师我下一步的发展是想干什么,这个对我下一步的发展是哪个。
系列 6:P57:【2023】后端、大数据、架构师怎么发展? - 马士兵学堂 - BV1RY4y1Q7DL
我看大家会有什么问题没有啊,我们下面来聊一下,就是有同学说要聊大数据,我跟大家简单聊一下大数据呃,其实作为各种的大数据框架了,它慢慢的有一种简单化的趋势,这个我不知道大家了不了解。
就是一般来说原来做大数据的时候,你需要掌握编程语言,然后用编程去调各论各的接口,去完成大数据的相关的一些操作,但是呢各种各样的大数据平台出来之后呢,它倾向于简单化,用简单的sql语言就能完成。
现在大数据平台基本都这样,但是整个大数据体系的知识还是很多,各位如果想了解整个大数据的技术体系,需要那个大数据架构的,大数据的这个这个这个咱们的课程大纲,或者是什么呢,打开咱们这个大数据架构师。
你自己呢从头读到尾啊。

基本上就是把这个课程的详情。

基本上就把这个人详情去看,你就你就你就了解了,从热度到尾啊。

这个可能你刚写的有问题啊,呃在这里专业介绍啊。

不过程大纲专业介绍呃,你你从头那把它读到尾,大概因为我们的大数据的课呢,大概分了十个阶段啊,从这种技术的存储啊,到采样到清洗是吧,到那个原理源码啊,然后呢再到呃流失处理批处理啊。
再到这个在在线的分引擎嗯,再到这个数据仓库的设计,离线仓库的设计啊,实时仓库的设计,分布式的调度等等这些,再再再加上一定的这种嗯去学习啊,再加上一定的项目,大概四个左右的项目。
把这个表情呢差不多十个阶段啊,大概一共整体上的30张,三三十个小节。

十个阶段完成,嗯怎么说呢,你要去了解这个细节的话呢,我从大的方面跟大家聊大数据,大数据是什么东西,该怎么去掌握它呃,认真听呃,关于大数据这件事情呢,一般来讲,是一个入行的方向。
大数据后端都算是一个入行的方向,但是入行之后殊途同归,什么意思,有的人呢是以大数据入行,有的人是以后端入行,他们两个的区别在于后端比较宽,一线二线三线四线五线小城市都都有需求,大数据呢基本上一二线居多。
大公司居多,原因是小公司没那么多数据,所以他需要的数据量也需要聊聊,大数据的人也不多,听懂了吧,但是如果说你纯玩大数据,纯大数据啊,什么什么后端,其他的各种宽度什么都不懂啊,这种情况下呢。
你的薪资啊在纯大数据,只是做做做数据处理这方面,不去读源码,不去在程序上去改那个中间件的源码,在这种情况下,四五十万年薪到头了,如果是你是做纯后端啊,就是去做各种的业务实现什么的。
各种的那种那种那种结构啊什么的,也不涉及,差不多年薪三四十万,四五十万也到头了,想突破自己的年薪,实际上到最后呢应该是要走向架构师之路,大数据呢走向大数据架构师,后端走向后端架构师。
但是后端和大数据的结合,才叫做完整的技术架构师,技术架构师能够去深刻的理解业务,并且能够根据业务进行架构调整,才能够叫做业务架构师,或者是你能够带领一个完整的产品团队,包括ui,包括设计,包括测试。
包括运维,然后这个才能我们才能称之为叫产品加宝石,所以教师之路呢也是要慢慢的升级的,不断的升级打怪的,在这里呢实际上是大数据和获得的结合,所以大家不要把它对立起来,在你入行的时候有可能是对立的。
但但是当你后端想去寻求更高发展的时候,这两个是结合的,你不能说了解一个教师,只了解前面来了并发量,我知道怎么处理,但是并发量来了之后,数据量变多了,我后端该怎么处理啊,我也不知道了。
那你能是一个完整的家务事吗,它不是各位能听懂吗,在这个高更高纬度的这个这个层面呢。

呃是在是在这里啊。

就课程里面呢,如果你们想了解更高维度的东西,我希望你们去听什么呢。

第一个架构师,大型技术团队的管理,这是咱们p8 的老师,阿里的p8 年薪200万左右,讲的产品的驱动力,科学规划管理,产品产品架构师,这个阿里的p9 p9 的老师讲的ok。
教你怎么在现场大厂之中的线上事故的,ok原来京东的老师啊,架构师的也需要了解的前端架构,这就是你的技术视野呃,为什么聊事业这件事情,呃,各位呢我们聊一点长远的发展,就是以前有很多同学老问我说我年龄大了。
我怎么突然间发现我在这行混的不太好,我突然间发现我的路变得很窄,我我我这到底发生了什么,我该怎么办,有没有人有这方面困惑的,就是大龄我该怎么办,有没有给老师扣个一,应该有。
其实我跟大家首先来说第一个问题,就是说各个行业其实都有中年危机,所谓的大量就是中年危机,各个行业都有啊,包括公务员,公务员到一把年纪了,但是呢还只是个小科员,我升不上去,升上去的都是那些有关系的人。
有能力的人我比较差,我混的不太好,情商不高,能力一般,我升不上去,我算不算中年危机,其实也算啊,没有没有像咱们把it那么严重而已,各个行业都有,我们说那个医疗行业,我们说那个不读读不了博士。
生不了主任是吧,挂个号就只有七块钱的那种,有的事对不对,有的是我告诉你年龄很大,还是护士连护士长都坐不上的。

系列 6:P58:【2023】面试蒙进去了,呆不住怎么办? - 马士兵学堂 - BV1RY4y1Q7DL
好了当你理解了这件事之后呢,我们下面来聊,就是中间插播了一下这个算法问题啊,我下面我们来聊什么呢,蒙进去了,待不住,露馅丢人,少年们这个呃有的人是遇到过的啊,就是呃蒙进去了之后,然后真正让你开始操作了。
说你来吧,你给我配置一下,配马上傻眼了,好好听我说,一般来讲你进到一个新的公司之后,优秀的公司大概会给你,前面一段时间的培训时间,这是优秀的公司,你要去到银行的话呢,他这段时间会给你到一个月左右。
你知道吗,这是最理想的最美好的啊,你想想看你白天呢他就培训你日常的业务啊,我们日常的环境,他告诉你我的项目作业环境是什么啊,我们现在面临的情况到底是什么,他培训你这些,你晚上啥也别说。
现在所有的东西背的东西全都不要背了,干什么就看老师怎么操作的,好好跟着跟着老师,晚上偷偷摸摸的操作,白天正常上班啊,该怎么拍怎么拍,能理解的意思,这是理想的情况,说比较差的情况是什么样的,比较差的情况。
大概是给你个两三天时间就让你上手,对上来就干活儿,一点缓冲都没有好,这时候该怎么办,好认真听我讲,你一旦进去了,首先坚持一个原则,不敢不出来,这个是需要脸皮的,你知道有些有些人是给你白养,知道吧。
然后不要问同事,技术问题为什么呀,一问就知道你就露馅了,这么简单的问题,怎么你都不知道,不要问技术问题,但是你可以问业务问题啊,说这个业务是长什么样,他的这这这这这个呃到底是怎么怎么处理的,先进行审批。
还是还还是先进行报告等等啊,听明白了吧,这个你可以问,但是你不要问技术问题,说这东西哎呀该怎么配呀,我配不出来,你帮我配配行不行,这不行,一问就露馅啊,你一定会露馅10000%的,那问谁找老师来问。
听明白了吧,你就晚上偷偷摸摸问老师就可以了,你说老师我现在遇到了这么一个问题呃,然后呢他的大概思路,我我我不知道你能不能告诉我,大概思路该怎么办,ok好了,你这时候找老师问,老师会告诉你思路应该是什么。
晚上告诉你第二天再再再再去再去练就行了好,也就是说你晚上偷偷摸摸做操作,你就别睡了好吧,因为你是那个三步并作两步走进去的,人家别人是扎扎实实学了1年2年,然后杀进去的,你呢一个月突进去的。
你能跟别人比那个扎实劲吗,你肯定比不了,怎么办,晚上你就别睡,你赶紧给我秃就行了,突击做操作,而且做什么操作,就是我现在用到什么,我就操作什么,就是为什么我我给我们给大家提供的课程,我大概200门课。
为什么这么多,其实就是你用到了什么,我们基本上大多数都涵盖,就是你哪怕你没有涵盖的类似的东西,也涵盖明白吧,就是你晚上偷偷摸摸赶紧做操作,能能操作多少是多少,理想的情况是你晚上每天熬熬的黑眼圈。
但是呢你慢慢的站住了脚,因为你突然间发现,只要你把环境问题大概解决了之后,剩下的是敲代码的问题,就方便就方便多了,你至少不会说那个hello world什么的,这些敲不出来,对不对,你不会有这种问题。
好到你慢慢的熟悉了之后,你突然就会发现你每天敲的代码大概都差不多,c r u d好,你就慢慢能够站稳脚跟,这是理想的情况,好,各位同学,我们说不理想的情况,我们主要解决不理想的情况。
不理想的情况是什么样,不理想情况是给你个简单的问题啊,你这不错啊,简历写的很牛逼啊,面的时候也也也能通过,行了行了,这个模块啊,大概一周时间你帮我搞出来,然后别说一周时间了,给你一个月。
我都没搞定一个模块开始的卡到位的问题,我跟这搞了一周都没搞定,这是最不理想的情况,是不是啊,同学们,丢不丢人,估计面试官都后悔死了,他娘的怎么招来这么一个二货,啥都不会,跟我这待了一周。
还得领我一周的工资,别不好意思啊,那个该该领工资,领工资好不好,试用期都得有,都得有工资,国家规定啊啊这个必须必须得给好吧,最差的是自己走人,最差最差,但是自己做,所以这时候你不要怕丢人,还是那句话。
你丢人丢了一周,丢到了某个公司,这对方记住你的话,他除非对你对你有意思,他才会长时间的记住你,哎呀这哥们不错,我想跟他处对象,我才会长长时间记住他,否则的话说我手底下有一哥们儿,跟我这儿了一招。
他走人了,我天天记着他,我不有毛病吗,所以不要怕丢人,给我扛住,赶你再走,不赶不走好,我假设你扛了半天,使劲扛,厚脸皮,玩命扛,也就扛了一周左右,一周实在扛不住了,再说滚滚蛋吧,行你就滚了。
ok你就滚蛋了,惨不惨太惨了,但是你发现什么规律没有,你发现我第一次面,我面了18家,然后面长了一点,然后我带了一周,在这一周里头呢,我至少了解了一些事情,就是我们我们还没吃过,没怎么吃过猪肉。
但是我已经见过猪跑了,企业到底长什么样,工作环境什么样,上级是什么样子的,每天应该怎么开会,环境是什么样子的,大概至少了解了这些好,你下次再练十家,能不能成第二家,可以可以可以可以不可以。
你给我扛住就行了,能不能成第二家应该可以,第二家能不能坚持一个月啊,争取吧,一个月被人轰出来了,能不能成第三家,第三家能不能三个月,三个月还被人轰出来,那一定不是技术问题,各位听听,明白了吗。
这是最差的情况,但实际我们遇到的百分之八九十的同学,第一家就能扛住,有老师做你的后盾,有咱们的问答来帮你解决实际当中的问题,有那个那个那个那个晚上,你偷偷摸摸的各种操作的东西,这都很很齐全。
那有之前的记录简历是不是就花了呀,你担心花的问题,还是担心找不着工作,赚不着钱的问题,这是这是你要考虑的,你要担心花,你就扎扎实实学,从头到尾细节里头攒了三够了之后好好学,学个半年1年,ok然后呢。
你再出去找,这就不划了,听不听,明白了吧,我现在教你的不是突击吗,不就现在你找不着工作,连个投出去简历写,连柳人理没人理的问题吗,所以不同的方式解决不同的问题啊,你不要用那个解决其他问题。
其他的问题来怼这种解决这个问题的方式,这个没有意义好不好,有的人他是眼前就要吃饭的,你要知道好多年轻人是这样的啊,我今天这个月再挣不着钱,我还不上贷款了,好多年轻人是这样的,是不是这样的。
这是最简单的找到工作的突击的,大概的一个方法啊,说里边各种各样的细节或者简历,该怎么样进行细化呀,问到我项目的时候,人家问的会常见哪些问题啊,我该怎么回答呀,这就太幸我今天没有办法跟大家说。
感兴趣就找报一个我们的课,我跟你说报马老师的课啊,他不亏,因为你就听我讲一个公开课。

你可能就少走好多弯路,跟我们的课程少少走弯路的多了去了,哪怕你少走个三五个月的弯路,你每个月多挣出来个三五千块钱,你是不是就赚了很多很多,你好好琢磨琢磨,你自学没人带,1年12个月,你学12个月。
你可能找到的工资12一一万二,你要是有人带学三个月。

老师帮你找到工资,可能是18000 九个月,剩下九个月就是你纯赚的,而且这几个月每个月都要多赚出来6000块钱,你自己好好琢磨。

这个能理解吧。

所以多听听过来人,从山顶上下来的人,知道怎么带你去山顶,这个路你是走走不坏的啊,ok,大概的这个突击的方法我就教大家了,来关于突击这块还有些什么样的问题没有,如果有你提出来啊,如果没问题的话。
我们去解决其他的问题好不好,突击课程都是新的,实时更新啊,最新的遇到了哪些,都会总结出来,这个必须得更新,不更新的话,我不可能给你讲几年之前的东西,人家都不问了,我讲他干嘛。
老比我这网络播的时候总是时不时的卡,明天把这事给我解决掉,呃课程有期限吗,2年如果以后还想要更新的话,交100多块钱再听1年,比如没有在企业实习过,不能编公司名吧,为什么不能。
好我先看看大家伙还有一些什么样的具体问题,没有啊,关于突击这块还有什么样的具体问题没有,如果有的话,你提啊,没有的话,我们准备冲击明年第三因素应该报哪个班呃,就是现在的我们mc的班,现在正在做活动呢。
就是我们g3104 的提前班啊,就是你通缉呃,让咱们老师来帮你做好,你差在哪,然后该该该学在哪啊,金三银四的先飞计划,活动时间10月21号到23号三天嗯,了解作为老师来讲呢,就是能帮你做的很重要的事情。
就是了解你的痛点在哪,你需要花多长时间做到一点的事情,做到做到之后,你应该先去学哪个,学哪个该涂哪个,不该涂哪个啊,呃大数据大数据这件事情需要我谈什么,突击是多少天,一般我们定义突击是一个月。
一般我们定义突击是一个月,但是呢呃大多数的如果你差的特别多啊,就是顶多就是三个月三学业余时间啊,不是说那个那个不是说那个呃你你你你你脱产,天天学,不是这样的啊,天天学的话,一个月之内肯定搞定。
就是突击来说,教师级别怎么突击,教师级别怎么突击,方式跟这个是差不多的,呃先先先z是吧,你想想看,作为架构师来讲,你首先要去总结,作为一个普通的架构师,我该具备哪些知识点,刚才你读那个那那个。

那那那刚才那个职位的那个那个。

那个那个要求了吧,你刚才读完了吧,其实大多数的架构师,这就是这就是架构师的基本要求,这是长沙啊,所以不要看他新增很低,这是长沙,长沙的教师,薪资肯定要比那个一线要要要低不少,但一线比这个高高多了啊。
不就这些吗,高并发高可用稳定性,安全性,数据一致性,然后呢分分布式系统系统架构,底层平台架构经验,对不对啊,架构是一种存在的问题,给你一定的业务,然后善于捕捉业务需求,加我存在的问题。
给出有效的解决方案方法,ok这不就叫我是吗,所以你突击突哪些图。

咱们课程里面的设计问题主要是图设计,何同学。

就是我们整个课程体系呢大概分好多啊,但是我告诉你。

你要突架构师主要图那个图什么呢,图这个主要图设计。

这是设计模式啊,不不这还不是设计模式。

架构。

嗯原声。

这个就是架构的设计理论。

然后还图什么架构的设计的具体方案,架构设计的专题。

微服务的架构主题,主要图这些能能能理解吧,嗯这是架构师应该掌握的。

不同的点欠缺点需要偷东西呢不太一样。

系列 6:P59:【2023】算法应该怎么学? - 马士兵学堂 - BV1RY4y1Q7DL
呃我下面解决第二个问题,就是关于算法这件事儿,你们那个我我我我我,我首先跟大家聊一下这个算法,他的逻辑在哪里,喂哈喽哈喽,又卡了吗,能听到吗,现在好不好,好了是吧,不卡是吧,嗯好像没有。
我们我们来聊算法这件事,因为我刚才没有聊算法,因为好多人爱抬杠啊,有你跟他讲一件事情的时候呢,他一定要举出一个特例来抬你,你爱抬杠就杠啊,没有关系,但是呢我跟你讲的呢,就是最朴素的普通的东西啊。
这个东西呢没有什么放置,塞尔皆准,就是我告诉你有一种方法呃,所以不要在心里的抬杠,因为你说的这些东西呢,其实老师都有考虑过,我怎么没事,没有时间把方方面面细节全给你讲到位而已,像某个我教大家。
就算法是什么情况,关于算法这件事情一定要了解,就是大厂,考算法,其他基本都不考,在中国大厂考算法,其他基本都不好,但是在国外不管大厂中厂小厂全靠算法,他只考一个。
他不像国内好多同学会问你这个知识点是什么,那个知识点是什么,你做什么项目项目的,跟我描述一遍等等,呃不聊这个,他们就聊算法,只聊算法好,这就说明什么呢,我跟你讲,说明算法是最科学的考察程序员的办法。
同时我也很不幸的告诉你,算法没法突击,我从来没有见过说靠背算法,然后三天啊,你莫里斯便利是吧,别别别的,以前算法一点都不懂,三天搞定动动态规划啊,还能把代码敲出来啊,给你一道力扣题,你能答得出来。
从来没见过,从来没见过,所以算法没有办法一这是最科学的考察办法,华为考你呃,你你入行或者升职到华为都考算法必考,而且必有一道题是关于图的,关于图的问题的,一定有五道大题,你答对三道好了。
ok这个时候你你你就是算是呃,可以可以进下一个门槛了,ok我可以我可以这么跟你说,这是最科学的考察办法,因为,为什么老外就只只只考你算法,其他为什么他都不考你呢,说你什么循环依赖这些东西。
我为什么不考你啊,因为你算法只要牛逼,它是内力,你其他的什么地产权了,黑虎掏心了,给点时间,你稍微练练就能上手,这点大家能听懂吗,这是内力,这是易筋经外公,我可以教你招式,囫囵吞枣,你学两天学比划。
比划就有进步,但是内力有没有什么好的办法,没有办法,就是扎扎实实学,就是为什么咱们马士兵教育啊,有你想知道培训机机构啊,有好多事都是教那个应用级别,来了之后跟你这个操作,那个操作看上去挺花哨。
但是很不好意思,那个呢很容易其实其实很容易,为什么在咱们这里呢,就是教了大家很多这种看上去比较类的,这种这种这种东西啊,就是这种这种呃算法课,为什么教大家其实很简单,就是说能够让大家伙能进到一个。
比较好的厂子里去,拿到很好的工作岗位,你这个就没有办法突击了,你说连突击我都能突进大厂去,那大厂也太水了,如果是这样的话,听懂了吗,就是我教你突击最快的方法是你搞定工作,涨点薪水,这是没有问题的。
但是我突进一线大厂这件事情不存在,那如果是这样的话,那大厂就它就不是大厂了,他都挑不出来合适的人,好好的人了,所以我在这里为你详细的准备了,大概300多个小时的算法课,这个课的学习方式应该是细水长流。
每天花一点点时间,不要停,ok也不要突人啊,最重要的是韧性,韧劲激情谁都有,一时的激情谁都有,但是我告诉你,你要想说长时间的,慢慢的细水长流式的这种韧劲儿啊,你还真不一定有听懂了吗,听懂了。
在这里呢我们是准备了大厂的系列算法课啊,就是从新手班教你基本的入门开始到体系学习,大概给你讲到至少是动态规划和莫里斯便利,k m p mannature等等这些常考的算法题,然后到我们常见的这种刷题。
比如说常见的这种问题大概应该是什么样子的,用什么样的规律去刷,ok相机问题,城市的容器啊,给定矩阵怎么怎么样,扣的时间到底怎么样啊,这个呃限限行点灯和环形点灯问题啊等等,力扣的这个87题,力扣的几个题。
然后呢,每周大厂里头我们遇到过的常见的算法题,能能看懂吧,所以各位想进大厂的同学一定考虑这个课,各位不想进大厂的同学,突击就能搞定,来算算,我说清楚没有听清楚的,给老师扣个一。
就是你每天每天练那么一点点,每天练那么一点点啊,做到有持续性的练一段时间之后,你就具备冲大厂的实力了,这个时间大概从你基本零基础的算法开始。


系列 6:P6:三色标记算法 - 马士兵学堂 - BV1RY4y1Q7DL
但是算完我就讲一遍,你听不懂就听,听不懂就算了,可以吗,嗯好听,我说呃,刚才我说过这个三色标记算法,三色标记呢是找到那个漏标的常用的解决方案,这个三色标记算法什么样的呢,三色标记首先第一点啊。
就是我们刚才说这个标记标记是个啥呀,标记就是说这是我们的对象数格式,对象对象数它有一个引用会指向别的对象,指向一个list,这个list里面又有引用指向别的对象,质量比对象。
这个对象里面有引用指向别的对象好,就这么顺着找下来,这个叫叫做搜索,并且标记,那好这么找下来的时候,我们会把找到过的对象和标记了一半的对象,和已经确定这哥们儿是一个什么样的,一个确定好了的对象,用颜色。
当然这个颜色是一个逻辑概念,并不是说真正的把它染黑了,也不是说给他一个属性叫做black,no是一个逻辑概念,这个是什么意思呢,就是凡是标记完成的,自己已经标记完了,哎。
这哥们儿已经已经已经已经过滤过一遍了,它的成员变量也已经过滤过一遍了,这种叫黑色,这哥们儿已经访问到了,但是它的成员变量还没有进行便利,这种叫灰色叫gray,那么还没有遍历到的这种节点叫白色。
所以黑灰白的概念就是这么来的,好,你先那什么一下啊,ok你先你先你先稍微消化一下,我再说一遍,凡是访问到这个节点了,并且访问到这个节点的成员变量了,它的成员变量也都访问到了,好,这个时候这个叫黑色。
访问到这个节点,它成员变量指向的对象还没有来得及访问好,这个时候叫做灰色没有被访问到的节点,白色节点什么概念,就是对象,就是对象,科技续吗,科技去给老师扣也来,那么同学们你们要仔细考虑。
就是在什么情况下会产生错标,第一种情况就是,在我的垃圾回收器回收的过程之中,你会发现有一个什么线,有可能会反成什么现象呢,就是一个灰色对象指向白色对象的引用消失了,那这时候会产生什么。
本来你要顺着它的成员变量,能够找到这个对象的,你突然间发现你找不着他了,你扫描不到他了,好各位同学告诉我,这时候会产生的后果是什么,你垃圾回收器在工作的过程之中,垃圾回收机在工作。
本来你应该去扫描到这个地道,可是找不着它了,因为没有任何一种指向它了,它变成啥了,变成垃圾了,对不对,变成垃圾了,那这时候怎么办,他就不会被回收嘛,这他就会被回收,对不对,所以说这个无所谓的事情。
唉这种呢叫做浮动垃圾,有同学说,老师他这次整个我们这次的回收没有把它标记,找没找着他浮动垃圾没关系,下一次在访问的时候发现哦,这访问不到了,那就可以把它当成垃圾了,所以这个就无所谓啊。
就是回收是哪些回收找不到的,这种叫floating garbage,叫浮动垃圾,那这种情况下叫没关系,无所谓的事情好,但是最严重的是这样一种情况,注意看仔细看,b灰色对象指向白色对象的也消失了。
在你工作过程中,与此同时,黑色的对象产生了一个指向白色对象的引用,再看一遍嗯,我们的垃圾回收进行线程,跟我们的工作线程正在进行,垃圾回收线程还没有标记到d的时候,b指向d的已经消失了,找不着它了。
与此同时产生了一个a指向d的内容,a指向d的应用,那这时候会产生什么,站在垃圾回收的角度,垃圾回收器的角度,你会发现,这哥们儿本来被垃圾回收器当成垃圾了,可是事实上他不是垃圾,并且我已经遍历不到他了。
我已经搜索不到他了,我顺着歌已经找不到它了,为什么会找不到,因为黑色对象在我看来他已经标记完了,我不会再找他的成员成员孩子再找一遍,而与此同时,这灰色对象指向他的眼睛又没了,大哥,你说我还怎么找到他。
我找不到它就会产生一个什么现象,我会把它当成垃圾给它干掉,可是能干掉吗,不可以,这个就叫做错标,没懂,没懂就算了,怎么可能会发生,怎么不可能会发生啊,你引用变来变去啊,你这个引用b的引用指向空值吗。
a的引用指向他了不就完了吗,然后你在运行过程中,这个小b等于空了,a里面有个小小,a本来指向没有,没有指向任何东西,后来把它指向d了,不就指向了这几句话不就搞定了,这个很难想象吗,嗯为什么会在这里卡。
懂了吗,还有还有没懂的没有,对啊,你的工作线程在继续啊,你的垃圾回收线程也在继续啊,ok,那现在的问题是怎么解决这种落标的问题,怎么解决这种错标的问题,好吧,来你们想想看解决方案,这种叫错表啊。
好c m s解决方案,我们先说cm解决方案,c msg的方案是什么,cmsg的方案叫做incremental update,incremental update,增量更新,什么意思呢。
就是cmc解决方案是这样的,灰色对象指向d的引用不是没了吗,嗯黑色对象指向体内产生了一个指向,指向白色对象的引用,好这时候怎么办呢,这时候把a变成灰色就可以了,把a变成灰色,就代表着我下一次标记的时候。
在下一个标记过程之中,我会对它进行重新扫描,我就能找到这个d了,就不会漏掉它了,就不会产生漏标了,好,标记就是访问到了,标记就是啥意思,标记就是访问到啊,听懂这意思了吗,什么时候变成灰色,听我说。
这里面呢,实际上是涉及到一个叫做写屏障的概念啊,写屏障号主要讲起来就没没没完了,叫rberry a,就是你每一次的这种引用的变动,实际上它都要跟踪跟踪的过程之中,然后对它进行修改好吧。
发现新的就把根治为回,我什么时候说这是根啊,大哥,不是黑的,不跟踪过来,对啊,你把它变成灰的,下一次访问它已经不是黑的了,你不是要跟踪了吗,颜色是用什么标记内存一位吗,你可以这么认,为。
一位是标记不了的,得两位,我想辞职给你当老师去了,咋整来呗,你看我讲这么半天,还有人没听明白,你一讲肯定大家都听明白了,好还有谁吗,还有没有谁有疑问的,这个事儿很难理解吗,总而言之,它采用了一种方案。
就是当产生这种错标或者漏标的时候,把这个a变成灰色的,好,你这个要理解不了,我下一个就没法给你讲了已经,所以我就是不爱不爱给大家,在公开课上讲算法的原因,因为这算法是需要抠的,好好理解。
怎么知道d错标了,知道d坐标需要你跟踪,叫right barrier,你看你看阿格里,阿格里又催着赶紧实战了,这就叫叫什么叫叫很难满足所有人,对不对嗯,好吧你看你看你看实战实战是吧,好那那那还讲吗。
算法还继续讲吗,算法继续讲的,给老师扣一,你听实战的扣二,来继续讲吧讲吧讲完一半人半途而废,也不是老师的半途而废,也也也也也也不是老师的风格,好吧嗯,来听我说,所以你把它变成灰色就可以。
ok那这个变灰色的过程呢实际上叫rberry啊,听不懂听不懂,错过听,使劲听听听就懂了啊,那我看这里,我靠我要跟你讲这个你就更理解不了了,你刚才都没理解,这个就更难理解了,这是c m s的bug。
cm s increment add,有一个非常隐秘的问题,就是并发标记产生漏标,这是什么意思呢,你那个由于它是有多个啊,多个垃圾回收线程,比方说两个m1 m2 这m2 ,然后m一正在标记a的时候。
正在标记这个a已经标记完属性一了,正在标记属性二,那么m一在m一看来a是灰色的,然后这时候有另外一个线程,把那个属性一指向白色对象,把这个属性一指向白色的,然后m3 这个垃圾回收线程把a标成灰色的好。
它它标成灰色的了,然后m2 注意啊是还是m一啊,m一认为所有属性已经标完,又把a设成灰色了,所以他经历了中间一个黑灰,这种多个垃圾回收线程之间,有可能会产生的隐性的漏标问题,我们去这点有点累了啊。
下次你还是没有便利到,哈哈好吧,这个能理解的就理解,理解不了就算了,看一下啊,我再重新说一遍,b指向d的也消失了,a里面有一个成员变量一指向他了,这时候呢一个垃圾回收线程正在标记a。
然后正在这个过程之中,这个业务逻辑线程把一已经指向白色对象了,然后另外一个垃圾回收线程一看,你原来是个这个这个把它变成灰色的了吗,把你变成灰色的了,因为你你你原来是黑色的。
但是中间你产生了一指向了一个新的,这个要把你变成灰色,可是这个时候另外一个垃圾回收线程,认为所有属性已经标完了,这个二他已经标完了,标完的过程之中,把a直接给设成黑色了,那完蛋了,结果地位漏标了。
我跟你说,所以cm s remark阶段叫做必须从头到尾扫描一遍,但这个问题一般面试官没什么啊,所以你没听懂就没听懂好吧,我们刚才稍微回过一下,就是这个c m s啊,咱们不是有这么多个呃阶段了。
你看啊这是cf 4主要阶段初始标记,并发标记,重新标记好,就在这个阶段,实际上他要从头到尾的再标记一遍好吧,但是由于他前面已经排列的比较好了,所以这个呢实际上也不是想象中的那么长。
但是这个sw有可能会非常长,这是他的算法设计上的bug毛病,所以这是避免不了的,因此cms你要想依赖它产生那种的非常老了,就是非常非常低的响应,我跟你说不太靠谱,这个你能听懂就听,没听懂就算了,好吧嗯。
总而言之,言而总之这是cms的bug,另外cm还有一bug啊,我讲给大家听,cs还有一bug是什么,还有一bug是在这,当cms撑不下的时候,来看这张图呃,这张图里面呢有一个非常隐蔽的一条线。
这条线在这c m s居然和sia serial old连在一起,啥意思呢,就是cm s一旦产生了满了它,这是它内存,注意cm叫什么叫mark sweep啊,大哥叫标记清除啊,标记清除最大的毛病是什么。
碎片吗,会产生一个一个的碎片,碎片占满了之后,有可能你心生成的对象,你在里边,你说我想占块空间,不好意思,站不下了,一旦站不下,我是不是得触发fdc,触发f g c会什么样的。
叫concurrent mode,肥良这种叫升级上来的对象,站不下了,站不下,会产生一种什么现象啊,他居然干了这么一件事儿,所有的县城都给我停,全都给我停止,派一个人serial。
派他一个人在那里默默的把所有的都清理一遍,就是这么的牛叉,当然这个清理过程是进行压缩的,好同学们,你们想想,这个会产生严重到什么样的一个后果呢,我有一个学生,他们在线上遇到过卡一天以上。
24小时以上的情况,就是因为产生了这个现象,就是这么个牛叉啊,所以你不要认为说人家那个游戏服务器啊,隔一段时间重启它就不是一种很好的方案,那不一定的啊,不影响不影响运营,不影响赚钱好吧。
为啥要变成单线程,我哪知道我哪知道他就是单线程的,用java写游戏服务器吗,这不废话吗,目前90%的加服务器是java写的好吗,当然现在有一些go语言,会慢慢的替替代一些了啊,为啥不用并行。
我哪知道人家不用,我哪知道你去问设计者,去,所以这种解决方案呢是呃有缺陷的好吧,所以cm increment update这种解决方案是有缺陷的啊,所以g one采用的解决方案是啥。
g one采用的方案叫做s a t v叫natural at the beginning,总而言之呢,其实一个是解决从这下手,一个是从这儿下手,刚才我们分析过,从这下手是有有有有呃,这个这个有bug的。
所以呢我们其实还可以从这下手,你不是消失了吗,你消失的时候,我给你记录一下,这是啥意思呢,就是当灰色引用,灰色的对象指向白色的引用消失的时候,把这个引用给记录下来。
所以这个snapchat the beginning指的是什么,就在起始的时候做个快照,当b和d的引用消失时,要把这个引用推到js的v站,这啥意思,其实就是在某一个站里面,记录着这些引消失的引用。
然后等我下一次要再进行扫描的时候,最终要进行一次扫描的时候,最终的最终的标记好,这个扫描的时候,我会把里面的引用单独拿出来,看到这个引用指向的这个对象目前是不是垃圾,如果是垃圾,我才能干掉。
如果不是垃圾就不干了,stand,snapchat the beginning,当然这里面的细节也会特别多,配合snatural at the beginning g one。
采用的方案叫做result set,sorry,叫做叫做rs这样的解决方案,它是在分析一个一个不同region,好,这个细节太多了,今天我们就来大大概大概大概算法就聊到这里,好吧。
卡表卡表是另外的东西啊,你别跟着混在一起,car table是老年代指向年轻代的引用,记在卡表里面,而rs叫做remembered set,是谁指向了我,而不是我指向了谁,好复杂呀,对算法就是这么复杂。
但是就就讲到这吧,算法我们就聊到这儿啊,给大家开个头,你们要是想了解更细的细节,报课听老师讲,或者你们自己琢磨去,开玩笑啊,好好那全懂了,说英语没听懂,然后我们开始聊这个实战啊。
我们实战的小优呢呃调优这件事啊,听我说它是包含很多很多的概念,ok其实呃调优啊,一般什么叫调优呢,其实在我看来它包括三种方式,就是三种三种不同的操作都都叫调优,第一种调优是根据需求进行。
这般的规划和预调优,这是什么意思,就是我要用多少内存,我要用什么样的cpu,我进行什么样的选型,怎么进行内存的划分好,这是需求进行预调,有的这一步也非常重要,你把这步做好了的话,你后面能省好多事。
那么第二种呢是你在运行环境之中,你有一个程序跑着跑着,他跑的越来越慢,或者产生卡顿好这样的情况,你怎么定位它,问题出在哪,问题你到底出在哪,以及我怎么对它进行调用调制,第二。
那么第三种也是在面试中问的最多的是这种,第三种就是说这三个运行中出现的各种问题,最常见的问题叫om叫out of mary error,o o m叫out of memory,内存耗尽,嗯时间关系呢。
我要教大家调优的话得得从哪开始玩啊,得从最基本的开始玩好吧,我先教大家呢最基本的你怎么样,就是使用命令行啊,认识一下最基本的命令行好吧,k。

在linux上啊,你说你在windows上进行了调优,会让别人笑掉大牙,我有过jpm调优经验。

是在我们的windows一台服务器上,面试官一个大嘴巴子抽上来,滚出门,右转啊,肯定是不对的,好我先教大家一些最基本的一些呃java命令呃,第一个java命令呢,启虚拟机观察它的参数啊。
jumon version,这是它的参数是吧,clear是吧,没调音,你敢写吗。

当然敢写了,老师是谁,老师这么贴心的人,没调音经验,我帮你总结了12345678 90 11。

20 30 45,其实已经20多个案例了,你只要挑个案例哎。

就说实际当中是这么遇到过的,不就ok了吗,一般gmp导出大哥,你小p公司可以这么干。

你这是要你这是造假呀,我没有造假,是你造假好吗,大哥,我啥时候造假了,我给你讲课而已。

看这里啊,那个先叫大家一点,最基本的这个这个这个嗯,最基本的这些个命令行啊,该怎么操作,大家听我说啊,假如我们要起个jv拟机的话,你直接敲java就可以对吧。

然后你敲到jv后呢,你会看到呃参数呢是进行各种各样的分类的。

这个参数是什么样的呢,比如说以横杠开头的,这个大家都应该都遇到过什么杠cp啊,杠version啊,更roversion啊等等等,这些个都叫做标准参数,叫做标准参数。
叫standard and option,好看,这里比方说你经常使用的java version。

他就会把你嗯版本号给你给显示出来,那当然这其中有一项比较特殊的,这个叫非标参数,看到了吗,叫print help on non standard,非标options,非标参数,java杠x。

还有这叫非标参数,非标参数有这么多,我在vip里讲过,像什么mix啊,呃interpreter啊等等,像还有像比较常用的有一些啊,比如说log gc啊,这个这个是你在生产环境里头必须要配的。
xm s最小堆,xm x最大堆栈大小xx啊等等,但其实你看上去参数没那么多,但其实参数最多的是他没有写出来的这个,我在最开始的时候不是给大家讲过这个杠,xx什么print。
princeline flags等等这个参数吧,呃这里面参数非常多啊,而且呢没有一个特别详细的文档,如果你要看到杠x x开头的所有的参数,你采用这样的一个方案。
叫做当xx加print flag final,当然其实还有一些,像那个你如果要自己编译一个java虚拟机的话,我们黄老师不给大家讲那个hosport的源码吗,他需要编译一个这个虚拟机。
这里面还有一些参数,可以说布莱克呢这个有点就有点太那啥了啊,太细了,我们先不管他老板说这是什么意思呢,它会把这个所有的参数,杠xx开头的全都给你列出来,最终的值全给你列出来,数量非常多。
比方说这是a开头的,alliance level,alliance lecture啊,always prettouch等等一堆,像b开头的也是一堆是吧,best locking,这叫偏向锁吗。
我讲所升级的时候讲过这个概念,嗯这是那个对输出的,我的j j m的那个version的感觉啊,这不管继续啊,cc开头的cm看到了吗,这是和cm相关的,有可能你需要设置的这些个参数,cm参数相当多啊。
cm s的,cm s的。

谁来了谁来了啊,ok结束了嗯。

呃一共大概呃700 700个左右。

大概700个左右的参数,所以你们现在是不是理解了,那个jvm调优为什么值钱了,就是你你你只要在你的简历上写,说我有过jvm调优经验,ok面试官马上高看你一眼,ok当然真的有700个参数需要设置吗,no。
你只需要掌握老师给你列举的,jc的常用参数就可以了,比如说不管什么gc你都可以设这些,就是打开不打开t r a b啊等等,它的大小怎么打开dc dc的一些详细的内容等等。
而如果你用parallel常用的参数有哪些,如果你用cms常用的参数有哪些,如果你用g one常用的参数有哪些啊,当然cdc呢大家伙现在用的还非常少,所以现在没给大家总结出来好吧,所以没关系啊。
虽然你看上去很恐怖。

不过老师你总结完你就没那么多恐怖的地儿了。

好吧。

好,这个文档会发吗,会会会会,明天明天啊,明天发到每个人手里好不好,参数就别讲了吧,对不讲了,参数我要讲起来的话,每个参数都给你讲一遍,没完了啊,也没意思好吧,骗人看完更加恐怖了。
参数那个那个有好多常用的,你你想着有那么一参数,知道去哪查就完了好吧嗯,十,老师其实今天晚上来的可能是已经报名了个vip,因为今天晚上周日请假了,what招式跟跟谁也想家了,下面我们来举例子啊。
根据一个实例,然后来聊一聊真正的这种,在实际当中遇到问题之后,你怎么去定位啊,比如说面试官最喜欢最常用的说呃,我的cpu如果是百分百,这个时候你怎么去定位呃,我频繁f g c3 秒一次啊,你怎么去定位。
是不是嗯,那这时候怎么办呢,先教大家几个最基本的好不好,几个最基本的命令,比如说我们要起一个程序的时候,看这里。

在我程序里头呢给了一个小小的案例啊,这个案例呢是有bug的,但是我不知道你bug在哪,就这个小程序。


我们跑一下内存设的稍微小一点点啊,20兆不知道哦,我们来看这个参数,大家能不能看懂啊,java启动一个java程序,这个程序是这个程序呃,fdc problem,那然后呢最小堆设最小堆是20。
最大对是20来,同学们告诉我,为什么我把最小堆和最大堆设成一样,一般来说这是我们整个的内存呃,我如果想jvm让他用最大用到这,但是我可以比较开始的时候,我让他只用这么一点,不够使了再扩大。
不够使了再扩大,为什么我在这里我会把最大最小生成一样,为什么y,防止抖动没错,我有一个学生,我看还能找出他聊天记录吗,这聊天记录啊,忘了是qq上还是还是还是微信上了。
他就说老师我那个是我我们那个服务器啊,就特别搞笑,我说怎么搞笑了,他有的时候是只有只占1g内存的时候,它就产生了负dc,有的时候是2g会产生负率c,而且还特别有规律,只要占到3g马上就回到1g。
查了两天没查出来,我说大哥你你查一下你这个xm x跟x mx的值,他发现x m x一级x mx 3 g好吧,知道问题之所在了吗,它会弹来弹去弹来弹去抖动,就是如果他一级不够使了,它会往上弹,弹到两级。
两级不够使了,弹弹到3g有一些时间它是需要花在扩容上的,而且3g完了之后,整个内存清掉了之后,遗迹又够使了,他不是他又回到一级,他又往回缩,所以呢在你一个应用程序里头。
如果你确定我的java程序它占有非常主导的位置,他确定这些内存都给他使,那你就不要让它抖动,最大最小射程一样的,不要让cpu宝贵的资源浪费在这些地方,好你不知道我说清楚没有谈就谈呗,有啥影响。
浪费资源啊,你本来宝贵的资源,你不应该给客户服务吗,大帅说声音有点小,鲁尼大帅,你确定不是你功放放的声音有点小,好嘞好嘞好嘞好嘞,ok,呃这个程序呢你跑它就会运行,print c呢是打印一些gc的信息。
由于大家伙基础的关系啊,这个jc的那个日志什么的,我就暂时先给你略过,因为细节太多了,嗯在讲的时候我讲到了会会讲给你听好,你可以看到这个小程序会有一些毛病好吧,小程序会有毛病,读一下看能不能读懂。
它会不断的产生dc,那么这个小程序我们怎么去定位这个小程序呢,我我里边这么多java程序,我这个程序是哪个呢,我怎么找到它呢,叫一些常见的命令,第一个呢叫gps,gps,叫java process。
就是我当前整个系统里头跑着的,那些个java的进程号,1246,这就是我们那个正进程,第二个命令呢叫j inf 1246,这info的意思就是1246,这个进程关于java的一些信息,你打印出来。
他会帮你,你自己去读就行了啊,自己做个实验去读一读,他会帮你你当前的这个java程序呃。

运行的一些个参数,一些默认的一些属性全新打印出来嗯,你的java home用的是哪个啊,你要是不知道你跑的是哪个哪个版本,java程序是在哪哪地方装着的,真infer就可以了,还有一些个呢,你比方说。
这次内杠gc 5或者1246,这是啥意思呢,它会把整个gc的内存空间的部分的内容。

给你打印出来,当然这个看上去就非常的别扭,什么是ec eu啊等等等等等,这个看上去是非常非常的不不友好,呃,明天吧明天我教大家比较友好的好吧,比较友好的观察内存的方法,嗯比如说呢还有一些常见的命令。
jdk,jdk是什么意思啊,1246回车它能关成什么,jdg clear一下。

jdk能关成什么,jdk能观察你1246,这个进程里头有哪些个线程,每个线程的状态是什么,你看这里面有线程池,这个线程车状态是waiting,waiting on condition,什么意思。
正在等待吗,嗯还有一些这是这是waiting,还有一个呢,像这个demon现场,他是rino,等等,他会把里面那些线程全给你列出来,呃java还有一些常见的命令啊,还有一些找你的命令嗯。
这样我们明天再聊吧,好吧嗯,呃作为作为java来说呢,它还有一些那种常见的图形化的界面,呃我希望大家今天呢你大概听完之后呢,首先自己上手去玩一玩好吧,图形化的界面呢是java自带的啊,嗯大家找一下。
有人拿windows来说,你装完了java之后,program files知道这里可在他的binary里面,你会找到一个图形界面的东西,就是这个啊,这visual vm图形界面东西非常多。
有jconsole啊,这个是j visual vm是java自带的,呃,这个java自带的这种工具呢,呃你可以比方说你你你你你的你的你的你的,你的你的本地啊,你的windows本地它有一些个进程。
你可以通过它来观察这些竞争的情况,观察这些技能情况,这些技能呢有哪些个线程是吧,这就是不同的线程啊,还有呢你可以监视它它的内存使用情况,是不是在逐渐放大呀等等,好这些都是图形界面,我呢明天呢会教大家。

我会手把手的教大家,在你的实战的线上应该是怎么去定位这种问题,这种问题的定位呢嗯需要你准备内容比较多,我明天再讲好吧,怎么去定位这种问题,那么今天呢我留一个作业啊,线上问题,定位,能不能。
用图形界面工具,可以吗,可以不可以对嗯,嗯有的时候能,有的时候不能啊,这个没关系,我们留了一个思考题,好吧,呃稍微回顾一下今天的内容啊,今天由于多讲了一些理论,所以实战的东西我们放在明天。
也让它存在一些完整性,可,那么这个我们稍微回顾一下今天讲的内容,今天呢我们讲了这些个概念,讲了一些gc的基础知识。

什么是垃圾啊,你脑子里跟跟跟着我一块儿动就行了,我们不不看那个什么了啊,跟着我一块动,回想一下我们今天讲的什么,什么是垃圾,想一下脑子里闭上眼睛小,什么垃圾,脑子里浮现一幅图,有一个对象孤零零的跑在那。
没有任何应用指向它,那就是垃圾怎么定位,一个垃圾怎么定位,想一下脑子里闭上眼睛小,两种方式,第一种叫reference country,记了个数有多少个应用指向它,差一个减一差一个减一减到零就是垃圾了。
这种的不能解决循环循环引用的问题,第二第二种方式叫什么,如certain,这是hosport所采用的根可达算法,怎么去回收这个了,第三种算法mark sweep,标记清除,还有呢拷贝,还有呢标记压缩。
market connect,根据这三种算法,然后呃jdk呢产生了各种各样的垃圾回收器,垃圾回收器有六种是分带的,g one其实是逻辑分带物理部分带,然后这六种什么样的一个组合,回想一下serial。
但单线程的年轻的老年代,多线程的年轻的老年代,多线程的年轻代,外加c m c m s特点是什么,回想一下c m s的特点就是并发执行,并发执行会产生什么问题,好好回想会产生漏标错标。
好产生这个问题之后是怎么解决的,cmc解决方案叫incremental update,把那个地儿,把那黑的变成灰的,脑子里那个图,但是他有bug有毛病,具体的详细的细节,这个地你可以忽略。
没有面试官问这么细的,今天应该没有面试官吧,谁要问这种问题,太无聊了啊,没意思,今天有有面试官在吗,嗯流行对,不要玩这个啊,没没没没没什么意思,总而言之,你知道c m s有毛病,有bug就行了。
但是他承上启下,他是一个一个一个继往开来,承上启下,后浪拍死前浪的这么一个拦截,v6 起由他开始了,他开始了对于并发标记的探索,gone相对就好很多,那么g one采用的解决方案叫s a t b。
它是配合g one的remember set来使用的,那当然z dc更牛逼一些,z dc连car table也没有了,这里三连呃,所谓逻辑上的分区也没有了好吧,所以cdc的比这个要要要要牛很多。
嗯将来我相信cdc应该在java里面会占主导地位,好吧,然后呢我讲了一点点的实战,这实战呢就是说你什么什么什么叫调用,你现在要理解一种叫预估,一种叫调那个曼卡顿,还有一种叫做出问题之后怎么定位。
这是面试的重灾区,出问题怎么定位这块呢,呃教了大家一点点,java的这种调参数的,基本的一些个小小小小问题啊,这小蚊子老师会嗡嗡嗡嗡嗡嗡嗡去,太讨厌了,那么这个包括什么呢,包括呃什么叫做标准参数。
横杠开头的,什么叫做非标杠x,什么叫做那种不稳定参数,杠x x特别多,但是我不需要你背过它,你只需要记住老师给你讲的这几个就ok了啊,哎呀这是今天我们讲的最主要的内容。
那有同学会说老师你列举你练的那个小程序,他真的会有毛病吗,嗯我在列的过程之中呢,你也看到了,你看啊,给大家复习的过程,其实就在等他出问题来,仔细看他出的问题,看能不能看,看得懂频繁f d c吗。
关键这哥们频繁f d c吧,他还不他还不o m我告诉你啊,这个小猛这个小程序是非常典型的,这个小程序呢呃有的时候会产生o o m,有的时候呢会产生负g c就频繁的f g c。
所以明天我来教大家怎么定位这种问题,这种问题一旦出现了之后,采用什么样的方式去给他揪出来,咱们,金针菇,see you tomorrow,今天就到这里,可以吧,嗯看看有没有同学有疑问的地方啊。
今天没广告,你想听,你想听广告,听广告,找我们报课程啊,我们课程还是很牛逼的,这广告我我我有时候也懒得讲啊,啊做个广告吧,我觉得是做广告最牛的是看效果吧,这这哎我这个这个漏漏了名字了啊。
这是我今天刚刚收到的,我其实最喜欢听到的就是这样的消息啊,老师我有两个offer是吧,老师你能不能帮我挑一个嗯,微盟20k 13薪,每个月补600,游走网络,17k 14薪也不600。
有的有大学同学在啊,原来工资是那个9000,看完六加明哥的小游戏就出去面试了,原来挺没底气的,现在除非是被面试官刁难,二线公司基本没问题,六是啥意思呢,这个六呢其实就包括了,我今天给大家聊到的jvm。
六呢是我们讲的一些,2019年面试的最频繁的课程,那就是设计模式,多线程,jvm,redis,zookeeper,mysql调优,他其实看的也还不多,嗯基本上扣完6万险公司就可以平仓了,好吧嗯。
讲讲行业大背景,这广告太秀了,这广告现实了,因为刚刚跟我说的这广告可以吧,呵9000直接就可以这么猛,咋了不行啊,9000直接20k这么猛的原因,你知道是啥吗,就是因为你简历你敢写上精通jvm调优。
放心听完我课,你就可以写,30岁没睡着了,曹老师31岁还是32岁才进的阿里啊,大哥别别那么小的,30岁没事成,30岁你还小年轻呢,30岁我记得我刚创业嗯,有的是市场默认c m s。
老年代能多少进行folic,应该是70%吧,如果没记错的话,你查一下啊,这值不是70%,就是90%,因为他前后调过了,调过200,但是你肯定不建议,90%到90%的时候,你卡顿就基本上逃脱不了了。
那个叫破蚊子,jc root包括哪些,看了好多都看不太懂,这个这些root我刚才不是说过了吗,你的main线程的线程站里,你的那个native,你你如果用到了那个native。
你才你你你你程序都要调成g ni的,对不对,native的线程代理的对象,你的那个常量池里面的那些静态静态的那些呃,那那些对象呃,呃你的比如说你漏漏进来那些class对象,那些都是那些个都是root啊。
ji是什么,ji是javative interface,今晚报名还有优惠吗,我们618的活动已经开始了,老师给个课件,明天一块给好吧,cfs初始标记完了之后,能单买你的课吗,不行这个温老师很牛逼的。
你那个光光买我的,可其实有好多比真的比我牛逼啊,我们,有这么跟你说吧,嗯p6 给你讲的课,p7 给你讲的课,p8 给你讲的课,课程里全有,而且老师的p6 p7 。
p班的老师都是可以知道花名去阿里随便查的,那都不是假的,不是虚的嗯,cpu百分百怎么定位来着,首先cpu不可能到百分百,首先cpu不可能到百分百,其次cpu百分百的定位主要是在。
你怎么揪出来哪个线程消耗的最多,p6 也能讲科德隆p6 的了,p6 是干活的一线的,知道吗,p8 是那个做指挥的,他讲的东西他比较虚,你先到p6 水平再说,你到得了吗,一般都是死循环啊。
上个礼拜cpu 300%的,你要这么抬杠,我也没磨,也没脾气啊,你四个cpu有可能是300%啊,但是你平均到每个cpu 75%吗,北京有新病例了,你说的太对了,你真是哪壶不开提哪壶啊,p6 干活。
p7 管理,p8 管理,p7 干啥。
系列 6:P60:【2023】简历写的很完美但是都不会怎么办? - 马士兵学堂 - BV1RY4y1Q7DL
当然我讲到这里呢,一定有同学跟我抬杠说,老师啊,那里边写我,我我可以网上写啊,但是我好东西我连听都没听说过,我连会都不带会的,有没有这样的同学,可以写它不会,是不是说我可以往上写啊。
人家那个小姐姐要的111米83的啊,我实际上是身高一米六三,我就写1米八三十一去不就露馅了吗,我可以写,但不会,我该怎么办好,各位同学,当你是实际1米63,人家要1米83的,你这时候怎么办,玩命增高。
赶紧吃药,短期之内能让自己长多高,就就就就就长多高,能听懂吗,这就叫突击吗,突击是干嘛,哎就是干这事的,改简历这件事情是一个很科学的工作啊,他并不是说你随便找一份模板拷贝拷贝,你就能拿到很好的效果,呃。
同学问你们平时啊写个作文,写个报告嗯,写写写做个毕设都特别花心思呃,我实在搞不懂你们为什么写简历的时候,就特别不花心思,一点心思,萝卜花拿一份模板过来啊,哥们儿,你怎么写的,来,拿过来之后我改不改吧。
拷贝拷贝我就往外扔,你要注意的是呢,你什么考的试呃,通过个四级,这个只是在你人生中一个小小的节点,你去找工作,这件事情是影响你后半辈子的最重要的一件事,他比什么你的事业呀,相比于什么你你的爱情。
你的感情生活那要重要的多得多,你这个时候反而应该是要花大心思的,我们的老师改一份简历来来回回呃,多的时候三天拿过来,改完打回去重新改,打回去重新改,就是我们改完简历的效果,也给大家瞅一眼好不好。
这是简历指导指导之后啊,多个offer涨薪百分之二三十,简历指导两家,简历指导比特大陆币圈的是吧,嗯嗯有一些最夸张的呢。

就是老师帮你改完简历之后,你原来没有面试机会。

就是改完就一堆,改完就一堆啊,为什么,其实很简单。

因为比较了解企业到底需要啥,而你呢从来没有认真想过这件事,哪怕你就听我的,认认真真去阅读人家的这个诉求,当你阅读阅读完这个诉求之后,你改完这个简历,你会发现你和原来不一样啊,所以对着镜。
这一定要重视好吧,我今天ok这点能做到你的啊,嗯对这件事情一定要重视那个,但是呢有好多同学说我可以写,但是我不会好听,听我说这件事是对的,你写简历一定不能只写会的,就是说我1米63,我就真写过1米63。
有的人心虚,我还写一,六零啊,声音这么晚呢,一定要写那些不会的,没有人天生就会,任何的东西都是后面慢慢学会的,我今天不会,明天可以会好,哪怕我三天之后去面试,我今天写的任何东西,我写上去说高并发。
我不会,我恶补三天,hello,hello,又卡了吗,hello,还好吗,可以吗,喂喂,现在又可以了是吧,就是突然之间来了一下啊,没有路由器被黑,就是那个最近这个这边的网络确实有点问题啊。
ok ok那我们继续啊,呃我再重复一遍,并没有同学没有听到,我再说一遍,就是说你一定要写,你不会的,因为你一定要理解,就是知识这个东西是一个动态的概念,你不要认为说我今天写上去的东西,我我不会。
明天还是不会,千万不要这么认为,所以什么叫突击突击,好注意这两个词啊,这个词儿叫增加概率呃,我就问大家一个问题啊,今天呢你就是比方说你对病发什么都不了解,多线程一点都不懂,然后呢你就写我是精通高并发。
精通多线程是吧,然后我写进去啊,我精通那个分布式高并发海啊,我精通那个各种各样的缓存,分布式缓存等等,我全我全了解,但实际上你一点都不会,那么你这时候该怎么办,怎么突击啊,我觉得最简单最简单的办法。
你哪怕只是认认真真的去听一个小知识点,是不是你被问到的概率也很高,他非常有可能问会问到你的呀,你刚复习这个说我我spring源码我从来没读过,但是没关系啊,我听了一个呃,连老师讲的一个小节啊。
他讲了怎么解决循环依赖的问题,对不对,源码里面怎么解决循环依赖的啊,我别的我都我都我都我都不知道,但是我写了我精通spring源码,ok,那么是不是他就非常有可能有有有这种可能性。
他会问到他问到你不就有可能通过的概率吗,能理解了,他是一个概率问题,我再说一遍,不要老追求那种百分百确定再去干一件事,那样的话好多机会全没了,好我教大家一些突击的技巧,各位同学们呃。
怎么样增加一些突击的技巧,简单说怎么快速的进行学习,说白了也是用快速的进行学习啊,啊我给你举个简单例子,假设你现在只会单机,从来没玩过分布式,从来没玩过微服务,然后呢也不知道那些什么。
前面大并发量来了之后,我该怎么处理,后面数据量大了,我该怎么处理啊,但是我要去面架构,是我写上去了,好我这时候该怎么办,同学们呃,我以前待过的同学十天,他原来只会html cs s。
这是一个极限的案例啊,是我的一小亲戚啊,所以我我我我我叫他爸爸,他用十天的时间,把从那个零基本上算是从零基础,然后去入行,十天入行可以吧,好了,我教你,我教你该怎么办,同学们,你们学东西的时候呢。
有两种学习方式啊,就是第一种呢叫做,游戏导出,哈哈这是我们日常最喜欢的学习方式啊,我们我们回想一下,我们学从小学到大学,我们是不是一个一个小小的知识点啊,我们都搞的特别的透彻啊,二元一次方程。
三次方程啊,各种解法,它的原理是什么,搞得特别透彻,然后搞完了之后呢,我们只是为了应付考试,我们从来没想过这东西可以用来干什么,这个东西就相当于什么呢,就相当于我要去造一辆车,但是我上来按照我先去学。
这个车的每一个小零件,它是干嘛使的啊,这个小螺丝它长什么样,它这个角度是多少啊,他这个这个齿轮啊,它的有多少个齿,弧度是多少等等,ok先去学这个怎么去造,它的应力是怎么样,然后呢我学这个齿轮的时候。
我也不知道那个车长什么样,我从来没想过我们从小就这么学的好,这种方式是一种学习方式,那么第二种学习方式呢是我推荐的是由粗到细,反过来,这是效率非常高的,你们可以想象一下,我真正的去了解一辆车。
说我将来的目标我就会造一辆车,我造一辆车的时候,我会不会正常人会不会上来是先去玩齿轮去,不会的,你知道吗,他一定上来先去开这个车,先学会怎么用,对不对,然后这车比较熟了,开的就比较熟了啊,我也知道。
反正一挂档这块就动了,然后呢我可以顺着某一条线去去研究车,哎,为什么我这档把一动下面有一道东西,最近到底哪动了,我顺着这条线研究下去,我就会突然间发现哦,这就是传动系统啊,车身系统,底盘系统,发动机。
我先把大块的了解了之后,再去了解系的,各位能听懂吗,兄弟们,这种方式和这种方式的对比,我们来对比一下,就第一种方式叫做扎实,知道吧,这种的最好的方最好最好的,它的好处就在于扎实,就是你一定是。
你要真是每一个零件都学得特别到位,然后最后组成一辆车,那你一定是扎扎实实的,你什么都懂,但是它的坏处就在于太慢慢,如果你的时间足够,我推荐你可以考虑用这种,没有问题,你时间够吗,反正有的是时间浪费啊。
没有关系,我就慢慢学,我学3年,我必须每一个我学到dos的时候,我一个命令一个命令我全都全都搞定,我linux把所有命令全搞定了,然后我再慢慢往上学,同学们这种人呢就是有扎实慢还累。
就是你们平时自我感觉还挺良好呃,每天拿出一个朋友圈了,然后读一个知识点啊,感觉我今天又学了一些东西,全是碎片化的,但是我推荐大家反过来学这个效率高,效果还好,好不好,反过来学怎么学啊,先了解整车。
再了解零件怎么去做项目驱动,先去了解整个项目,再看项目包含哪些东西,然后再去了解这些东西的细节,什么意思,我刚才还刚才那个例子说我写了很多分布式的,什么微服务的,写了一堆,但是呢我从来都不会怎么办。
找一个教学项目,举个例子吧,就是我们自己的一些项目呃,这个呢是教大家怎么做。

根本架构师的,课程呢就是这个这个看上去像一个那个。

看着像一个商城啊,但是它实际上呢嗯最主要的呢,它的目标是教大家怎么做后端架构的,就是你看上去前面前端网页没有那么复杂,但是实际上它的后端比较复杂,包括了运营,包括了用户开发运维管理,后台客户端运维平台。
监控平台,网关微服务基础,中台服务的治理,基础的组件系列的核心技术啊,呃当然这个是给那个你年薪比较高的人用的啊,他还包括了怎么去带团队,怎么去做ui啊,怎么去做测试,怎么去做运维,怎么去做中台。
怎么去做大数据,怎么去做ai的推荐等等,系列化的东西呃,这个东西呢呃目前是咱们优先推荐的项目,就这个项目呢,你如果在有一定的初步的基础的情况下啊,这是我们投入的人,大概前前后后投入二三十个的开发人员。
就是一个教学项目啊,怎么说呢,我讲到这儿你就多说两句,就是有好多那个机构讲说我我我我教你啊,我一个人就能教你,怎么从头到尾的独立完成项目呃,其实在实际工作中独立完成项目都是扯淡的,其实独立完成性。
所谓的独立完成项目都是独立完成某个模块啊,而且是别人帮你前面做好了各种的分析铺垫,之后,你去独立完成某个模块,实际当中都是大家好互相配合的,所以呢就是完整的模拟了,我们实际在一个大的项目组里头。
二三十个人的一个项目组去完成,整个一个的项目怎么去做的,采用了哪些个架构的东西,呃也许你没有了解过啊,你说我我只了解了那个sm这些东西,我没有了解过,但是没有关系,你呢应该怎么去做。
应该先去囫囵吞枣的把咱们的项目课先听完。

就那以这个项目来举例子,你就囫囵吞枣先听完,你听完之后呢,我跟我跟你讲,你不要去钻研那些细节,你一定给我放过那些细节,你去钻研那些细节,是你最累最苦,而且效果还不好,你不是有毛病吗。
先去享受整个学习的项目和过程。

当你了解了这个之后,其实你会慢慢的呢,大致理解这个架构都长什么样哦,你会知道原来底下有存储,有一些基础的组件,有做存储,有所缓存的,有做消息中间件的啊,有做那个对对象存储的,有短信的,有有搜索的是吧。
有那个日志的,ok你至少了解了这些日常我们一个完整项目,它所应用的这些东西,当你大概了解完这个东西之后,你说我这个mq这个redis我不是很熟好,你这个时候呢再去redis,做一些细节上更深入的了解。
叫做先学习整个脉络,一棵树先去了解整个的大体的脉络的走向,再去钻研这个细节,这才符合人性,我派你去了解了解庐山长什么样,你不会上来就去庐山某一棵树底下,去观察那个小蚂蚁窝吧,你不会这样去做,对不对。
你肯定是坐上飞机啊,先了解啊,整个庐山大概长这样,然后再去了解啊,是这个地方有什么,这个地方有个洞啊,这个地方有个什么景观,是不是这样的,同学们,所以先脉络后细节,这样的学习方式符合人性,而且效果最好。
而且效率最高好,下面我来教你,当你去做这种项目,你说我听完了之后,我听得云山雾绕的,确实老师给我讲完了这个东西是怎么拿的,他们互相之间怎么组合在一起的,但是这些细节该挑哪个命令去调哪些参数。
我一个都不知道啊,没有关系,在你去聊架构的时候,很多人也不会跟你聊细节,你是不是大概能把这个东西你背一遍,能说出来了吧,大体能说出来通过的概率是不是加大了一些,来这块能听明白了,老师扣一大概的啊。
因为我这个一个公开课呢,其实我们我们讲面试这部分,大概讲那个6~8个小时左右,一个公开课呢,我也不可能把所有的细节全讲给大家听啊,我把最重要的讲给大家听好吧,这块一定要理解到位啊,就是先粗后细。
你给我放过那些细节,下面我教大家怎么突击,突击的最好的办法,我教你一个,我给你举个例子,教你一个最简单最简单的办法说我不会分布式,我从来没有玩过微服务,我只会玩r i s s m。
我不会玩spring cloud,spring cloud,八个组件,我一个都没听说过,那么我这时候该怎么办,认真听我讲,很简单,上来二话不说,先把我们教大家的项目囫囵吞枣先给我听一遍。
听完了之后你一定知道哦,原来一个微服务是大概有哪些个组件构成,这个你应该有有有有有有这个信心,你大完整听完一遍,你会知道啊,原来有网关,原来有负载均衡,ok原来有方方面面的各种各样的组件。
它们组合在一起的时候,会构成一个各种各样的微服,好吧,这个你大概知道了,就然后这个大概要花多长时间呢,其实我告诉你快速过一遍,大概也就花几个小时左右,你就大概知道八个组件的名字,我起码背下来了。
你千万不要去干一件事儿,就是你想快速突击,就一定不要去干什么呢,不要去调bug,不要去操作,你一定不要去操作,同学们,你们思考一下,你们平时学习也好,工作也好,最花时间的在什么地方,是不是我开始以操作。
有一个地儿怎么调bug,调了半天总也调不过去,做个配置,看着别人配置的队伍,我一配置总是通不了,一卡卡好几个小时都是少的,最多的时候可以卡,一星期几天有没有遇到过,来遇到过来让我扣个一,就是在你学习。
如果你想快就不要操作,fin的日志配置给我卡懵逼了对啊,所以你们学习的学习细节的时候,我告诉你最花时间的点在哪里,就在于这些地方,如果我们把这些地方略过略过去,我们时间就完全省出来了。
我就粗略的看我不我不操作,你卡不住我了,对不对,好不要操作,当你不要操作的时候,你的时间可以省的非常非常的多,ok那有同学说了,老师我不要操作,我会不会啊,听我说,我现在教你的,首先第一个是你写完简历。
投简历面试谁能过,你们面试过了,应该有多少,面试是要求你现场给我去做个配置,你刚才那哥们说了,说fa配置给我卡,懵逼了,有多少面试要求你现场给我做一个fin的配置,有没有没有100家里头就一点都没有。
我可以这么说,我从来没有遇到过有上机面试,对上机面试,但是也并不是绝大多数,还是那话是概率问题,你不要老想着去覆盖所有的概率算法题,我一会单独讲好不好,没事啊,算法题我一会单独讲,那是比较特殊的。
你们去面面十家里头就一两家要求你干这个,小心操作,所以大多数人呢其实过来之后,就是问做过什么项目,没有厦门遇见过什么痛点,难点没有啊,你们这块是怎么解决,那块怎么解决的,问你个知识点,那个循环依赖你了。
不了解有没有听说我看你写了spring源码,你那你给我讲讲什么,原你读的印象最深的是什么,是不是啊,兄弟们,呃我们先讲楚苏的问题,再讲特殊的问题,待会儿对于大厂了,对于算法了没有关系。
如果你要追求那些个特例,那就没边没沿了,好不好好听我说,当你在不要操作的时候,原来需要十个小时能学完的东西,你一个小时差不多就能搞定,你不信你试试看哈,他不卡你了,对不对,那么然后去干一件什么事儿呢。
背常见面试题,比方说啊我就写了,我会微服务,但是我从来没用过,然后我今天一晚上我突击了一下,花了六个小时,我大概了解了啊,呃八个组件大概怎么配合使用的,然后三天之后我去练,但是他一定会问我一些细节啊。
他会问我有可能问我问我分怎么配置,他不会要求我怎么配,但是它怎么配呀,嗯有有哪些个策略,对不对,然后网关常见的有哪些啊,有哪些个配置的策略等等,他可能会问这些问题,那么这时候该怎么办,被常见面试题。
没想到吧,没想到这个背会居然会出现在找工作的里面,好多同学说找工作要真才实学,是真才实学,适合于这种时间充裕的,不适合于你找了半天都没找着,时间都没找着工作,然后都跟那都都自己都快抑郁了。
还搁那想着说我从细到粗,慢慢慢慢搞呢,背常见面试题,这个你不知道常见面试题是什么,找我们啊,这我老老老师们呢。

像这种突击的问题,早就帮你们搞定了,不知道。

多少遍了好吧。

就是我们突击整个突击班的这个课程啊,不知道都都上过多少遍了,哪个方向上啊,这是咱们教务师的课,教师课堂大概有200多门课,这是我给你举几个例子就行了,你看这种突突突击。
其实呢你要真是说我三天之后就要找工作了,我该怎么办,那搞突击就可以了呀,突击该怎么突啊,首先教你怎么去聊软技能,有没有聊过说hr问你为什么离职,上家单位太恶心了,我不想呆了,对不对,商家单位给钱太少了。
这都不是理由,大概有70个关于hr可能会问你的问题怎么办,没事老师会告诉你你该怎么办,该怎么回答啊,等等你自己去看就行了啊,然后简历该怎么写项目别人问你的时候,你该怎么去做,关于背调该怎么办。
没有高并发的经营项目经验该怎么办,基础的面试常问哪些,然后多线程的常问哪些jvm常问哪些好了,每一个方面啊背一遍好吧,一面可能完整的背不下来,背出1/10了,还是那句话,概率问题是不是有一定的概率了。
对不对,好理解了这件事之后呢,其实就是增加概率啊,还是那句话,就是增加概率,你不要想短期内去替代了人家那个,好几十年的努力啊,好几年的努力,这不太可能,但是呢你一定短期临阵磨枪不快。
也光一定会增加你的概率啊,记住这个词,那好当我呃聊了这件事之后,你们认真思考这个过程,说我第一家啊,由于我背题,我背的还不多呢啊,时间太紧了,我去了之后,他问了我很多不知道的,没有关系。
回来之后哪道题不会问老师,中间哪没回答好,偷偷摸摸录下音,来让老师来帮你听一遍,帮你听完,这叫做面试的陪跑啊,当你听完下次就不要犯重复的错误就可以了,五天之后又一个面试又增加了两天,继续背。
七天之后又一个面试又增加两天,继续背,后面的概率会不会越来越高,我们比较那个差的学生呢,大概20多家吧,才成一点,但是你要知道他可是没那么扎实,他学的时间可没有那么长,它很短,它就搞定了。
好我说的我十天的那个亲戚,刚开始别人问最初级的问题都不会,后面就慢慢背嘛,然后大概灭了17 八家左右就成了o背嘛,对不对,你就注意你不要去操作,你是速度是不是就快了,这块听明白的,给老师扣个一。
当然我讲到这里,马上就会有人问我下一个问题,老师我又不会操作,我去了之后会不会露馅啊,是不是你们一定会问吗,一到任务我是不是就尴尬了,我是不是就傻了,好你们好吧,你们你们老聊这个算法问题行。
我专门专门跟你聊一下算法问题,就是突击这件事是可以进进企业的,你一定要了解这一点啊,这也是咱们面试突击课的指导,面试突击课程简历指导,成功跳槽,涨薪还涨,做了好长时间了,也,这是这是突击,这。
像这种的啊,面试突击一个月,k 16~23,这是连老师在群里头给他透彻的指导的,整个过程,面试的陪跑吗,你说你哪道题没没没打好,没关系啊,你录下音来,老师给你听一下,告诉你下一次该怎么回答。
ok突击一个月搞定工作,突击半个月好吧,这都是突击。

系列 6:P61:Spring IOC容器的核心实现原理 - 马士兵学堂 - BV1RY4y1Q7DL
谁来告诉我spring到底是什么,谁来告诉我spring到底是什么,当然有很多同学会给出一些描述啊,比如说老师,首先第一点他是个框架啊,还有人说春天的好吧,第二点它是个什么容器吧。
我们一般都说spring容器对不对,第三个我希望大家能明确一点,什么叫生态,这是我给的一个知识,什么意思,因为你们现在在基本的呃工作中,要不然用spring,要不然用spring boot。
要不然用spring cloud,基本上都是spring这个全家桶里面的一体机东西,而这些东西里面spring就是最基本和最根本的基石,你把这块了解清楚了才可以,而在现在主流面试的时候。
他上来之后不会问你一些定向的问题,而问你一些什么,谈一下你对spring的理解,或者他一下你对病的理解,他一下你对病生命周期的理解,基本上是以这样的一个方式来问问题的,那遇到这样的一些理解性的问题。
或者说非常宽泛的问题的时候,我们到底应该如何去进行回答呢,谁能告诉我,如果一问到spring,你现在还是只说说一个ioc,说一个a op,我告诉大家,你别说了,这俩东西单打的话肯定是不够的。
肯定是不够的,你需要把里面的一些细节点都达清楚,把里面的每一个环节能知道能出多少,出多少,把这东西一定要完整进行一个转换,那怎么来聊呢,还是一样,spring我们用起来非常简单,为什么简单。
谁能告诉我最核心的点在于,spring帮我们把我们呃应用程序里面所需要的这些,并对象是帮我们管理起来了,而在进行管理的时候,首先它是个什么,是个容器吧,最后这先画一个大格子,它是一个容器。
容器的话是什么意思,里面应该是放东西的,比如说在程序里面放的是一个一个的并对象,对吧,一堆并对象你想放多少个,放多少个,当你了解到这个环节的时候,还不够还不够,还需要具备很多的知识,具备啥,你想嘛。
spring帮我们来管理人管管理并对象,那spring是怎么知道这些并对象是哪些呢,或者说我应该创建哪些基本的并对象呢,他怎么理解这件事情的啊,比如说反射,反射是创建对象的一种方式,战死的时候根据类型。
根据注解,其实这个时候我希望同学们在看源码的时候,先以应用入手,你把应用的点理解透了之后再说什么,这是什么原理,然后下一步再说源码,我们在用的时候怎么用啊,很简单啊,我如果想声明一个对象的话。
我一般会在类上面加一些注解,比如说and control对吧,at service对吧,at component,是不是这样的一些东西,除了这些东西之外,这是我们用注解的方式吧,除了用注解之外。
当然我还可以选择另外一种叫配置文件,那么对吧,当然现在在主流的开发环境里面啊,xml可能几乎已经不用了,我用的已经很少啊,但是我想问一下,插画也好,还是我们这些注解也好,它到底说的是什么东西。
或者说我们为什么要用这么,或者为什么要用注解,它到底代表什么意思,能给我解释一下,这config不就是一些configon吗,配置类吗,好了空白格说了一个非常重要的描述,叫病的描述信息。
也就是说不管我用插板文件的方式,还是我用注解的方式,在这两个里面定义的全部都是什,么叫ban的定义信息,写一下,病的定义信息,所以我希望你能够先把这个东西掌握了,为什么,因为在整个spring源码里面。
还有一个非常重要且核心的一个接口,叫做什么呢,叫做bean definition,是不是玩意儿必须要有这样的东西,它是一个接口好吧,当然接口里面会有一些具体的实现子类子类,我们先不管。
我们先把接口给写出来,那你就要思考过你,你就要想一件事,想什么事情,我用xm 2也好,用注解也好,当我定义好这些病的定义信息之后,我需要干嘛,是不是需要把它交给我们的容器。
容器在识别到这些病单分析肾之后,我才能够根据pdp是里面的一些相关信息,来把我需要的对象给创建出来,是不是这样一个逻辑啊,所以在这块它有一个最基本的环节,从这我写过来,我们的xm文件也好。
还是我们的being definition也好看,最终需要的是什么啊,还是我们注解也好,最终都会转成一个ban definition,而我有了ban definition之后可以干什么事,直接来点。
可以进行实例化操作,比如说或者换句话吗,叫创建,对象这没问题吧,从charm到bedition到创建对象,有人说老师这个插m我怎么解析啊,或者说我的注解我怎么解析啊,有人会吗,天猫怎么解析,谁能告诉我。
如果让你来做这件事情的话,你会怎么做,思考这件事情怎么做,啊咋做,读文献吧,首先我通过io流的方式对吧,把我们这个文件给读取回来,当我读取回来之后,说白了它就是一堆的字符串,字符串存在。
它本身是没意义的,我需要把这个字符串进行一些解析,而解析的时候,xml本身自己是自带格式的吧,是不是合适,所以我可以用一些现成的工具,比如说叫dm和j对吧,比如说s a x这样的方式。
来把我们这些读取到的字符串来转成一系列的,什么叫document对象,当有document对象之后,下一步它就变成了一堆具备父子节点关系的,node节点什么,然后我根据我能够节点循环遍历。
是不能取出里面具体的数据值,当我取到这些具体的数据值之后,是不是可以把我们这些数据值再给到我们的,并在分析成对象中,是这意思,那一样的注解是不是也一样的,注解怎么做。
注解我先获取到某个类上面的一些注解信息,当我有这个信息之后,我获取到对应的class,有了具体的class之后,我是不是就可以进行相关对象的一个创建了,而我这些class信息也好,name属性也好。
value属性也好,我是不是可以直接放到我们的病,该分析是一生里面去,也就是说不管你是xm还是我注解,我只是解析的方式不同而已,但最终殊途同归,都会合并到并单飞你肾中来,这句话能理解。
同学给老师扣一能听懂吗。

这没问题吧,如果你不信的话,我们可以看一些具体的代码,比如说我先找到基本的一个东西叫bean definition。


之前一直也理解不了老师这个病到底是个啥,好吧,你看到了它是一个interface,interface的话里面一定有对应的子类实现,往下找找它对应的属性值,比如说有这种属性叫pair的name。
可以设置父类的名称是吧,叫bin class,设置我们的class呃,那个完全限定名,比如说scope是单例的还是圆形的对吧,比如说late it是不是人家来的,比如depends on。
是不是我需要依赖其他的并对象,我是不是可以把这些属性值全部都设置进去了,当然这些东西是在子类里面进行相关实现了,但是我已经能看到当前接口里面,表示的具体意义了。

好吧,因为你们都写过这些东西啊,有点跟不上了,这就跟不上了,来我写一个,这有啥跟不上的,来写一下,最基本的,就差帽b那个注解,你们应该都会啊,cam可能很多人没写了,我写一个time out好吧。
id等于比如说data source,这玩意应该用的最多的,然后class等于写上com点阿里巴巴第二,有一点错,beta source不就写这样一套东西吗,对吧,当你写完这套东西之后啊,看不到。
能看到吗,刷新一下好吧,刷新一下啊,这真是命运多舛,想上个课就这么难吗,来喜欢一个并对象,然后里面我可以配置一些基本的属性信息,比如property,然后name等于u22 。
value等于dollar,大括号,jdbc打u22 ,然后下面再来一个,grad name等于user name,value等于多少,大括号jd dc。user name,有这样的东西吗。
这不就是我们定义好的一个配置文件吗,对吧,当我定好这些东西之后,我可以经过一系列的解析,把这些具体的属性值全部都放到b,带飞机身里面去,当我放到being,但是历史里面去之后,就意味着。
我已经知道我要创建哪些最基本的对象了,而我有了这些最基本对象之后,是不是可以进行对象创建了,那我问一下对象创建到底应该怎么创建,是用new的方式还是用反射的方式,另外还是反射反射吧。
几乎所有的框架用的都是反射,当然很多同学可能会看到一些帖子的描述,什么呢,说老师反射效率不是很低吗,有这样空过吗,反而效率低啊,为什么还要用反射呢啊,注意了,反射它是足够灵活的啊,足够灵活的好吧。
但是效率低,你注意了,我之前说过一个数量级,我也是从一个铁栏看的,这个没有自己没实际测过,当你创建10万个以上对象的时候,反射才可能会出现性能问题,当你创建少量对象的时候,是不会出现任何性能问题的。
明白这意思了吗,我有什么性能问题,所以大家不需要去考虑这件事情,反射足够灵活,当我获取到一个类的完全限定名的时候,就报名加类名好,回到报名家里面的时候,我就可以根据这个字符串来创建出来。
我们具体的一个对象就很简单啊,所以这是它整体的一个流程,当然如果我直接以这样的方式去创建,我们具体的一个对象的话,那spring就显得太简单了,而且如果这样的话,spring它不会有一个非常完整。
或者说并不会有这么完整的一个生态的,那我就想问一件事,如果这个过程不是这么简单,就意味着这条路线是不存在的,中间一定包含了其他对应的一些环节,什么环节,我举个例子,同学们,你觉得spring能活到现在。
或者他现在有一整个完整的心态,完整的生态。

它最根本和最核心的点是。
系列 6:P62:BeanFactoryPostProcessor接口详解 - 马士兵学堂 - BV1RY4y1Q7DL
也是因为啥,啊是因为什么,谁能告诉我好了,同学们基本都说到了,老师基本一个点就叫扩展性,其实这一点是你们在看源码的时候,最应该学习的知识,很多同学在写代码的时候,其实只是为了完成我们具体的一个业务。
逻辑功能,你压根不会考虑什么扩展性之类的点,可能就不会考虑这些东西不好的东西,但是你看原版的时候,发现原版里面很多地方都是可观的,留了一堆的口子,让我们能够随意对他进行扩展和优化,这么简单好吧。
而且你可以按照自己的需求来进行,相关的定义和具体的处理工作怎么做,一会儿我再来进行相关的一个描述,我们先放一放,你知道扩展性这点就够了,当扩展进来进入之后,这个时候你就要去思考一件事了。
现在我有了插m2 ,有了注解,有了病态finition,我可以进行对象创建了,比如老师不对,你这里面少了一个非常重要的东西,什么叫bean factor,基本上你们在学习spring的时候。
别人都告诉你,老师我们刚开始跟对象叫bean factory,这玩意怎么理解啊,这玩意怎么理解,有人把它翻译成叫并工程,还有其他理解方式吗,对象工程还有吗,其实我觉得如果你把它直接翻译成兵工厂。
这样的方式或这样的一些说法。

其实不太准确,为什么,为什么呢,你可以详细来看一下这个bean definition。

在源码里面啊,bean factory它到底是个啥玩意儿。

你看它是个什么,它是一个接口吧,首先这个接interface好吧,是个接口,这个接口用来干什么使的呢,里面有一堆的描述信息,我们可以来看第一句话叫the root interface。
for assessing of spring being container,什么意思,什么意思说它是一个跟接口对吧,干嘛呢,用来访问一个spring的电容器,刚刚我就说过了。
我们的spring本身它就是一个容器吧,容器里面可以放具体的一些并对象,而我们的并factory它更多是一个入口。

为什么把它称之为入口呢,你想一件事,你在用spring框架的时候,如果你想自己去获取某一个病对象,你会怎么来获取,你会怎么做,告诉我你怎么写代码,怎么写代码,比如说老师我是这么写的。
叫什么context,点get be对吧,里面可以写上我们具体的一些类别的,personal class,这时候我就能获取到我们这个person对象了,是不是这么干的。
那老师contest跟我们的bean factory好像没啥关系吧,如果你去面试面过的话,就应该知道面试官有时候可能会问你一个问题。
说来你告诉我application context和bean factory,他们两个到底是什么样的一个关系,这又涉及到两个接口,第一个叫bean factory,对吧。
还有一个叫application contest,这里面有关系吗,他们俩什么关系啊,负责注意了,application context,它继承了我们的bean factory。
提供了一系列更加完善的功能,听明白了吗,它提供一系列更加完善的功能啊,而并不是说他们两个完全就没有。

如果你可以打开源码的话,你可以看一下,这东西叫application。

找到这个接口,然后呢选中右击soul gram,你可以看到它一系列的继承关系,好吧,往那看他这个接口吧,他是不是嗯不对,他是不是继承了bean factory这个接口,明白意思了吗,好吧。
那个老师他这样实现什么意义啊,它提供了in factor的啊,它比较单一,里面只提供了一堆一系列什么呢,叫get bean的方法,但get in方法可能不太够使不太够用。
所以application contest对他做了某些最基本的扩展功能,提供了更加完善的一些方法,明白意思吗啊,所以把这件事我希望他们能理解清楚了。

比如说你虽然用的是我们的ating confess,但说白了继承的还是be feat面的方法,所以这时候就问题来了,老师这个病发水到底怎么理解,到底怎么理解,你可以把它理解为是一个入口。
也可以直接把它就等同于我们对应的容器对象,能明白这句话吗,因为我们这些对象,不管你的bean definition也好,还是你实例化好之后存在对象也好,它都放在某一个容器里面。
而容器也是需要并翻出来进行访问的,这时候你可以把bean fighter的某一个实现子类,就当作我们整体的容器,比如说面试中问的比较多的是啥,有一个容器面试中几乎可能会提到,如果你回答比较多的话。
几乎提到有人知道这玩意儿吗,叫default,easible,being factory,有听这玩意儿吗,听过的扣一没听过扣二没见过,注意了,它就是我们所创建的整个spring容器。
也就是说我们所有的b类项,其实都在default libbean factory里面进行存放的,一会儿我可以带你们看一下,整体的流程和整体页码,好,我们先扔一边,所以这个东西我希望你能够先认识到了。
当把这东西扔到之后,你说它是我们的容器,它是bean factory的一个子类,我可以把bean factory就等同于我们对应的容器,当我需要访问的时候。
可以直接通过bean factory来访问容器里面的,一些对象值或者一些属性值了,那我问一下,我能不能通过bean factory来获取bean definition,能还是不能,看这个问题啊。
我能不能通过bean factory来获取我们的bean definition,能还是不能,能不能有人说能有人说不能,能不能取决于什么东西,你看一下它里面有没有具体的方法。

不就完了吗,东西我们没必要吵的,点开之后来看一下,有一个东西叫get并单分析式吗,有没有有对应调的方法吗,好像没有,对不对,没有你也没必要慌,为什么它是一个顶层接口,既然是一个顶级接口的话。
就意味着它一定包含了一堆,或者一线的实现子类,所以如果复制上面没有的话,我们可以去子类里面进行查找,好吧,来找个东西,懂这玩意儿有东西叫confiable,bba ba ban factory。
点它之后,我们可以来找个东西叫get,要去了,有get bean,class order,有get bean,express reserver,get depends是什么东西。
这里面是不是比我们刚刚那里面,包含更多的一些属性方法,你看啊,我刚刚是打开一个子类,当我打开子类之后,它里面是不是提供了更多的一些方法。

除此之外你还能看什么,还有团长,你通过它知道它在子类里面,一定包含了一堆的扩展实现,虽然我的父类接口里面没有,但是我子类接口里面有,比如说我带你们看一个对象,大家看一下啊。

他来我现在点开的是当前这个词类,他的继承关系啊,它实现了离子able bean factory,然后离子保实现了configurable,bean factory,confiable并fetter。
上面有哪去了,叫继承的bean factory,再上翻有ban factory,就是它有一系列的继承关系,我们不管这集承关系了,打开它在里面找一个方法叫get,看到,你看到啥。
同学告诉我看到了什么叫get bean definition,能看到能看到吗,就说spring源码它为什么这么难,或者你们看起来感觉这么乱,最关键和最核心的点在于,它存在了一堆的接口或者一堆的抽象类。
这图章类的继承关系会变得非常复杂,你在找具体的实现的时候,你可能不太容易找,所以你需要一层一层去捋这玩意儿,像我刚刚说的bean factory没有get bedivision,但是我往延展子类往下找。
找到了吗,是不是有东西叫get be definitions,就是说我可以通过我们的bean factory对象来获取到,我们具体的bean definition对象,做完之后就可以直接获取到了。
明白意思吗,所以这是源码它比较难的地方,你需要一层一层去捋,如果你不去理这玩意儿,你压根理解不了里面的核心点,好,这东西我们先扔一边。

说完之后来回过头来,现在说了,我有了being an factory之后,我可以根据我们的bean factory来获取我们的bean dation,刚刚呢我也写好了一个配置文件,比如这个地方。
当我写好这个配置文件之后,问题就又来了,同学们什么问题,大家看一下里面的东西啊,我这定义了一个data source,有人这么定义过data source吗,这么写过的同学给老师扣个一。
有没有这么写过没有,你们现在不这么干了对吧,都用注解了,都用注解,对不对,那我问一下好吧,我们这样配置文件的方式,这里面我没写引号,我没写引号,但这里面存在一些占位符吧。
比如说叫dollar gdb c12 ,dollar j t b c,you name,这些占位符一般我们会写一个配置文件,叫db。properties对吧,然后从这个配置文件里面。
把我们需要值给拿过来,替换到我们这个value值里面去,一般情况下我们都是这么干的,是不是这意思啊,那我问题来了,我在这个步骤这个步骤来进行解析装,改成一个并单菲尼斯对象的时候。
我是否会把这个值也进行一个替换,是还会还是不会,会吗,不会对结论确实是不会不是应该不会就是不会,如果不会的话,同学们,你注意了,这个步骤,他只是把配置文件或者处理这样的方式。
装载成并单元dition对象了,它不会对里面的值进行处理,那下一个步骤,我就应该通过反射的方式来进行对象创建了,现在值还没有呢,那我怎么办,这还没有怎么办,我是不是一定在中间某个环节里面。
要把这个值给替换掉,因为我如果不替换的话,我没法进行对象属性赋值了,我肯定会进行替换的,那么在哪替换,有人说了,老师在ban viper里面进行听了,有人知道什么叫ban viper吗。
好像同学提到这东西了,并viper,它是个啥,什么b方法,它是病对象的一个包装类,是在我们创建完一个并对象之后,会把它装载或者包装成一个闭环派对象,你可以直接把它等同一个并对象。
那个时候对象已经创建好了,你还留他东西干嘛,不是在这注意了,会在哪进行操作,会在我们整个对象创建之前,记住叫之前把这些属性值全部都替换完成,如果我在对象创建之前,不把属性值替换完成的话。
它后面没办法进行属性赋值了,袁老师在popu类的并对象里面进行填充,不会的,popular对象里面只popular的方法里面,他只会去设置属性值,而不会把值进行替换。
所以在中间一定某一个还原节会对它进行扩充,哪扩充啊,所以这里面会涉及到几个东西,我要给大家说明一下,比如说第一个最简单的,有些东西你们应该见过叫bean post processor,有人见过吗。
或者我把并去掉,叫post processor,前缀不要了,叫post processor,有人见过吗,这个post processor是啥玩意儿,什么东西,前置处理器。
我第一次有人把它称之为前置处理器啊,有人把它称之为叫后置后置处理器好吧,也有人把它称之为叫增强器,我个人认为增强器说的是比较合适的啊,后置处理器这样翻译过来可能不那么合适,可能不那么合适。
明白意思吗好吧,那增加一什么意思啊,它就是用来完成某些具体的扩展功能实现的,比如说问的最多的两个东西,第一个叫b fey post processor,这是第一个好吧。
还有第二个叫b post processor,这应该是我们在日常工作中,或者说在我们那个面试中,问的最多的两个接口了,他们都是用来进行增强功能实现的,那么他们两个到底有什么样的区别呢,有什么区别吗。
区别是啥,很明显了吧,你通过类名就能分辨出来啥区别,针对的操作对象不同吗,一个针对的是ban对象,一个针对ban factory对象,所以你可以思考一件事儿,我如果去看这个接口的话。
我如果想对我们的bean factory进行扩展的话,我是不是可以通过我们的bean factory post processor进行扩展。

来,我不光吹,我给你打开这个接口,你们来看一下叫ban favorite post processor。

有这样的对象,就这样这样这样一个接口,好吧,他说了,他是一个hook,允许用户去自定义,我们上下文对象的bean definition,看后面那句话啊,翻译好吧。
允许for customer modification,自定义的修改吧好吧,of an application contest being definition。
某一个应用程序的并definitions对象吧,我是不是可以通过它来完成某些,带分析成对象的替换工作,而你打开这个接口之后,你发现这个接口很好玩。
它里面有且仅有一个方法叫post process bean factory,其实就把名字翻了个个儿,叫bean factory的一个后置处理,你看到了他传过来的对象是什么。
是一个bean factory对象,所以在里面我可以按照这样的方式来获取到,并带分析成对象,然后来对并单分析逆生对象进行修改操作,能这么干吗,可以啊,那怎么来看呀,很简单,找到这个接口。
我们依然找一个实现子类。

我这儿不让你们去找了,好,我来直接给你们找到。

你往下翻,有一个东西叫,please holder configure support,有这样的一个实现子类,在当前实现子类的上还是看注释好吧,还是看注释,他说了没事,我们也找不到,来看看啊。
什么东西呢,看注释啊,第一个叫obstruct base class,说是一个抽象的基础类,对于什么呢,叫property resource,属性资源configures配置,也就是说它呢是一个基础类。
你干嘛呢,用来进行属性资源配置的一个基础类,那它来配置啥玩意儿啊,说了叫result处理处理,police holder,占位符,哪占位符啊,叫bean definition。
property values里面的占位符操作,明白意思吗,那翻译过来啥意思啊。

你想一下我刚刚定义的这个data source,它是不是一个转成一个bd对象了,bd对象里面是不是有个东西叫property,property里面是不是有一个value。
value里面是不是有一个占位符,你看我这思吗,那是不是意味着,我可以在当前的这个bd对象里面,不是这个bean post processor对象里面,来把这个值完成整体的替换工作,是不是意思啊。
来我刚刚讲的东西能听懂的同学给老师扣个一,能听明白吗,可以换张图,什么图,这是一个bd对象,但是这个bd对象都保留,就保留原始值,明白意思吧,然后在上面往上走的时候,它会变成一个叫最终的bd对象。
bd啊,指的就是我们的bedefinition,这没法写了,对八太小好吧,转成bd对象,再转成bd对象,中间这个过程里面,中间过程里面会有一堆的东西,能对它进行处理,什么处理呢。
就是我们刚刚说的叫bean factory,post,我在等,明白意思吗,比如说在这个环节,他可以对我们的bean definition,对它进行相关的一个处理。
当然这样的bean factory post post,我可以有一个,我也可以有n多个,这个根据你的实际项目需求来做就可以了,这可以完成一个替换。

当然很多老师我不信啊,你信不信,来我们来验证一下,验证一下,你知道你信不信了,好吧,来举例子说明吧,我给你们演示,你们可能觉得都听不懂啊,来我找一个代码。

我打开一个配置文件来往上看,在当前配置文件里面,我这是不是占位符,是不是一符,同学们,没问题吧,全部都是占位符好吧,全部都占位符,我没有做任何值得替换工作,要在中间某个环节的时候。
我需要把这些值给进行替换,怎么替换来,我就提debug第八部的流程啊,同学们,你怎么还有这么老的项目呢,这是我在讲源码的时候重新编译的项目,5。2。9版本的,不是老项目好吧。
这讲原版是给大家留做的一些案例,不是老项目,那我们来看我刚提拔了一下,提拔之后我说了,刚开始spring一定先有一个容器。

我刚给大家指出来了,这个容器是啥,是default visible bean factory,所以一会我带你看一下这个default lil bean factory。

你们可以看看,好吧嗯,启动好了没,因为我是aa的,是源码这个环境啊,所以他可能每次启动的时候,会相对于比较慢一点,他每次都要重新进行相关的一个编译,而你们如果直接引用战报的话,是不会有这个问题的。
还是比较快的好吧,呃等一下,怎么这么难,好了进来吧,进来之后来往下走,直接new一个对象吧,好吧,往下走,进来之后,不管它这是一个bug,点进去有this。

然后往这边走走走,点到reflesh,到reflash之后,我刚说过了,刚开始上课之前,我就强调了reflesh它很重要,里面包含了13个方法,如果你想把这个spring框架看连板。
那么这13方你是必须要懂的,如果这13话你不懂,很明显spring你就等于没学会好吧,前面几个步骤我们不看了,我只带你看关键步骤好吧,来到这来翻译一下这个名字是什么意思啊,现在我发一下,这什么意思啊。
不是什么意思啊,翻译一下获得吧,获得新鲜的bean factory对象,也就是说在这个步骤里面,我会创建一个bean factory,这个对象来装载我们具体后续的并对象。

来点f7 进去进来之后有reflash进去进来之后。

第一步先判断一下有没有工厂,没有的话跳过,跳过之后来看这个步骤,这啥意思,叫create bean factory吧,create bean factory是不是意思,我要创建了吗,你点开这个方法之后。
你发现了它里边干些什么事,来告诉我你有了一个什么对象,啥对象不是我刚写的吗,叫default libbean factory,也是我们后面跟我同学对象都叫default。
visible being factory,这玩意儿我刚说过了好吧,所以这你能看到看到之后,当我创建完对象之后。

我希望你能注意一下这个bean factory,在这里面呢有两个属性值,我希望你能重点留意一下,第一个属性值叫什么呢,叫bean definition n。
第二个属性值叫bean definition ma,来告诉我,现在我刚刚把这个default list,more bean feder对象创建成功,他们的默认值都是什么,两个集合嘛,一个hashmap。
一个是release,默认都是什么零八,我现在什么值都没有。

你把这东西记住了,什么值都没有,然后我往下走,走到这一步干嘛的,翻译一下load bean definitions,翻译过来叫什么,叫加载bean对象啊。

并单并对象吗,从这个环节到这儿加载并单分析成对象了。

这里面有多少个并带分析意识对象,我也不知道,但我们可以往下走一步。

当我走完这个步骤之后,我们可以再打开我们的bean factory,再找到刚刚那两个属性值,你们现在有值了吗。

都是11个吧,是不是已经有值了对吧,那意味着我已经下载成功了,当我在成功之后,不重要,重要的是什么,我我需要看一下里面的data source。

点开我们这个并单品是map,找到我们的data source,找到我们的value,找到我们的property values,找到我们的proper video list,找到我们的username来。
你告诉我现在的值是啥,这是什么。

jdbc要用内容,为啥11个我定义了11个,为啥11个你就不要问这个问题,我定义了11个,所以是11个好吧,打这个sc我再从这看吧,那一定就能取消了,我问一下,现在这个值是不是。
就是我们从定制文件里面加载回来,这个值现在替换了吗,没替换啊,没做任何的替换工作,当我再往下走走走走走走,走到这个步骤,当我走到这个步骤之后,我为了验证我们这个中间过程里面有没有替换。
我来打开b factory,找到我们的value,找到我们的property values,找到我们的这个值,of your name,我问一下现在值替换了吗,有没有听吗,没有啊,没有做任何的替换工作。
没有做任何的替换工作,从来没替换过好吧,然后你翻译一下这个方法叫什么,释放什么意思,别的你可以都不理解,invoke中间分开,invoke什么意思,叫执行或者叫调用,听明白吗。
然后bean factory post processor什么意思,不就是我们刚刚说的那个扩展几点吗。

叫bean factory post processor,也就是说我现在要开始调用执行并factory post processor,那我们就要看一下。

在这个步骤我执行完成之后,我这个值有没有完成替换,来往下走一步好,走完之后来看一下,听完了没,听过吗,换了吧,已经换成root了,好吧,下面得判多了,你换成123456了,12000也替换了。
是不是全部都完成替换工作了。

那是不是意味着在这个环节,这我可以完成他的替换工作,来这块听明白,同学老师扣一能听懂吗,所以这时候问题来了,如果你自己需要去替换某一个病,你可以替换吗,听好你自己,如果想做这件事能做吗,能不能做。
可以吧,怎么做,它是一个接口,你想要去实现这个接口完整,你具体的功能不就完了吗,是不是这意思啊,来试一个。

随便写一个,右击又一个class,my bf pp,诶有这个东西了,那重新建一个吧,无所谓,再右键my bf p p2 对吧,在里面实现一下in,post processor实践里面的几个接口。
实验方法之后可以干什么事,有一个bean factory的,我可以being factory,第二get beaition,但是我们有一个person的对象对吧,那这个时候你告诉我。
我能不能获取到现在这个person对象的,bean definition,能啊,那我获取对象之后可以干什么事了,person。set,我能不能往里面试试试,我是不是想怎么设计,怎么搜,我随便设置吧。
只要它里面有的这些方法,我都可以进行属性值的一个基本的设置的工作,这不就完成了吗,对不对,我们现在没需求,没关系,我就想在这儿打印一句话,比如说s o t,应该是09r大于这样东西也可以吧,我问一下。
当我定义好一个这玩意儿之后,我们现在容器能够识别到它吗,容器能不能识别到它,不能你需要把它告诉容器吧,怎么告诉容器啊,第一种方式,你上面加一个at component,声明好,它是一个并对象对吧。
除了这样方式之外,你可以在我们的配置文件里面,我诶不是这个我加一个,删掉,并对象,然后打印一个class等于mb f p p2 ,我是上个对象,可以的,帮我设置好对象之后好了,不用管了。
我可以直接来启动我们当前用程序,我们来看一下它到底会不会打印,又接撞,我这运行了不带debug了,你加注解也可以好吧,注解配置文件两种方式,说什么lock怎么lock了,停掉重来走,唉。
还有些锁定的文件get到,5。6。3execution history删掉,这里删掉,ag ru,这要是没打印出来会不会很尴尬,那肯定会啊,没打印出来肯定会很尴尬啊,肯定会很尴尬很尴尬的。
但是不可能打印不出来,好吧,来试试好不好,来我来看0922打印出来吗,对不对,就这玩意儿吗,好吧红红来一问,说spring中b f p p是怎么来实现出来的,注意了,你所需要创建的所有的对象。
所有的对象都会被声明成b definition d对象,所以我可以根据我们bd的类型,来进行一个查找工作,看看工作,这个不是我们一个重点,我不说了好吧,好好好哄哄你,记住了。
我可以根据我们的类型来识别出我有哪些对象,根据我们的bd来进行对象的创建工作。

所以这块就完成这件事情了,就完成这件事情了,这样我们也想,但是只能定义一个,还还还是可以定义很多个呀,这个bean factory post processor,一个还是很多个很多搞好,你想定义多少个。
定义多少个,那么这么多个怎么执行啊,怎么执行,能执行吗,对它是通过看心情,它是通过for循环来进行执行的,那for循环的时候,我怎么能强调它的优先级呢,比如说我就想让某个先执行怎么办,怎么办。
加锁不用加锁,对adorder就可以了,adorder好,可以指明在当前这样的一个顺序,可以根据我们的顺序来进行相关的一个,执行操作,就这块好吧,当然这是其中的一个步骤,除了这个步骤之外,还有什么。
我这儿再额外补充一些知识,在唉刚刚的东西tm白同学给老师扣个一。

系列 6:P63:BeanPostProcessor接口详解 - 马士兵学堂 - BV1RY4y1Q7DL
唉刚刚东西tm麦同学给老师扣个一,你听明白了吗,听完之后我就再补充一个东西啊,在当前这玩意儿在下面它还有一个子接口,我也希望你能够稍微留意一下这个子接口,它其实也非常重要,什么子接口呢,我写一下叫b。
有人见过这东西吗,可可同学没见过这玩意儿啊,但其实我还是那句话,你通过名字应该能猜出来他到底干嘛的,叫been definition registic,不就是注册bd吗,注册bd的一个增强处理器。
增强处理器它有作用吗,它有用吗,有它的用处非常非常大,它有什么用,把being definition装到某某map中,不太对,看什么用,在它的下面有一个很重要的实现子类,叫这个东西,有专用的这个吗。
有人知道这东西吗,卡了的话,重新刷新一下好不好,我不知道你们那儿为啥总卡,有人掉过这东西吗,叫competition class,post processor,它是干嘛的,配置类不太准确,他干嘛呢。
同学们注意了,这玩意儿你要不知道,那么,spring boot自动装配原理,你就别学了,这东西都不知道,three bot自动装表里就别学了,真别学了,因为分布的自动装配原理。
实现核心点就在于它的一个扩展,明白意思吗,就在这玩意儿它很重要,好吧,你能看到一堆的注解的解析过程,看一眼好,不带你们看一眼啊。

我心有不甘,来b再分一次。

registry post processor,这边有一个方法点开来实现此类,找到configuration class post processor,在这里面找他,然后我点快点好吧。
你不用管这个步骤了,点它点它点它,找他来往,那看看这个主注释,a process any at property,source annotation,处理这个主题,第二个处理这个注意点。
第三个处理import注解,第四个处理import resource注解,第五个处理at并注解,看明白了吗,都是在这以入口能够进来的,如果这东西你搞不明白。

那别的东西你就甭学了,所以说美元理永远说不清楚,明白意思吗,所以这是这一块的一个核心点,我们不说这东西了啊,这个这块扯的有点远了,你先把这东西搞清楚了,也就是说我们这儿完成很重要的一个基本功能。
那这其实我可以留一个疑问,有什么疑问,大家想一个问题啊,你们去你们自己去思考啊,我今天晚上先布答案,这玩意儿他继承了definition being condition。
reject post processor,那么它里面需不需要实现bean factory,post processor里面的方法需要实现吗,看这个继承关系啊,他继承了他,他又继承了他。
他是否需要实现这个里面那个post process be factory,这个方法需不需要,一定需要吧,肯定需要,对不对,来公开课同学需要吗,要吧,如果要的话,我们可以点开这个东西来看看。

confusion,can conversion,class,post post,点点开post process,并factory,这块儿有这样的一个实现功能,但里面有一堆的判断逻辑,衣服不管它。
但这块做了这样一件事,叫enhancer configuration classes是啥意思,别的东西你都可以不了解,已经hener了解银行家叫什么叫增强,它有什么意义,这里面其实引申出来一点点。
我们在写配置类的时候,pk的时候,配置类为什么需要生成代理对象,你看过电视剧吗,配置类,配置类里面你们是那个配置类是否需要带对象,需要吗,怎么突然开车没开车呀,需要吗,啊我开车了,没有啊,大家看啊。
这个你们是不是应该艾特configuration,销售过这些类,at configuration修饰类,它是否需要at confuration里面,你们一般会配置一个叫艾特定。
然后创建之后我们具体对象对不对,就是我问一下,这个配置类是否需要动态代理来创建出来,代理对象需要还是不需要,需要吗,要吧为什么,有人想过为什么吗,是什么原因导致我必须要这么做的,核心点就在于这块,好吧。
这也告诉你了,enhancer configuration,classes inhaer,创建带对象的incancer,你点进去之后,你会发现里面有具体的逻辑处理构成,就你自己看吧好吧。
讲这个东西自己看吧,就里面逻辑里面有这样的一个包含逻辑关系,你可以自己来看一下好吧,增强肯定要代码吗,不对,这不是核心点,阿福说的靠点边了。

留个疑问下去之后好思考一下,我们先不管了好吧,有有兴趣的话,我们下次再聊,来回过头来看看上面那张图,所以这个图进到这个地方了,也就是说,我现在我现在要把它变成一个最终的bd对象了。
我的值也已经替换完成了,当我的值p完成之后往下走,走到这块是不是该创建对象了,创建对象我们说了,我可以直接通过反射的方式,来进行对象的一个创建,那我问一下对象创建完了之后,下一步干嘛,对象创建完了之后。
下面干嘛调用使用对该用了,使用使用完了之后呢,销毁,销毁这是不是就是我们整个b的一个生命周期,从创建开始到使用,从使用开始到销毁这一块儿,我如果把它框起来,框起来,这最后他是什么,有点变成什么东西吗。
是不是这个意思啊,但这个生命周期啊太粗糙了,真的太粗糙了,你这样说是不对的,或者说不严谨的,那这样我还要再普及一个最基本的知识,同学们,我们一般说的时候都口头说叫什么叫创建对象,没问题吧,就创建对象。
我问一下创建对象包含几个步骤,几个步骤啊,对敲黑板要考的,一般情况下包含两个环节,第一个环节叫实例化对吧,第二环节叫初始化,我先问一下实例化干什么事情,不就是分配内存吗,对吧,当我分配好内存之后。
我的问题是,此时这个对象里面的属性值是什么值,默认值什么问题吧,我们达成共识点,那么很明显,初始化我应该干的事是什么事,什么事属性赋值了,这大家所有人都想到,到此就为止了吗,到此为止了吗,二加属性复制。
这是其中一个功能,除了属性赋值之外,还有其他非常重要的核心点,什么点呢,比如说执行叫init方法,比如说叫扩展支线,还有这样的一些东西,这些东西说白了他很麻烦,但是这是spring里面最标准的一套流程。
你是必须要知道的,所以下面我们需要花时间来把整套环节来打通,到底什么叫病的生命周期,来,我问一下,有多少同学,现在能把病人的生命周期给完整的背下来有吗,我都不认你们理解啊,你们能背下来就就可以。
没有肯定有有很多同学可能会很聪明对吧,上网一搜变的生命周期对吧,点开网页里面有一堆深究spring中变生命周期好吧,大m spring生命周期了,那随便打开一个帖子好吧,一堆文字来开始干,开始背对吧。
然后呢还有一些同学比较聪明,老师这个图片我去把这张,没了,诶刚刚还有怎么没了,对了刚才看很多同学比较聪明,不能说老师我去背一张图片,把这个图片里面的关键步骤给背下来,对吧对呀,你背下来之后。
你可能每次面试之前你都要去瞅一眼,都要去看看,如果你不看的话,很明显忘了对,很快就忘了,所以这玩意儿你不需要背,写spring源码的作者,他也是个人,他只要是个人,他就一定会有自己的逻辑思路。
那我们能不能把这一套逻辑思路给背下来,如果能把这套逻辑思路给背下来,那还有问题吗,这没问题了吗,是不是意思好吧,时间跟他说应该是录播对,没问题,就是录播是录播,所以下面我们要详细剖析一下。
bean的生命周期到底是啥,不是人,别这么说好吧,刚刚我们详细说一下视频周期,从创新立项到使用到销毁,中间还应该包含很多sa过程,求道者,你说的加载验证准备解析,这东西属于某一某一个并对象。
某一个病对象的一个创建,但是这些东西是属于jd m里面的,我们不说那么细,我们只是说spring里面都是怎么用的好吧,n9 说开发中用不到,注意了,开发中是用不到,但如果你不会。
你可能连开发的机会都没有,所以把这事儿我希望你能想明白,不要说我学东西都是开发中用的,不要用好吧,它就是用来面试的,你说你面试的时候,有谁会问你说你来给我写个代码,不可能他只能问你这些逻辑上的东西。
或者理论原理上的东西,你必须要会,你不会了,你连出cp的机会都没有,所以不要再抱怨这件事情了,该学的你就要学,很重要,来我下面带你来梳理这个思路,梳理这个思路,不要再说你老师我是不是不用学。
必须要学好吧,第一个不要再说什么内卷啊,什么东西好,不要说这些东西没意义没意义好吧,来我们就学东西就可以了,第一个叫实例化,刚说了什么叫实例化来着,分配内存属性为默认值动作,大家都能理解好吧。
在实例化完成之后,下面有很大一块,还要完成一个最基本的初始化功能好吧,初始化到底是干什么事儿,怎么去理解,第一步你想一件事,我对象创建好了,下一步你告诉我应该干嘛,我们不看源码好吧。
就按照正常的逻辑思路,下一步干嘛,不就该赋值了吗,是不是对象属性赋值啊,随便来一个属性赋值,对不对,我想这个不用背吧,你对象创建好了,下一步直接进行属性赋值,我觉得这个东西作为一个正常人,你都能想象到。
那复制完了之后,前面干嘛呢,下面干嘛,很多同学可能会比较懵了,老师该干什么事了,该扩展了,没到那个环节,也没到那个步骤好吧,他在哪做这个事情呢,你如果看帖子的话,下一步有什么东西,第一个叫实例化变。
第二个叫设置对象属性,第三个叫检查aware相关接口,并设置相关依赖,很多同学对于这个偶尔接口理解的非常非常差,来谁能告诉我什么叫ova切口,这玩意干嘛的,没听过,你应该听到这啥东西啊,翻译过来叫什么。
接受翻译过来叫什么,就联想到要一直到晚啊,这东西很好理解。

我之前给大家讲过不止一遍这玩意儿了啊,讲过很多遍的东西了,它没那么难理解好吧,来随便打开一个对象,我们试一下,把这东西干掉啊,都是之前讲课的时候留个例子啊,删掉,删掉删掉之后,我们随便创建一个。
比如说叫student,没问题吧,穿上之后我可以往里面写一些属性,private string name,private int int id is,这没问题吧,你定义好一个对象之后。
我肯定要设置一些属性值,我把它设置成自由的,然后生成公有的set和get方法,这没问题吧,那我写这东西的理解的同学扣一,没有人说连这东西都不理解吧,在后续的时候,我肯定要调用我们的set方法。
这个方法往里面进行一个属性的复制操作,这个我觉得大部分人都能理解对吧,最基础面向不像好吧。

那下面问题就来了,什么问题,spring本身它是一个容器,它是一个框架,through里面有没有帮我们定义了很多很多,其他不需要我们用户自定义的对象,有没有,有没有9万。
比如说刚刚上面提到的bean factory,这是不是容器帮我们定义的,再比如说application context,是不是容器帮我们定义的,那这个时候问题就来了,同学们什么问题。

我这儿完全可以在里面写这个东西,还有,叫be factory in factory,private obligation contest,contest,是一些数值那一样的,你想吧。
我现在以及设置上流量属性值了,他也是自由的,我如果想往当前对象里面,注入对应的一个属性的话,我必须要生成公有的set和get的一个方法,是不是意思是什么了,那生成好了之后,问题就又来了,同学们什么问题。
什么问题啊,谁在什么时候调用此方法,来先看第一个问题,谁叫你觉得这个赛段话是我们去掉还是容器,帮我们去掉,谁去掉,容器吧,你叫对象创建,你都交给容器了,你自己还去调研方法,你怎么调,你调不了。
所以只能是容器帮我们去调用这个方法,断不断好吧,第二个问题在什么时候掉,什么时候讲,你想嘛这儿有一个set in factory,这儿有一个set gation contest,两个set方法。
可能还会有其他方法,我什么时候掉了,我怎么判断启动的时候,启动的时候,我怎么知道我要去调用这个set in factory呢,我怎么知道我要调用set application contest呢。
因为我是不知道它有几个set方法的,我也不知道里面有什么样的属性值,那我怎么能确定我去调用什么样的方法呢,听到了吗,所以怎么办,监听实例化没那么复杂,线下面向对象能不能做一件事,第一。
统一的规范接口来实现此功能,通过接口能实现这个功能吗,有点懵逼了,老师我通过接口怎么定义直线啊,很明显,来看一下我们的three sement里面有一个av接口。
你发现了这个接口跟single net一样,它里面有任何方法实现吗,没有办法。

没任何方法实现,但是此接口它要有子类实现。

比如说叫b family away,有些什么名字,什么名字叫set bean factory,你这时候看一下student里面的set in factory。
和我们这儿写的set in factory一样不一样,这两个方法一样还是不一样,你告诉我。

一样吧,没任何区别,对不对,再比如说再打开一个东西叫application context,aware。

这接口它也实现了aware接口,它也叫set application contest,是这玩意儿,那你想当我设置好这样一些东西之后,我有一样那不一样,138哪儿不一样,0879同学哪不一样一样吧。
那所以我在当前对象实践的时候,我可以怎么写了,怎么写,我能不能这么做,实现并factory aware逗号实现application contest w,看到了吗,我10年两节课之后,方法都没让我重写。
这直接向上向上指向,向上指向有了吗,有了吧,是不是这玩意儿不用指两个方法吗。

所以你告诉我外交干嘛的,刚刚说了一个东西叫属性赋值,没毛病,非常对,他就是叫属性赋值,但是它这个属性赋值赋值的是什么属性,什么属性,对象,能不能这么写,叫用户自定义属性赋值理解吗,这是第一个步骤。
容器自定义选项赋值,比如说我们的内容,比如说我们的h是不是意思,第二个这个东西叫容器对象是吧,是不是这意思好吧,所以这两个步骤合起来都可以称之为什么,这是什么,不就是土金扶持吗。
只不过一个是用户自定义对象属性赋值,一个是程序对象的负值吗,是不是这意思好,当然有人问了好多问题,有疑问,老师现在是不是都不需要wr了,直接out to word不就行了吗,哦加上艾特奥特尔也行啊。
对没问题,你可以加at out to word,但是如果人就是用插画文件写的呢,你用注解没问题,注解可以,前两件这件事情你加一个add owr的,如果我不用注解的,我可以不用注解吗,我没背怎么办。
听到了吗,它是一个标准流程,他不可能预估到说用户它会有什么样的方式,所以我只能说我尽可能的把我所有存在的,可以做事情,我都帮你去做了,就这么简单,你再帮帮不了你了,我没办法。
但我能想到的东西我一定帮你想到,这意思吗,来这块听班同学老师扣一能听懂吗,所以偶尔你还很难理解吗,不难理解了好吧,刚刚有人问啊,这是什么软件,这个软件名字叫枫叶云笔记,然后他叫m笔记,你们可以下载好吧。
你可以下载看,容器对象赋值指的是啥,就是指的我们spring整个容器里面,整个容器里面它需要的这些对象,比如说我刚刚写的bean family,比如写的application context。
再比如说environment,再比如说resource,loser吧,这东西全部都是容器,帮我们创建好对象,那这个时候如果我想用的话,我只能这么干了,我只能通过外接口来实现,明白意思吧。
哦process on,不香了,不是不相了,是那个有九张图片的限制,所以我不用了,好吧,这个y接口是空的,有啥用,不就是起一个标识作用吗,你synont也是空的,你怎么实现功能呢,是不是这意思好吧。
理解同学下去之后,自己好好感受一下,好好悟一下,哪不清楚的话再来问我行吗,来我们这儿画一道横道好了,当我们到这个步骤之后,同学们想一下我完成什么事儿,听好听好,我的思路好吧,同学们,当我们创建完对象了。
我也把对象里面的属性,我几乎都已经复制完成了,我这写个东西啊,我把它对应的那个方法给你们写出来,这个步骤放下,什么叫create b instance,就这个方法的名字好吧。
这个步骤它也有对应的一个方法,怎么显示出来了,放下什么叫populate,b,好下面这个步骤叫invoke awa method,好,它对应每一个步骤里面的方法名称,我给你写出来行吧,来到这个步骤。
当你到这个步骤之后,循环依赖明天讲好吧,循环依赖明天讲,大家思考这件事情,当我把这个环节我也做完了之后,下面你在想我该干嘛了,我问一下,当我到这个步骤,我做完之后,我现在是否获取到了一个完整的并对象。
是否获取到一个完整的bean对象,会到了吗,如果按照我们正常的一个创建对象的逻辑的话,我现在已经实例化完了,我也把属性复制复好了,那这个对象我是不是应该可以拿过来用了。
正常情况我们先不考spring好吧,我们先不考虑spring,就我们如果自己用创建一个对象的话,第一步先创建对象,第二步属性赋值,赋完值之后,我是不是已经拿到一个正常的对象了,这没问题吧。
就我们不考虑spring的东西啊,但是在spring里面他还没完,他需要做一堆的增强实现,所以下面做的所有事情都属于什么,都属于病的扩展,实现了都属于变的扩展,实现什么样的扩展实现。
比如说当你这个步骤执行完成之后,下面紧跟着会导入到会进入到一个环节,叫执行前置处理方法好吧,下面还有个东西叫执行后置处理方法,当然很多同学可能不太理解,这个前置和后置到底代表着什么意思。

很简单,我带你们看代码,打开一个东西叫b post processor。

终于找到这个接口了,当你打开这个接口之后,你发现了他是不是也是个post processor,什么什么增强器吧,它也是个增强器,只不过当前这个增强器它针对的对象是谁,b吧是不是变,所以往下走。
在这里面有两个方法,一个小post process before an insulation,下面这个东西叫post process after insulation,我问一下后面那个单词什么意思。
什么意思啊,叫初始化前置和初始化后置。

那意味着在中间这个环节里面,它必然包含了一个叫初始化的步骤,有点懵逼了,老师你这个大框不就是初始化吗,怎么这还有个初始化,这个初始化跟那个初始化不是同一个东西,一会儿我来解释它们到底是什么样的。
一个逻辑关系,但我们通过方法我们能判断出来这样的东西,而我们这儿说的前置也好,而说的后置也好,它们全部都归属于谁东西,什么东西,归属于啥,是不是叫bean post processor,是不是这样。
那么有人就会问了,老师这个being post processor,它有什么用处啊,它有什么意义啊,它存在的价值是什么呀,啊很简单,我为什么不上来直接讲a o p,为什么要讲l o c。
记住我这说的一句话,这句话给你写出来,lp是,l o c,一个扩展实现,这句话我不知道有多少同学能理解,但是我希望你把这句话给我记住,这句话很重要,其实我们可以来做这样一个判,断,什么判断先问a op。
它实现的原理是什么,ob现在认识啥,叫动态代理,动态代理两种实现方式分别是什么,jdk好吧或者cd吧,这没问题吧,这应该属于一个最最最基本的一个基础知识了,好吧,那我现在我已经获取到一个原始对象了。
并对象已经有了对吧,当我有了一个变速箱之后,我现在想试试他的代理代理对象,我是不是要把当前对象作为其中的一个引用,给它传递进去,让它来生成我们整个具体的代理对象了。

所以这个时候你如果想判断的话怎么办,找到我们的bean post processor,然后点开里面的实现类,其实你一看,你就能知道哪个是用来生成具体的代理项目,哪个是看累的,明早吧,哪个是第三个。
有没有说第二个呢,其实不管第二个和第三个,最终都会找到第三个,当找到第三个之后,我们可以点开这里面的方法,找到我们那个bean post processor里面两个对应的方法。
第一个叫post process before initialization,是不是方法点开来告诉我,这里面有做任何实践吗,或者说有做任何的额外处理工作吗,有没有做没有,就一个returd。
把变速箱连封不动的返回去,如果正面不做的话,我们要看谁了,要看after,你点开up after之后,你发现了它里面是有处理逻辑的,在这里面你找一个方法叫viper,if necessary。
那如果需要的话,我就去进行一个包装好吧,你点开这个viper if necessary,点进去,点开之后往下拉,拉拉拉拉这块来告诉我这个画名字叫什么,创建代理吧,好吧,来再点进去往下翻。
最后一行叫propercy favorite,get propercy,工厂模式,通过代理工厂来创建出来我们的代理对象,所以我还要再接着往里面点,点完之后告诉你了,我要创建a op的代理了。
然后获取我们的代理对象,再点进去,点击之后,你突然发现了它是一个接口里面的方法,那我一定要找谁找具体的子类实现了,所以我可以点一下子类实现来,你告诉我你看到了什么,什么熟吗,这俩你熟吗。
什么时候很熟了吧,不就是我通过我的条件判断,选择一种代理模式来进行对象的代理吗。

所以你想一件事,我们的a op是在中间的某一个环节里面,去做这样一件事。

系列 6:P64:必知必会的13个Bean生命周期处理机制 - 马士兵学堂 - BV1RY4y1Q7DL
病的生命周期里面有没有,右半,所以这时候你再想想我刚刚说的那句话,我说a op就是i o c的一个扩展实现,现在这句话能理解了吗,能理解吗,可以了吧,是不是计划,所以为什么不能先讲a a o p。
他讲不了,很多人问我老师a o p的入口在什么地方,你不把这个东西搞明白,你能治好入口,你找得到啊,这才是最核心和最关键的点,明白这意思吧好吧,所以这样你明白了,当然如果你想去研究的话。

你可以点开我们的b ba being post processor,在这个being post processor里面,它依然有一堆的子类实现,你可以详细去研究很多好,我们也可以自定义,你看你的需求。
明白意思吧,这里面都是子类,先把它关键的核心点先掌握到,找到之后再说别的好吧。

来接着往下走,再往下走的话到哪了,到这个初始化的步骤了,这块难理解了,老师这个最外层叫初始化,里面还有个初始化,这个其实翻译成初始化不太严谨,它更严格,应该叫什么叫执行初始化调用方法,这样能理解吗。
什么叫执行初始化调用方法。

比如说我随便打开一个配置文件有吗,我在定义好一个并对象之后好吧。

这后面可以加一个属性叫init method,见过这东西吧,当然这东西我们一般是不写的,一般是不写的,但如果你写了,我是不是要知道这些步骤是干嘛的,今天不是有意义吗。

没啥意义,在java语言里面其实没啥意义,如果你接触过python,你这东西应该比较熟,班子里面有两个很重要的方法,第一个叫下划线,下划线new,它相当于账号里面的构造方法。
还有一个叫相关性相关项链init,它是干嘛的,完成初始化方法,这里面是不是就完成了一个最基本的属性,复制工作,而我们的属性赋值,不好意思,我在上面环节我已经完成了,所以这个初始方法你可以调也可以不掉。
看你的心情明白了吗,k掉也可以不掉,没关系的,但是好吧,这它是有自己存在的意义和价值的,因为在当前这个方法名称叫什么呢,叫invoke init metho,在当前这个方法里面。
它有一个非常牛逼且神奇的判断逻辑,什么逻辑呢,他会检测一下你当前这个病对象什么叫是否,是否实现了,i l i z z b接口好了,又来了一个接口,我如果直接写这个接口,你知道是干嘛的吗。
你们知道不给介绍干嘛的,很多人可能没见过,可能不知道,但是你一定见过一个方法,你一定见过一个方法,什么方法叫after,property set明的方法吗,见过没,别告诉我,没见过啊。
你们你们如果在公司每年框架的话,别人代码里面一定写过这样的东西,不可能没写过,这样的东西是一定写过的,也写过了,这啥呀,很多同学懵逼了,老师这啥呀,我好像没怎么见过这玩意儿的,他干嘛呢,他干嘛使的。
有什么用处,尴尬一点都不尴尬。

忘了没事好吧,我知道你们会忘了,工作中不用嘛,肯定会忘了嘛,来你在这儿后面加一个接口,你是来自being,这里面需要实现一个after property set的方法,你告诉我在这个方法里面可以干嘛。
去干什么事,这里面我是这么理解的,叫给拥护最后一次机会,机会来进行赋值或调用操作,这边能干干这么一件事,this。name等于张三,可以这么写吗,可以吧,是不是在bean创建完成之后。
我是不是可以最后再执行这个词操作了,是不是给用户一个机会,因为你整个容器的框架的整个对象创建过程,全部都交给了spring来控制这个环节,我们是干预不了的,没事我可以干预,我给你留个口子。
在这儿我来干预一下,在最后一个步骤的时候,我来干预一下,行不行,可以吗,可以吧,这就是这个方法它存在的意义和价值啊。

所以他也相当于做这样一件事,当然这样做完之后,下面还有一个叫否,如果我这不做的话怎么办,开始调用小银invoke,init method,就开始调,我们最基本的这个初始化方法就可以了。
看前面我还可以在属性,对属性做最后一步的复制操作,这会连过来,明白意思吗,在这个环节里面,我要做的一些最基本的工作,接下来接下来,当这些步骤我全部都执行完了之后,告诉我现在干嘛了,干什么事儿。
下面就开始使用,对象吗对吧,当对象使用完了之后,下一个步骤不就是销毁对象吗,是不是这意思,现在理解了吗,来刚刚那个环节能理解,同学给老师扣个一吧,销毁一般是不会问的,为什么什么时候会销毁对象。
你在关闭容器的时候会销毁对象,你有自己关闭过容器吗,同学们,你有自己帮我荣幸吗。

从来没有,你们每次停怎么停啊,我点这个插口点了,你没关过农村东西,所以不用管它啊。

面试的时候这块也不会重点问的,也不是重点问的,明白意思吧,好吧,来这儿又会有一个问题,刚刚很多同学都提到了几个点,老师你在刚刚讲解过程中少环节了,少什么,有这个东西,post concert。
还有一个at pray destroy,对吧,有两个方法来我问一下,第一个注解,第二注解不看了好吧,第二注解不问第一个注解有什么意义,谁能告诉我,判断用处,没用过很多人,刚刚很多人刚刚跟我说。
老师这个注解是什么时候处理的,他相当于做的事情叫什么,就是执行,初始化方法,好吧,那么问题来了,他执行初始方法,大家好啊,我刚刚给你画的这张图是整个病的生命周期,叫整个病的生命周期。
那在整个bean的生命周期的时候,我用了这样一个注解之后,他那个对象是否要经历这样一个完整的,bean的生命周期,要还是不要,要么那如果我想加这样的功能,它应该在哪在哪实现啊,你告诉我哪实现。
哪能实现你猜你猜猜,哪能实现,每一个步骤都给你画出来,哪能实现,你告诉我,哪能,逆它你的留给你扩展点了吗,after process里面给留给你扩展点了吗,我就说你们听课就是听课。

你们不会去思考,来找一个东西,同学们看好啊,我带你们找关闭掉。

找到一个接口叫b,post processor来在这里面找算了。

我们换一个方式吧,我不用这个东西了,我先不问这个,我换一个注解,这样追在那实现的,这俩注解在哪实现的,这个用的多吧,你这俩用不多,我忍了,这东西用多吧,他在哪掉的,在哪掉,哪会掉,同学们想明白一件事。
初始化调用,你初始化这个步骤太多了好吧,同学们想明白一件事,先有的注解还是先有的插m,对不对,就是我刚开始使用框架,发明之初的时候,我现有插帽,当我只有拆包的时候,我一定已经开发出了一套标准的。
并到生命周期流程,对不对,现在我发明出来一个东西叫注解,我需要把注解的功能也怎么样完成注解的功能,那这就会有一个选择,什么选择上面已经是一套比较规范,比较完整的一个流程了。
那这块我是要推翻重来还是扩展实践,告诉我一定是扩展嘛,对不对,那你就要想到在整个生命周期这个环节里面,哪给我们预留了扩展的点,那快点了,不就是being post processor吗。
所以你打开这个接口。

找到它的实现类,找哪个,刚开始学,挨个去找,如果有经验的话,往这儿看这个东西叫什么,你翻译名字告诉我叫什么,叫out to world annotation,big post processor。
完成什么功能,你告诉我,是不是这样,往下走往下走,往下找找找找找来,你告诉我你看到了什么注解,什么弱点叫auto wear的value,这俩不就是注解吗,是不是注解,这不就是value这个注解吗。
看没意思了吗,是不是这意思啊,那一样的,我想实行主角那个post contract这个东西在哪找,也是找此类实现吧,整理子类实现,它完成了一个初始化的功能,以它配对的还有一个叫pray is try。
不就是初始化和销毁吗,那对应过来叫什么,不要找名字了,你如果找pray,你是找不到的啊,它叫什么呢,叫这玩意儿。

叫init destroy,annotation,being post processor,好往下找找它的一个实现,此类在这里面有一个对应的注解,来你告诉我你看到了什么。
post construct和pre destroy能看到东西吗,看到了吗,就这就这就是这些注解,来这块儿能看别的同学给老师扣一,能看懂吗,没问题吧,这是在实现的过程吗,就要尝试去找吗。
当然这一块在实现的时候,它还有点不一样,为啥不一样,这我知道这个接口叫extension aware,being post processor,它继承了being post processor。
明白意思吗,明白意思吗,也就是说他们调用的时机,跟我们刚刚说的不太一样,但是它一定归属于谁,叫being post positor,因为being post position下面它依然有一堆的接口。
子接口子类接口,比如我刚刚说的instance aware,being post posit的,除此之外还有什么。

有人见过那个叫smart,是smart,叫merge的bean definition post processor,还有东西叫smart extension aware post processor。
看完思吗,它里面的父子的继承关系依然是异常复杂的,你如果在子类里面找不到,就要去父类里面找好吧。

找到具体的一个逻辑实现,然后来进行相关方法的一个基本调研工作。

好吧,这东西不聊了,好吧好了,刚刚我把病的生命周期给大家讲完了,来听麦同学rever一看,看能懂吗,具体的实现逻辑,我需要一行代码,一行代码带你bug,咱没这时间了吧,我带你们过这东西了。
来回过头来打开我的ppt来,我们回顾一下这几个东西,第一个i o c的容器的核心学原理,这东西我刚带你画图了,能不能记下来,能记下来吗,没问题吧,还是一样,从应用去入手,然后去想它的脉络是什么样子的。
然后一步步去往下走,脉络很重要,第二个bean factory post processor接口详情详解,快点干嘛呢,你就记住它能完成对bd对象的扩展就完事了。
第三个叫ban post processor接口的详解,他应该对病对象来进行扩展,第四个叫13个病生命周期处理机制,13个哪来的,是我从图里面一共13个步骤,刚刚我已经把关键的这些步骤都给你们说掉了。
除了这东西没说,这后面两个东西没说,这是销毁的东西,我没聊,这是销毁环节要做的事情,我们给你们说其他关键步骤,我基本上都给大家讲到了,好这是你们应该进行相关的一个处理,或者说了解的一些核心点对吧。
然后再往下看,下面还有叫十分钟aware接口的意义,我觉得这东西会了吧,来最后还有一个叫bean factory和factory bean接口的对比,来先说这两东西,谁能告诉我病犯罪和犯罪并有什么区别。
面试中有人被问到过这个问题吗,被问我这个问题,同学对方扣个一人背诵过吗,没有啊,一次都没有啊,我觉得应该有人被骗到过,同学们注意一件事,他们俩的区别,想聊区别,先聊共同点,他们俩共同点是什么。
都是记住啊,都是用来创建对象的,我希望你能把这件事搞明白,都是用来创建对象的,这是最关键的一个核心点,好吧,那不同点是什么,不同点在于这东西bean factory不是factory bean。
它里面包含了三个方法,第一个方法叫is singleton,干嘛的,判断是否是单例对象,第二个get object,pap,要获取对象类型,第三个叫get object,是干嘛的。
用户可以按照自己任意的方式来创建,对象,不是什么特殊对象,没有特殊对象,可以说有相当于什么事,我们的bean factory,刚刚我在你看过没流程了,你们觉得bean factory那套流程麻烦不麻烦。
bean factory那个病的生命周期要完整,流程麻烦还是不麻烦,我只带你画了一个图,还没到细节呢,细节就更麻烦,它包含了非常非常多的一些异常琐碎的步骤,所以它是一个非常麻烦的东西。
但是它是一个标准化的东西,标准化流程明白了吗,要做对象创建的时候,如果你没做做什么特殊声明的话,它就是一个标准化流程,而下面这东西是什么意思,什么东西叫私人定制,我把上面称之为叫流水线,下面叫私人定制。
什么叫四定制,你在这个get哦,object这个方法里面,你可以使用new的方式创建对象,你可以使用动态代理的方式创建对象,你可以通过反射的方式创建对象,你自己开心就好,你想怎么创建就怎么创建。
最终我只要能够获取到一个对象可以了,他不需要经过spring定生命周期,这一系列非常异常麻烦的流程,就按照标准就按照你自定义方式就可以了,就他们两个之间的区别就这样,有什么区别,没啥区别,就这点好。
一个是有一个是四三进制,就这么简单这么简单好。

有说老师这东西怎么用啊,很简单来定义一个是不是写过这东西啊,找一下secretary be,我找一下,我忘了之前有写过的东西了,算了直接写一个吧,真的,可以吧,定义好之后。
实现一个接口factory bean,这个大,还有一个is single分的方法,三处,这样get到不太好就写dent,第二class这边可以怎么写。
servant x等于另一个student return s,可以不完了没了,同学们就这么简单,你可以这么干嘛,那么你也可以怎么办,应该怎么做pc,第二new propersistance对吧。
student。class,点get class,loader对吧,student,要class get interface,又一个以后,可是他能不能写,我在里面是不是也可以写,写逻辑,写逻辑之后。
我是不是获取到一个方法了,提高对象吧,我能买个对象,是不是你干对不对,刘老师,那我定义好这样一个东西之后,我怎么来让它进行一个识别呢,怎么识别能识别吗,能识别不,啊那是能不能识别啊。
at在哪有地方让你用at be,怎么做,同学们一看你就没看过核心,什么音破,不需要那么麻烦好吧,注意了,当你在生成每一个具体的对象的时候,它有一个标准的并对象的一个配置流程。

大家有reflex方法点开它,在这里面我会获取到当前的病要创建的名称,我开始循环遍历名称,获取它的bd对象,当我获取到bd对象之后,第一个步骤是什么意思,你告诉我,第一步是什么意思,告诉我,什么意思。
叫is factory be,判断一下你到底是否是3x变成一个子类实现,如果是的话,我用前缀加命名称来进行相关的一个获取,获取完成之后在里面进行相关的一个判断,在这里面的步骤里面。
有一个东西会调用到get object这个方法,然后我把我的对象直接就创建出来了,听到了吧,每一个步骤进行判断的时候,都会先判断一下你的病是不是一个factor be,都会挨个判断,因为这是一个循环。
每一个对象都会进行一个环节,所以你告诉我能不能识别,能不能,诶能不能啊,大哥们可以吧好吧,所以看一下这个流程,你看完流程之后,你就不用我讲,你自己熟悉了,所以这才是最关键且最最核心的点。

ok好了,这是今天晚上给大家分享东西来,有售后同学给老师扣波六,你说过吗,这个东西有收获了啊,你只是把这一点东西看完了,看出来了,可能你达到你的目的了,但是没达到我想要的目的,我刚刚带你看了一堆东西。
一堆东西,我想问一下,我们该总结了,首先什么源码的方法论,我还是那句话,我只带你看这种东西,你只是把这一个流程看清楚了不够,你要掌握看源码的方法,这才是我最想教给你的东西,你如果看二方法不懂的话。
这东西白扯换了,spring下来怎么办啊,明白意思了吗,好吧,怎么办,怎么学,刚刚我给你讲,那东西我怎么给你讲呢,过眼云烟,第一个很重要的核心点是什么,注意的,不要忽略源码中的注释。
我刚刚带你们看了多少注释,你不要把注释看了之后,当没看到直接跳过去了,不要这样,一定要看注释,原版里面并不是说我每一行我都给你写注释了,他不是这个样子的,它只在关键且核心的步骤里面帮你写注释了。
所以那个步注释不是我的中文注释。

好吧,我不是说我的中文注释,我说的这些英文注释,这英文注释不是这中文,中文是我自己配的,我说的是英文注释,这里面会给你很多的思路报道,刚刚那你看这里看街头的时候,很重要很重要好吧。

还有吗,第二个,我刚刚有提到设计模式吗,同学们,当老师提到的设计模式吗,说的好像我能看到英文注释一样,连英文注释你都不想看的话,那没辙了,不要在意细节,要先梳理脉络再扣细节,这事儿很重要,什么意思。
你不要上来之后,每一个方法都想点进去看一眼,手怎么那么欠呢,不要这样哦,你说每个方法都给你看一眼,一会儿你就焦虑了,甚至你都看到最后,你都不知道自己为什么进来看的,我为什么进来看,一脸懵逼,听到了吗。
所以你看到这个方法之后,大概能猜出什么意思就可以了,所以紧接着下一点是什么叫大胆猜测,小心验证,谁也不是源码的作者,谁也不知道他怎么想的,你管他怎么想的,跟你有什么关系啊,对不对,所以你去猜嘛。
我刚刚一直问你来告诉我这个方法什么意思,我是不是问过这句话,为什么你这话呀,因为在源码里面它都是见名知意的,你看见名字之后,你就能大概猜到这个方法要干什么事,要处理什么逻辑,它命名非常规范。
所以你根据这些规范的命名,你就能猜出来他到底是干什么事的,然后再猜再验证不就完了吗,如果猜错了,你又不会掉斤肉,猜对了,你是不是还很开心,是不是这意思好吧,来第五个,还有什么地理。
有人说老师我英文能力太差了,怎么怎么样,都21世纪了,英文差还叫事儿好吧,使用插件对吧,来,告诉你们他叫什么叫translate。

叫这玩意,translate,我我英文也不好,你看我读单词的时候不敢给你们读,我都怂,我都害怕,怎么样呢,我有插件翻译啊,实例化之前的单例,对不对,随便选一个over翻译在是不是这意思。

怎么这人还能被一个人给难住了,不存在好吧,ok所以扇形插件当然最最重要的是第六点,就坚持看,坚持看坚持看,所以咱们同学有很多同学,我问一下,有多少同学在我讲原版之前,看过原版给老师扣一有吗。
我觉得一定有很多人看过,但是一定有很多人没坚持下来,为什么,接下来就我说的方法不对,就是方法不对,你掌握方法的这事儿就很重要,找方法就能看下去,你现在看看学原因是什么,我一直给大家举个例子。
我说你想一件事,你想想你大学的时候,你考四六级的时候,你干什么事,你买了一本单词书,你背了4年,你告诉我,你还记得几个大学的英语四级单词,单词书,你记住几个,你告诉我啊,记住几个。
这就是一个单词叫abandon,其他东西都没记住,是不是意思,你每次都从头来从头来从头来,那还可行,每次都从第一个点开始来,第一个单词开始背,每次都从第一个单词开始背,你只记住第一个单词吗。
现在都记不住吗,而第一个单词还非常尴尬,告诉你要放弃,你放弃得了,是这意思,所以你记住了,你先捋出一个脉络图出来,当你把这条脉络图捋出来之后,你再去一步扣细节,我今天我就看xml文件的解析。
明天我就看注解的解析,后天我就看b对象怎么封装的,大后天我就看defeatory post processor,大大后天我就看他创建对象,再往后就可使用,再往后尽快销毁,你一天看见你往后走。
你中间理论一问能不能记下来,明白了吗,记下来不就完了吗,啊刚刚有人说老师这东西第七点叫天赋,你说看看源码需要啥天赋,他有啥天赋,他不需要天赋,他就看你能不能学下去,有啥天赋,你告诉我。
而且我说的一定对的吗,我说的只是我的理解,我的理解的不一定完全正确,但是我能够自圆其说,并且让你们理解他就这么干的,是这意思,另外怎么说来着,1000人心中有1000个哈姆雷特,就这意思。
每个人看想法的时候都能理解到不同的想法,你可能比我还优秀,但是你有没有去干这件事情,如果你去干这件事情了。

系列 6:P65:循环依赖问题 - 马士兵学堂 - BV1RY4y1Q7DL
来先说明一下到底什么叫做循环依赖,这东西啊也比较简单,什么叫循环依赖呀,我们都知道在spring中,对象的创建是交给容器框架来执行的,那么bin是默认是单例的还是原型的,案例吧。
也就是说在整个容器框架里面,对象有且仅有一个,那么这个时候就可能会存在一种情况,我这里面有一个对象是aa对,象里面呢有一个b属性对吧,同时我还有一个b对象,当我在进行这两个对象赋值的时候。
就会产生循环依赖问题,那到底是如何产生呢,其实也非常简单,你想嘛,现在我的容器里面有两个对象,不管先创建a还是先创建b,总之我是要先创建一个对象的,我们可以举一个假设,假设我先创建的是a对象。
如果我先创建a对象的话,那行吧,先进行a对象的实例化,当实例化完成之后,我要给a对象里面的b属性进行赋值操作了,诺问下我在赋值的时候,我有b对象吗,刚开始肯定没创建b对象嘛,所以我开始创建b对象了。
当我创建完b对象之后,我要给b对象进行a属性赋值的,那么这个时候a是不是也没创建完成,所以它就变成了一个链式的结构,也就是说变成了一个闭环,当形成这个闭环的时候,它就形成了一套循环依赖。
也就是我们循环引用这个过程,这个时候程序就会报错,告诉我们说程序继续执行编下去啊,我们要想办法让程序能执行下去啊,这是我们循环依赖,最直接或者最简单的一个例子,当然有人说老师如果是三个对象,四个对象。
五个对象呢,不管你有多少对象,整体的逻辑都是这个样子的,所以这点大家没必要有任何的一个疑惑,然后呢,今天的课程是跟昨天的课程相关联的,我昨天在讲spring的ioc的时候,我初说了,病人生命周期里面。
包含了n多个环节和n多个步骤,那我问一下在哪些环节和步骤里面,最主要的是什么,是不是两个呢,是不是有两个名词,第二名词叫做实例化,第二名词叫做初始化吧,所以我们完全可以以一种画图的方式,来模拟一下。
这个循环依赖问题到底是如何产生的,这个图只是一个最基本的简略图,它不足以表达我们在实际情况里面,要存在的情况,那怎么来创建这件事情啊,很简单,第一件事我说了,比如说先创建就创建创建a对象,这没问题了。
当我创建a对象的时候,同学们,你想下一步该干嘛了,如果你想创建a,必然是不是涉及到一个实例化的过程,所以紧跟着后面的一个步骤是啥啥东西,你们来说好吧,不要让我来说啥玩意儿,啊实例化吧,你说实例化a对象。
当实例化完成之后,我想问的是,此时里面的b属性等于什么,那么肯定是默认值嘛,刚开始等于是空的,然后当这步完成之后,紧跟着下一步我要做一个操作叫初始化,a对象,那说白了什么叫初始对象,不就是给b属性。
赋值吗,是不是逻辑给b属性赋值,而在赋值的时候,我们都知道容器里面对象默认是单例的,所以为了他为了得到我们的b对象,那你告诉我下一个步骤我应该干嘛,是不是紧跟着,应该是去叫从容器中。
是不是从容器中查找b对象吧,视频查找比对象,我要找到了,你说这既然是查找了,意味着一定涉及到两个结果,第一个找到了,第二个没找到,我们先说如果找到了得到,抓到之后怎么办,是不是直接赋值即可对吧。
他直接给我们当前这个对象赋值连过来结束了,那很多情况下是什么,是没找到吧,所以这有一个问题就是没找到,如果没找到怎么办,我是不是该创建b对象了,一定要创建吧,你不创建的话,这个步骤是没法做的。
所以该创建b对象了,这搁这儿能理解的来,能跟上的,给老师扣个一,能看到吗,这没问题吧,最基本的一个环节,然后下面当创建b对象之后,跟刚刚的流程是一模一样的,这步骤叫实例化,实例化,b对象对吧,然后呢。
此时a等于空,那下面再在做这个操作的时候,紧张到后面就开始叫初始化,b对象说白了就是给a属性赋值,那同样的,当我在给a属性赋值的时候,我是不是一样要去容器里面查找,我们当前的a对象了。
随便一样拿过来容器中查找a对象,当我在进行查找的时候,也百分之百会需要一个东西,或者存在两个结果,要不然你找到了,要不然你没找到,就这两个来,先说右边右边这块,如果我找到了,抓住怎么办。
是不是说了就直接赋值即可,然后呢下面这连下来结束,那下面这儿呢如果没找到,我说又开始进行整个a对象的创建了,来这个流程或者这个过程能看懂吗,正版题吧,没对齐是吧,就这样吧,无所谓啊,这没问题吧。
来你看一下,当前这个图里面还有没有一个闭环存在,一定有吧,从创建a对象开始到往后走,它形成了一个闭环,那我问一下,当前闭环存在的原因到底是因为什么,谁能告诉我,那为什么参加一个闭环,在闭环形成的时候。
中间必然包含了一个非常重要的核心步骤,就在于这一块,如果这个地方,如果这个地方我找到a立项了,我是不是就不会有闭环了,或者换句话说,如果我能把这个东西给阻断掉,它还有闭环吗,这就没有了。
所以当它形成这样的一个闭环套路之后,我们就要去思考一件事了,思考什么事情,我能否把当前的闭环给它解开,不要让它变成一个圈,因为你变成一个圈之后就很麻烦哇,他一直一直这样走。
那你就想我怎么做这件事情还是一样,注意你在找闭环的突破口的时候,先从哪开始找,从最后一个步骤形成闭环的这个步骤开始,从这儿开始,这个环节明白意思吧,这样大家要注意了,那我问一下。
当我这儿开始查找a对象的时候,在刚刚整个创建流程里面,我的a对象到底你有没有创建,有没有,听我的问题啊,在这一块我在查找的时候,我的a对象到底有没有创建,有说没有,有说有框架了吗。
这白字白纸黑字写的明明清清白白的,就是创建a对象吧,我其实已经有一个a对象了,只不过当前这个a对象,不是我们传统意义上的a对象,啥意思,对象在创建过程中,它存在了两种状态,好这状态哪两种状态。
第一种状态叫做完成实例化且完成初始化,这个时候我们给它一个名词,比如说叫产品对象,没问题吧,那一样的我可以再换一个叫完成实例化啊,但未完成初始化,我们把它称之为另一个名词叫半成品。
半成品对象这样东西能理解吗,看来这个过程这两个成品和半成品能理解的,扣个一就可以理解吧对吧,这就是说我在对象的时候,两个不同的状态到底是什么东西,那您想一件事,当我最后一步在形成这个闭环的时候。
我现在的a对象它属于成品还是属于半成品,怎么样吧兄弟,半成品吧,对不对,半成品,那紧跟着就会有一个问题和一个步骤来,有一个问题等大家什么问题,如果我持有了某一个对象的引用,那么能否在后续的步骤中。
给当前对象进行赋值操作,能还是不能,听完这个问题啊,这个问题才是最关键的核心点和最本质的东西,如果我持有了某一个对象的引用,那么我能否在后续的某一个步骤中,给当前对象进行复制操作,可以吧。
你有了应用之后,有了引用之后,我能知道他对象的地址,那我一定能够对它进行相关的一个复制操作,就肯定是可以的,如果这个步骤可以的话,那我们就要去思考一件事情了,什么事情,这个步骤我要去查找a对象。
我虽然获取不到完整的a对象,但是我是能够获取到半成品的a对象了,这肯定没问题吧,所以是不是相当于我们可以把这个步骤给干掉,也就说它是不存在的,不存在的话,也就意味着我们在刚刚上面整个查找的环节。
或者过程中,我要加一个东西,加什么,就是大家说的加缓存这玩意儿好吧,加换的这玩意儿怎么加呢,没有半成品啥意思,完成了实例化,但没有完成初始化吗,我昨天不是讲i o c的时候。
不把大家给大家讲了一下bean的生命周期吗,在bean的生命周期里面,是不是分了大概的微景模块,实例化对吧,初始化,然后又分为使用中,然后就属于销毁,是不是四个状态。
然后我们初始化里面又包含了很多个步骤,我们把这东西统一来说了,统一来说了,好吧,同学描述了,所以这时候你想当,我还是沿着这条链路来走的时候,我实例化完a对象之后,我能不能把当前的这个a对象。
把它放放到某一个空间里面去,举例子,我这儿放一个结构,放啥呢,放一个map结构,我把这个map称之为缓存,可以吧,每次当我存储完具体的一个对象之后,我创建了一个对象之后,我先把当前的a对象放到缓存里面。
那现在我的问题是,什么状态,半成品状态吧,记住啊,半成品状态记住它,然后往后几面接着走,当我走到这个环节的时候,叫初始化a对象里面的b属性,也就是说我给b属性要进行复制操作了,我一定从中心里面查到b。
查到b的时候,我能不能去当前的缓存里面找一下,可以吧,我从缓存里面找b的时候,你告诉我我能找到b对象吗,找不到吧,因为他还没开始创建吗,所以一定找不到,找不到我再接着往下走,我开始创建b对象。
当我的b对象创建完成之后好了,这叫实例化b对象吗,我能不能把我的b对象,也扔到当前的环境里面去,可以吧,此时我的b对象它也是什么状态,叫半成品状态都是半成品,不管它都是半成品。
然后我现在给b对象里面的a属性赋值,我这儿从容器里面找的时候,我能不能从当前缓存里面也找一份,这可能没问题吧,我在找这个a对象的时候,你告诉我这里面现在有没有a对象,有吧一定是有的,我是不是有一个对象。
当我这有对象之后,是不是意味着我已经找到当前的a对象了,哪怕你现在的a对象,它就是一个半成品,也没关系,我就只能找到他,我想找他,找到之后,我把刚刚的半成品对象我赋值给b属性,那我问一下啊。
当我这个地方我找到我们的a对象了,当我这儿找到之后,现在我的b是什么状态,是不是没b是不是已经变成一个成品了,它依然是一个半成品,就相当于我持有了当前a对a对象的,什么引用吧。
我在后面的时候我再给它完成赋值操作,是不是这意思,所以现在b已经变成一个成品对象了,那我现在我b的成品要不要往缓存里面放,没有问题啊,要不要往这里面放,不用啊,不要你后面怎么找啊,要吧。
就意味着账号存在一这样就写叫b冒号成品,是不是意思,这没问题吧,叫b叫成品,接过来,然后我这放进去之后,下面紧跟着回到这个环节里面,现在如果我再去我们的容器里面,查找b对象的时候,我能不能找到b对象。
先留着好吧,我们先写,先先留着,先写到这儿,先写到这儿,这儿能不能获取到,能吧好吧,那你想我这应该取的是b的半成品,还是取得b的成品,取半的面试成品,你有成品了,我肯定取成品对象吗,对吧。
所以这个时候我找到b的成品对象,当我找到之后,我给a里面的b属性来赋值操作,那我问一下,现在我们的a对象它属于什么,属于什么东西,成品了吧,a也是成品了,对不对,所以我把a我也写进来,a,很好成品。
同学们,你想一件事,当刚刚这个流程我总体都完成之后,我有没有解决刚刚我所说的循环依赖问题,你先不考虑缓存里面这个半成品和成品的事儿,好吧,解决了吗,是不是解决了。
这就是spring中到底是如何解决循环依赖问题的,但这里面还有问题,因为我这边写的时候,其实刚刚在写的时候,同学们都发现问题了,老师当你形成了一个成品的a和b对象之后,我不会对这玩意儿进行覆盖。
为什么你这个缓存里面它既存在了ab的半成品,又存在了ab的成品对象,这很明显不太合适,是不太合适,那我怎么办,所以大家就要考虑一件事了,这个map到底是啥玩意儿,而据我们刚刚那个流程,听明白。
同学给老师扣个一,我看看,没问题吧,我把这个框一下,换个色儿,来看一下,这流程我觉得听懂应该没问题吧,说听懂没问题好吧,只不过对于这个map这大家还有疑问,那么这还有疑问。
所以我们之前按照我不讲这节课之前,你们的理解怎么解决循环依赖问题呢,spring如何解决循环依赖问题的,基本上所有看过帖子和面试中,被问到过题的同学都会答一个东西叫三级缓存,当然还有同学会说一句话。
叫什么叫提前暴露对象,是不是意思就是说通过这样的方式来解决,这没问题吧,但是你注意了,其实它解决循环依赖的问题,最根本的点在于什么地方,在于一个东西,记住了,叫实例化和初始化分开来操作。
我们刚刚能划开这样的一张图,是因为我把实例化和初始化的步骤是分开了,这是因为分开了,所以你才能完成这样一件事,那我问一下,有人见过spring的三级缓存到底是什么东西吗,或者到底长什么样子吗。
有人见过吗,三级缓存到底啥玩意儿,很多同学光在输三级缓存,三级缓存是韩信卖方还是control,韩信卖方还是卖方。

来,我带你们看一下好吧,在spring源码中有一个类。

我希望你能记住叫default呃,singleton。

并register在当前对象里面有三个缓存结构。

分别是这玩意儿。

我把这三东西拿出来粘出来,吃子弹粘过来。

我给你们放到这儿,把三东西拿过来。

这就是spring里面的三级缓存,好吧,来解释一下三级缓存分别是啥东西,比如说第一个像这块singleton object,它称之为叫一级缓存,我需要把这个字改一下颜色。


这么说的,一级缓存就这玩意儿好吧,同样的还有二级缓存是这东西,这叫二级缓存啊,那一样的,还有三级缓存,就是中间那块它叫做三级缓存,我希望同学们能明白一件事,这里面所说的一级也好,二级也好,三级也好。
是人为给它下的一个定义,它在它这个三个麦和定义的时候,并没有明确说明说哪哪个是一级,哪个是二级,哪个是三级,用人类给它加上这样一个东西好吧,那这个时候我的问题就来了,同学们什么问题。
这三个缓存它们有什么样的区别,有区别不,诶有区别吗,有没什么区别,任老师,他们有的是concut哈希map,像一级和二级都是concut哈希map,而三级变成了哈希map,还有他们的容量是不一样的。
上面是256,一级缓存,256,二级和三级是16,还有吗,除了value这些这些东西不一样之外,还有什么不一样,其实三个缓存里面最最最最大的一个区别,并不在于后面这块东西,它只是为了控制线程是否安全的。
最根本的点在于泛型,我希望你能够好好看一下这个泛型,一级缓存和二级缓存别,我放的全部都是object类型的对象,就是一个对象吧,但是我的三级缓存里面放了什么叫object factory。
这个object factory到底是啥东西,你们知道吗,啥玩意儿,记住它叫做函数式接口,函数式接口不是工厂对象好吧,不要直译,不要直译,千万不要直译好吧,它叫做函数式接口,你可以理解为它可以把什么。
把匿名内部类和拉姆达表达式传递,进去当做参数,好我们来看一下。

找到一个对象object b,上面写的东西叫functional interface,叫函数式接口,如果谁不了解什么叫函数式接口,同学好,下去之后好好看一下jdk一点八之后的新特性,这属于一个新特性。
其实也没有什么难理解的啊,就算函数接口,那它有哪些用途呢,就是我们可以传递一个匿名内部类,或者传递一个拉姆达表达式进去,相当于是一种函数式编程了,我问一下,在原生的java jdk里面或者java里面。
我能传一个函数当作参数吗,能不能不能吧,但是当你有了函数式接口之后,它可以定义一个函数式接口的参数类型,然后我可以把拉姆达式传进去,而我在进行调用的时候,可以通过get object来进行相关的调用。
就这意思,比如你写的函数接口,括号指向再写一个create b,假如你写这样一个方法,当写方法之后,它就变成一个函数接口,我传到这三种里面去了,当我在调get object方法的时候。
实际上掉的就是create bean这个方法啊,这属于一个最基本的一个应用。

好吧,如果谁这块不熟的话,你先来看一下。
系列 6:P66:源码留心的6个方法 - 马士兵学堂 - BV1RY4y1Q7DL
调用到时候通过get object方法来调用,反正两句话,我希望你能够记住了,我希望能记住好吧,那光讲这东西,我觉得很多同学还是一脸懵逼的,我还是不知道他为什么使用这样一个东西,它存在的意义到底是什么。
或者说它到底有什么样的一个价值,那这个时候我们来做一件事。

做些什么事情,光说这些理论东西,光说这个图,我觉得你们都理解了好。

但是我们要看一下原版里面,它到底是如何来进行实际操作的。

我可以往这个地方放一些东西,什么东西,这定义好叫一级缓存,下面叫二级缓存,再往下叫三级缓存,我定义三个缓存对象,后面可以往三个缓存里面放东西,放对象好,我们来完整的模拟一下什么。
当a杠b存在循环引用的时候,它是如何往当前这些缓存对象里面设置,具体指导,我们把整个流程来进行一个优化,可以吗,可以吧,我现在已经把这个流程过一下,因为我不带你们这个这块东西啊。
我还是希望能够带你们debug下源码,因为如果不垫吧,呃不debug源码的话,这东西会显得非常非常麻烦,单说理论没意义,所以我们还是按照这样一个流程来,但是有的同学可能会说。
老师我之前自己从来没有debug源码,我diy源码的时候,我应该怎么debug,或者你debug太快的话,我跟不上怎么办,注意我让你跟上,所以在讲这些东西之前,我需要让同学们能够记住几个异常重要的方法。
原文里面的代码和步骤是非常非常多的,我也不会把每一行代码都给你,详详细进行一个讲解,这都不是最主要和最关键的,所以我们只说非常重要和核心的方法,到底有哪些,我希望你能给我记住六个方法。
记六个方法能记住吗,同学们记录方能记住吧,所以这应该没问题好吧,我先写一下,你好好记一下,第一个叫get be,他后面第二个叫do get,并看后面叫做create,看后面,叫做do create b。
再往下走,叫create bean instance,然后下面再来一个,populate b一共就这六个方法,我觉得这个方法大家不可能记不住,也不应该记不住,也就是说你在看源码的时候。
只需要留心这几个环节就可以了,别的东西我们都可以跳过,这没问题吧,就几个东西,然后我还需要再给大家提一个醒,在原版过程中,在debug,过程中会出现套娃操作,所以每一个步骤必须明确到底,在干什么事儿。
没问题吧,源码里面有很多套娃操作,或者有很多递归的操作,很多同学其实蒙就蒙在递归上面了,你发现刚调完一个方法,诶又重新调动了,诶又重新调动了,很麻烦,所以我把这些提前东西我都给你预先准备好,没问题吧。
我们先来走这样的一个流程,当我走完这些流程之后,我们再来解决这一块,这个map里面存在的问题,就是源码里面。

它到底为什么要使用三级缓存,来解决循环依赖问题。

好吧。
系列 6:P67:a到b循环到缓存优化源码讲解 - 马士兵学堂 - BV1RY4y1Q7DL
来啊看好了,我这儿定义了一个a对象,我把这个name都干掉,不要name了,对吧,大家看到了,在a对象里面有一个b属性,明白了吗,有set方法,有get方法,然后这我定义了一个b对象。
b对象里面同样有一个a属性,这把它干掉,不要他,什么问题吧,比如说a现在里面有b了,b现在里面有a了,是不是这个过程,这是我基本定义的两个基本对象,当我定义好之后,我这用的是配置文件的方式。
因为我觉得配置文件的方式它更加好理解一点,所以打开我们配置文件,你可以看一下这个过程怎么做的,现在我定义了一个b对象,它是a的,然后看sql a里面有一个属性,一个b refb,这有一个b对象。
也是b对象,引用了refa refa,你告诉我这样的代码在进行debug过程中,它到底是否会出现循环依赖问题,这是代码会出现循环依赖问题吗,诶会不会啊,肯定会的吧,如果不会的话。
我们一会儿来测试一下好吧,来点个菜test,我这直接运行run,大家错了,不是这个啊,上面这找到我们的circular test,来这个概念表,右击,你先让一下吧,先跑一下,大家看一下这个问题好吧。
我错了,我这每次都要编译源码,所以这个过程是比较慢的,你们如果不是编译源码的话,这个过程不会这么慢,直接引用站包的话是非常快的,来看看这个过程,何同学刚说是会出现这样的问题的对吧,我们运行完之后。
你发现了b对象我也打印出来了,a对象我也打印出来了,他并没有出现循环依赖问题,而为什么又出现,原因点在于我们spring中内置的三级缓存,它帮我们解决了这个问题,所以下一步我要看一下它到底是如何解决的。
到底如何解决的,所以我们从debug开始看,我说过了,在debug的时候,这个过程是比较麻烦的,但是我直接带你们找到创建对象,是从哪一个步骤开始的,好吧,还记得昨天我讲课的时候。
我说了一个非常重要的方法,还有人记得叫什么名字吗,我说了一个非常非常重要的方法,还是记得叫什么名字吗,flash,这叫flash吗,reflesh吧,reflesh好吧,reflesh,所以这进来见之。
先点f7 跳过,这是一个static,是一个防止这个weblogic,8。1版本之后的一个小bug的东西,跳过它,不管它是什么,好吧,再点f7 进来,尽量做到方法里面再点mc进来。
这有一个reflesh方法,我们进去进去之后,这里面包含了13个非常重要的步骤,这些步骤你都可以跳过,但是到这行的时候,我希望你能听一下叫finish be factory好。
informalization,你翻译一下这句话,它上面的解释是什么意思,叫什么,这叫什么意思,实例化吧,实例化所有剩下的非懒加载的单例对象,要说在这个步骤里面我才开始进行实例化操作。
所以我直接跳到这个步骤里面,有东西都跳过断点超过好,直到变形到变形之后,为了验证一下,我们可以打开当前的bean factory来看一眼,并factory找到我们刚刚说的一级缓存,二级缓存和三级缓存。
来找一下那个叫什么来着,一级缓存叫single object吧,你可以找一下,看这,在这个一级缓存里面,他有ab对象吗,现在有没有ab对象,一级缓存里面没有没有,再来看这是二级缓存,有东西吗。
没有这三级缓存有东西吗,也没有,所以从这个步骤开始,我们才开始正儿八经进行实例化的关键步骤。

从这开始,我们点fc进去,进去之后,上面都是一些对象属性值的设置工作,你可以直接跳过,不管它好吧,再往下进行,进到对面,从这儿开始,重要点来了,我问一下,在当前整个应用程序里面,我需要创建几个对象。
几个告诉我两个吧,就俩一个a一个b,所以我刚开始我先获取一个东西,叫this。bean definition nes,昨天我带你看过这个属性了,除了这个属性之外,还有一个什么叫病戴芬尼斯matt吧。
里面放的就是我们要创建的并对象,的一些bd信息,那这里面可能有两个吧,所以你打开这个name之后往下走走,一步一个看到当前这个集合里面有两个值,一个a一个b a和b谁先创建谁后创建,无所谓好吧。
爱谁先谁先爱谁后谁后,没关系的,在下面我要开始循环取了,刚刚list里面看到了是ab开头的,所以一定是先创建a对象吧,是不是一定先看a对象,所以从这开始完之后,第一个我获取到的病名称是a。
比如说从这个步骤开始,我要创建a对象了啊,中间有一系列的判断步骤,第一步获取一下我们的bean definition,好吧,中间有一系列的判断,我们都管不管它,但最终我需要找到一个东西,啥玩意儿。
这个方法,能看到吗,吃饭干嘛的,我刚刚有没有在你说这个有没有说这个东西啊。

它叫做get bean,还记得第一个方法吗。

是不是get变,你告诉我这get的变成干嘛的,注意了,当你在创建对象的时候,我每次都要去我们当前的容器里面,判断一下我之前到底有没有创建过对象,所以我会先获取一下b根据a去创建并对象,那很明显。
你告诉我我之前有创建过吗,没有吧,所以紧接着听到一个方法叫do get in,这是我说的第二个方法,do get in,再点mc进去,进来之后转换一下名称,不管它来往这儿看叫get singleton。
你通过名的方法,你能猜到什么叫get singleton,叫获取单例对象吧,那很明显我刚刚说过了,我说现在有a的单例对象吗,有a的单对象吗,没有有啊,1800821有吗。
你程序运行到现在有创建对象这个环节吗,没有没有,所以这个值取出来之后,它一定是等于空的,等于n等于n了,怎么办,我是不是该去创建对象了对吧,我该创建对象了,因为没有对象,我肯定要创建嘛,你不创建。
你后面怎么用呢,所以往下走,下面有一堆的条件判断,我们直接跳过,不看这些步骤了,好吧,你拿走走到一个步骤里面,走到这行,说m b d sileton说,我们当前的a对象,是否是一个单位的默认单例吗。
我没做任何配置,默认就是单位的进来之后叫get singleton,好了,你看到了第一个方法叫get singleton,这个get singleton跟上面这个get singleton。
它方法名字是一样的,但是传递的参数不一样,第一个里面只需要传一个bin name就可以了,而第二个里面我除了传一个bname之外,我还传了一个什么玩意儿,看这段代码,这什么鬼。

是不是相当于我传了一个拉姆的表达式,把它拿出来,站出来,我把中间这些注释都干掉,不要浪费空间干掉,是不是一样东西,那这里面其实就指向了一个东西,叫create bean,可是这编码就调用这个方法。
我问一下。

当我们在进行具体调用的时候,现在我一进到或者我一调用get single方法的时候。

这里面东西会被调用执行吗,就这个拉法表达式它会被调用和执行吗,会不会,不会吧,不会调动执行的,我说过了,他什么时候掉,在执行get object方法的时候才会掉,所以它只是当成一个参数。
传递到了get新功能这个方法里面去,所以我点fc进去,进来之后,第一个断言,第二个加锁,不管它往下走,往下走,来往下走走走走,一堆的判断逻辑好吧,当我走完之后,走到下面那行,你看这块了吗。
叫singleton factory,什么叫singleton factory啊,往上翻,singleton factory指的是啥,你告诉我这个singleton factory指的是什么,啥东西。
拉姆达表达式吧,前面拉姆表达式对不对,也告诉你类型是什么,是object factory类型,所以当我这个地方我在调用get object的时候,你告诉我我实际执行的是什么方法,是一个什么啊。
叫做create b吧,所以点f7 我进去到create变了吧,所以这是我给你们说的第三个方法叫create bean,再点f7 进去,现在这上面一堆的赋值和其他操作,不管它好吧,再往下走走走。
走到这一行,你看到了什么,方法名称叫do create定吧,是不是do create in,明白意思吗,这时候我需要给大家提一个醒,同学们,你注意到在整个源码过程中。
研究过程中有很多方法名称前面是带着do的,当你看到do开头的方法的时候,我希望你能够给自己提个醒,为什么,因为在do的方法才是实际干活的方法,明白吗,你说我们实际真正的处理逻辑。
数据逻辑都是在do开头方法里面执行的,那你想一件事,这涉及到杜奎的,并能你下一步骤干嘛了,我是不是该真的去创建对象了,对不对,真传对象好吧,所以我再点f7 进到这个逻辑处理里面去,点f7 进来进来之后。
这儿有一个冰viper,昨天你说我这边viper是一个包装类,无所谓好吧,你可以把这个冰viper直接等同于我们的对象,往下走,往下走,往下走,到这个步骤,这啥玩意儿来着。
还记得不叫create bean instance,什么东西。

我给你说的第五第五个方法吧,叫create bean instance,你少一个s,是不是东西他要干嘛的。

这不是干嘛的,它是用来进行具体的实例化操作的,我带你们看一遍好吧,里面干什么事,其实我问一下,我们都知道对象里面的呃,容器里面的对象,都是通过反射的方式来进行操作的。

我问一下反射代码,大家还记得吗,我们写一下好吧,第一步骤获取class大写c,获取函数对象吧,啥玩意儿,第一步是获取砍函数对象,当我获取卡拉斯对象,第二步在这干嘛,是不是叫construct,or 2。
等于class。get decl啊,construct,什么意思,是不是要获根据我们当前的class对象,来获取到我具体的构造器了,当我获取到构造器之后,第三个步骤在干嘛。
是叫object o b j等于t o r。new instance吧,我是通过这个步骤能创建出来我们具体对象,这没问题吗,这个问题没,这个视频是录播吗,是的,这个反射我觉得应该会啊,我觉得过分了。
说明你的基础真的掌握的有问题,所以这个最基本的反射东西你要了解,所以我们在看那个create distance的时候。

我也要去找到具体的逻逻实现逻辑,怎么找点f7 进去,当然里面啊依然有一堆东西很多好吧,我们只看到往下走走走走走,跳过跳过跳过一堆好吧,跳过不看他不看他,走走走,再往走,走。
到这行叫instance ban。mc进去,进去之后往下走,到我们的实例化环节好吧,走走走走走走走,来看这行代码告诉我什么意思,看这行代码什么意思,class。
get declare contractor,不就是获取到我们对应的构造器吗,当我有了构造器之后,我是不是该用构造器来创建创建对象了,来了走走走,走到这一行,再点fc进去,进来之后上面一堆判断跳过去。
不管它不管它,不管它,到最后一步叫c t o r。new instance,你告诉我,我是不是通过反射的方式来创建出具体对象了,是还是不是,没问题吧,所以这个步骤里面干什么事。

就是通过反射创建对象,就这么简单,没别的意思。

没别的意思好吧,就这块处理的逻辑,我来我们返回去啊,返回去返回去返回去返回去返回去返回去之后,我们来看一下这个并对象,现在我的病对象已经有了。

这是不是有个a,是不是有对象叫aat。

1573吧,我们这儿记录一下,记住对象叫aat,1573,我的问题是同学们现在b属性有值吗,闭嘴有没有值,没有吧,b等于空记录下来对吧,现在我这玩意儿,我有往任何的1233个缓存里面放东西吗,啊。
我没往缓存里面放啊,我只是做了一个记录,表示说他是a对象了,但是我还没往我们的三级缓存里面扔东西了。

一点都没扔,所以接着往下走,往下走好吧,一直往下进行相关的一个处理吧,按道理说我第一波对象有了,下一步该进行实例化了,但是恰巧不巧的是什么,在整个实例化环节的时候,这里面有这样的一个判断逻辑。
有这样一行代码,这行代码其实就是三级缓存最主要的点,因为你往上看,这儿有一个东西好,early catch synonto be able resolve cooler reference。
说这个东西能够解决我们的循环依赖问题,就是原版里面写的注释,就这行代码都会变得很重要,来看这行代码,第一个参数是ban name,问一下现在的bin是谁,a吧b im是不是a没有b的事儿,还没到b呢。
好吧,就是a就是a后面这又是个啥东西啊,啥东西。

又一个long表达式好了,我把这个量表达式拿出来,所以这里面啊拉米亚是比较多,它有它非常重要的核心作用,我把它起到下来。

我要放这块儿啊,做一个标记,这张表达式,所以同学们想一下,当我开始执行的时候,他会直接掉档表达式吗,不会我们看一下这个adsingleton factory干什么事好吧,点f c进去。
进来之后往下走走走来,第一个步骤干什么事,第一个步骤,干什么事儿告诉我,叫this。singleton factories,点put bean name,加singleton factory。
把谁放到三级缓存了。

然key等于什么,等于a吧,value等于什么东西,value是a对象吗,不是啊,value放的是谁,放的是拉姆达表达式,value放的是拉姆达表达式,它不是半成品,也不是成品。
不管是我们的成品还是半成品,没往三级缓存连放吧。

我三级管子里面放了什么东西,c功能factory,所以他是谁,这个参数参数是谁,然后表示是不是这意思,所以这我只需要放量。

表示不可以了,没问题吧,来这个步骤没问题的,扣一,一定要跟上好吧,这些和弦不一定要跟上。

这放到三级缓存去了,放到三级缓存之后好了,往下走叫early single top remove,把二级缓存给移除掉,二级缓存本来没东西了,也不需要移除好吧。
再往下走叫registic singletons,我们这没关系,它不属于三级缓存,所以跳过去不管好了,也就是说刚刚这个步骤里面就干了一件事,把我们的lam表达式扔到三级缓存里面去了,当我扔完之后。
同学们,你告诉我紧跟着下一个步骤该干嘛了,我a对象是不是已经创建好了,听好a对象就创建好了,只不过它是一个半成品的对象,所以下一步我需要给a对象里面的b属性,来赋值了,那复制的方法叫什么。
叫populate bean嘛。

这就是我们说的第六个方法叫populate be,我现在已经在里面把这六个方法都过了一遍了,之后,你还会看到这六个方法的这个流程,我希望你能把这个方法给我记住。

所以这个步骤干嘛的,police啥意思啊,什么叫populate填充嘛,叫属性填充好,所以这里面我开始进行属性的赋值操作了,怎么复制啊,很简单好吧,点f7 进去进来之后。
上面一堆逻辑判断就跳过了好吧不重要,不管它,你们不用管它干嘛的好吧,往下走,直接到最后一行叫apply property values,叫应用属性值,也就是说这个步骤才是最关键的,属性赋值的步骤。
我只有走到这个步骤里面才会进行属性赋值,卡的同学刷新一下好不好,刷新一下好吧,自己刷新一下,我等一下卡的同学刷新一下,自己刷新一下,你们可能用的是浏览器看的,所以可能会卡一点,如果你用客户端的话。
就不会卡的,把自己刷新一下好了,那你们刷的,我抽根烟,好了吗,好了,我现在往下讲到这个步骤的时候,它是很重要的步骤,叫apply property value,这叫应用属性值。
也就是说往属性里面进行一个,最基本的赋值操作,好吧,我们点f7 进去,进来之后,我想问一下a对象里面有几个属性,一个吧,只有一个b,所以往下走走走,这些动作跳过了啊,不带你拿一个看了没意义好吧。
我带你们看到关键步骤里面,去带你们找关键步骤好了,唉挺好,第一步叫p v点,get value,pv叫什么叫property value,它封装了一个对象啊,叫属性value值,拼装一个对象。
第一个叫获取名称,我们的名字叫什么叫b叫b啊好吧,第二个叫获取value,获取一下我们b的value值,这时候当我获取完之后,我希望你把这个value值给我记下来,你看一下这个value是啥。
是啥叫wrong time being reference,啥玩意儿啊,什么叫wrong time been reference,这东西你可以不知道它是干嘛的,但是我希望你能先把这个词记下来。
我已经敲出来了,小long time been reference,你把这个单词给我记住,因为后面我们会用到这个wrong time being reference,往下走。
跳过在这一行叫resolve value,if necessary说如果必要的话,我需要去处理当前值了,我们这个wrong time be reference,它不是b类型对象。
所以我是一定要把这个值进行相关的一个,处理工作的,所以点f7 进去,当我进来之后,来同学们告诉我,我们的value是不是wrong time being reference,是还是不是,是吧。
所以这时候不谋而合,正好匹配上了,既然我匹配上了,我就一定能进到我的if判断里面去,所以先进行一个类型的强制转换,转完之后叫resolve reference,叫处理引用。
我需要把这个long time been reference,转成我需要的b对象的,所以点f7 进去,进来之后获取类型,判断有没有复工厂好吧,往里面进行一堆操作,不重要。
来往这看这处理的东西也叫result name,获选名称名称是b没问题吧,看这行代码套娃,从此开始叫this,点been factory,点get be,这是你第几次见盖的电脑,同学们告诉我。
第二次刚刚创建a对象的时候,我见过一次get变了,现在我又建了一次get变的方法,是不是意思好吧,所以现在我见到两次了,这是干嘛的,我说了,每次我在创建对象的时候,我需要先从容器里面去获取。
或者判断一下有没有b对象,我现在在b类模块是谁了,发生b了吧,是不是就相当有干一件事,我要判断一下容器里面到底是否有b对象,来到这为止,能听懂的扣一,问题吧,所以呢我点进去点f7 ,进来。
进来之后你看到了什么,第二个方法叫do get be,我再点f7 进去好吧,往下走,从容器里面获取,我们带对象,有b对象吗,现在现在有没有b对象啊,有啊,宋乾坤没嘛,没创建了,怎么会有呢,没有没创建过。
没有没有没有没有没有,所以这个对象依然是等于空的,电脑一空没创建的,所以肯定没有,你就严格按照我的标准那个步骤去走没有,那如果没有的话,你告诉我下一个步骤该干嘛了,下一步该干嘛了,创建b对象。
所以往下走走,跟刚刚的流程一模一样,一模一样一模一样,所以走到这行叫get singleton,我再点进去,get singleton,进来之后往下走,往下走,往下走,往下走,往下走,往下走,往下走。
找到我们的get object吧,来问一下这个get object,我要调谁了,我要到谁,create b方法吧,该调create bean方法了,所以点f7 进去到create bean。
再点f7 进去到create bean之后,我要找谁的,是不是该找do create变了,所以你发现了流程一模一样吧,你刚刚看别的流程,现在又是这面流程一模一样,所以原版为什么看起来比较难。
你如果真的把一遍捋通了的话,它并不难,你懂了吗,他一点都不难,它很容易,所以往下走走,我们找do cb走,do quin到这吧,终于到do魁的变了,然后当我到do魁的并之后,下一步在干嘛,点fc进去嘛。
进来之后往下走走走走就到这步了,叫create being sense,我这边不用不用带你们看了吗,它用来创建哪个对象,传递对象b对象,b对象,所以往下走完走完,我们来看一下当前b对象是谁。
叫b at 2171对吧。

我把对象留下来记一下,叫bat 2171,现在a等于那没问题吧,我现在ab对象全部都有了。

全都有了,全部有了之后,我再接着往下走,往下走,下一步啊,走走走走,下一步走走走走走走走走,走到这一步,你告诉我干嘛,这部也见过吧,这步是干啥的。

往三级缓存里放东西吧,放的是啥,来改了,待会k冒号是b value,冒号是谁,拉姆达表达式好吧,而我们这儿指的拉表达式就是下面的拉姆达式。

是放进去好了,放完之后结束了,回过头来我再接着往下执,行到populate b一模一样的逻辑,同学们还是找populate bgm c进去是吧,来走了走,跳到最后一行,跳过啊,跳过最后一行。
走到底行叫apply core devalue,再点进去,这时候问题来了,我的b对象里面有几个属性,一个吧只有一个a属性,只有一个a属性,所以往下走,我依然跳过这些无关紧要的步骤,好吧。
不管他走走走走走走走走走,来到这,第一个,我先获取属性名称名称是a,第二个我再获取属性的y6 值,来看一下当前的y6 值是谁,又是wrong time being reference吧,不是两个等式啊。
是wrong time been reference,叫装cab reference,运行时对象引用好,运行是一个变的引用,所以它是没有任何的一个变化。
叫long time been reference,还能搞清楚好吧,那一样的,我问一下,我们刚刚看的,创建b的过程跟创建a的过程一样不一样,一样的,所以我说什么叫流水线工作,他就是这样一个标准流程。
它没有任何区别,就这样一个流程,所以我们接着按这个流程往下走就可以了,好吧,往下跳一步到result being resolve value,if necessary dmc进去。
value是不是wrong time being reference是吧,y轴是不是也是这个类型类型,如果匹配的话,我进来进来之后,我要处理的引用了,要resureference,我再点f7 进去。
又回到这块往下走,往下走,往下走,获取到我们的属性值等于a,这是你第几次见到get病了,同学们第几次,第三次,那你告诉我,我现在的get bean是要get谁,是不是该改成a了,get a吧,一样。
我再进去点fc进来,又回到这了,读改变,我再点f c进去,是不是又来第三遍了,同学们,他是不是套娃,是吗,为什么很多学理不清楚,就算这玩意一遍一遍重复代码,重复代码重复,那重重复滚滚,一会儿学们就懵了。
所以别蒙,我就到目前为止,你们应该还能跟得上对吧,来能跟上同学扣波一,没问题吧,跟着我的节奏好吧,跟着我的思路去往下捋,往下捋啊,慢慢来啊,走完之后往下走,往下走来,现在我的问题来了。
这个时候我能不能获取到a对象,这这是个什么,能很多同学都告诉我,能如果能的话,那我们是不是要看一下这个get singleton,里面的处理逻辑了,我们看一下到底怎么过去的好,有人说不能不管能不能。
我们判断点逻辑好吧,总总没问题吧,我看一下到底怎么操作,这总没问题吧,我点f7 进去,再点f7 进去。

来看一下这一长串代码,很多套代码之后我蒙了,别蒙,我们挨个来捋,第一个,这是几级缓存,这几级缓存,三级你确定是三级吗,来吉吉。

signal vs吗,一级嘛先从一级里面取。

我问一下,按我们这个图里面画的一集里面有东西吗,一级里面有东西吗。

没有,所以这个值很明显,我取到一定等于空,mac不等于空,这个判断就很重要了,说single object如果等于空,并且叫is singleton curtly increation,什么意思。
说你当前对象是否在被创建过程中。

我问一下,我们的a和b现在是否都在创建过程中。

是吗是吧,所以这个等于处吗,所以这个条件能进来,进来之后我再从哪取,这是几级缓存,二级吧,我再从二级里面取那一样的,二级本身就等于空吗,他一定也取不到,如果取不到的话,我再往下走。
这儿有一个双重的一个星空,net的一个检查,检查的时候里面也是这样,先从一级里面取,取不到,再从二级里面取,二级里面取不到,再往这儿来叫this。singleton factories,点get。
我问一下,现在我是从哪儿取,到三级了吧,到三级缓存取哦,我从三级缓存取的话,我的问题就来了,同学们,我这个时候取出来的是某一个对象吗,听完问题啊,我取出来是某个对象吗,不是我取出来是什么。
是一个lambda表达式,所以当我取出来long表示之后,我需要通过什么方法来执行,get object是调理,get the project,当我这在调用get object方法的时候。

我实际执行的方法是哪个,是不是这玩意儿叫get early丙reference吧。

所以来我们点进去点f7 进去,你发现了,我跳到了get early been reference,跳到这块了,我再点f c进去好了,到这一段的处理逻辑了,这一段处理逻辑才是三级缓存它的精髓所在。
这个方法这个逻辑经费来,我们分析一下第一个步骤,并对象,我把当前的病对象是a把a at 1573,我赋值给了叫exposed object,什么叫exposed object呀,怎么翻译,怎么办呀。
叫对外暴露吗,这就是叫提前对外暴露对象暴对象暴露,谁暴露,是这里面的exposed obje好吧,然后中间这样的一个依据判断,既然是一个if判断的话,就涉及到一个问题,这个if可能进去,也可能不进去。
但是你返回值是什么东西,是不是excel object对吧,我刚刚如果我的衣服进不去的话,我返回什么东西告诉我听好啊,如果我的衣服进不去,我返回是谁,返回什么原始的a类项,这是对象。
如果我的if判断我能进去了,这个地方是不是会改变我们的exposed object,是不是改变怎么改的,我们先不管,但不管怎么样,我这个步骤到目前为止,我往下走跳过是不是直接返回了a,所以往下走往下走。
现在我取到a对象了吗,同学你好,我现在有没有取到对象,提到了取渠道了吧,a是a a是a at 1573吗,还是对象取到了,取到之后干什么事,看这个步骤,什么东西往哪放。
是不是该放到我们的二级缓存里面去了。

所以当这个步骤完了之后,我要往二级缓存里面移动了,这变成k冒号还是a但是value冒号变成谁了,叫a at有七三,但是现在的1573它是一个什么状态的,什么状态的成品,还是半成品,成品半成品,半成品吗。

是半成品,因为现在你你你这个snp里面b还是等于空嘛,所以还是半成品无所谓好吧,往下走,叫this。singleton fetories,点remove干嘛,我是要把三级缓存给移除掉了。

把三级缓存给移除掉,我们这儿不真的删,我把它标记为一个其他颜色,比如说这个色,这个色表示删除,我们不算三啊,我把这个表就这个色儿啊。

表表示删除,可以吧,好了,现在我也取到我们的a对象了,回过头来回头来回到这块,当我取到我的a对象之后,你告诉我,我还需要接着去创建a对象吗,需要吗,不用了吧,所以你再往下走的过程中走走。
直接返回b对象了,是不是,这时候我把a对象取到了,对不对,a b项提到了,我问一下啊,我问一下,现在我取到了a对象,我刚刚为什么要取a对象来着,我刚刚为什么要取对象,还记得吗,所以往下走往下走。
往下走往下走,再返回一直返回返回返回返回返回往下走啊,处理完处理完,处理完处理完处理处理完拿走到这步叫b w点,set property value给谁设置,给b设置,所以当这个步骤我走完之后。
现在我的b对象它是一个成品还是半成品,成明白a已经复制完了吗,所以你点开之后,你发现a对象已经有值了,但是a里面的b现在有值吗,a里面的b现在有值吗,没有吧好吧没有,不管它接着往下走,后面是初始化环节。
可以直接跳过,不重要好吧,咱们俩走拿走拿走,走完走完走完走完走完走完一直往回反好吧,这是刚刚创建b对线的过程,当我这块完了之后,来到这个方法里面,这还有一个方法很重要,是干嘛的。
叫adsingleton吧,你点mc进去进去之后往下看,叫singleton objects,点put snjs是几级缓存,极缓存,一级吧,b name等于b吧,snob等于谁。

b at 2171吧,所以现在我往我们的一级缓存里面放是谁了,k冒号等于b value,冒号等于b at 2171,它是一个什么状态的对象,商品对吧,成品对象好吧,成为对象。

成品完了之后往下看,叫this the snfactory that remove,这是几级缓存,这是几级缓存三级吧。

所以我把三级我再给它清空掉,移除掉对吧,然后回过头来再往下走,我再把二级给移除掉,二级完本来也没东西移除掉就可以。

就就就就移除掉了,无所谓好,所以走完走完走完走完,走完之后往回返往回反反反反,现在是反反到这个步骤之后,刚刚是不是去创建b对象去了,我问一下为什么要创建b对象来着,为什么要创建对象来着。
是为了给a对象里面的b属性来赋值,所以我去创建b对象了,所以现在我已经获取到我们的b对象了,那我剩下步骤干嘛,我是不是就该给a属性赋值了吧,再往上走走走走走走走,走,完到这个步骤叫bw点。
set property value,设置完成之后拿走这步骤,我问一下a对象里面,这是a吧,a现在里面是成品还是半成品,成品了吧,是不是这个过程了,所以现在a是不是也成了一个成品对象了。
成品完了之后往下走走走,返回好吧,直往下走,走完走完走完走完走完走完走完,走完之后到最下面到这块儿叫adsingleton。

也是往一级缓存里面放满,所以这我再往一级缓存里放对象,这是k冒号,a value value冒号,这写一个a at 1573,现在什么状态。

聪明的对象吧,完了之后把三级缓存移除掉。

把二级缓存移除掉,把它移除掉对吧。

当我移除完成之后好了,整个过程我就结束了对吧,a对象创建完成了,当a对象结束完成之后,回过头来,这时候该干嘛了,朋友们,刚刚别忘了我们有ab两个对象,我刚刚是为了创建a对象的时候。
我把b对象给创建出来了,但是实际情况下我b要不要创建了,b要不要创建了,一样吧,所以我接着取第二对象等于b,只不过b在进行创建的时候get get,这能获取到我们的b对象吗,能够获取到能吗。
因为一级好像没有了吗,还不能啊,大叔能吧,因为我已经放到一级缓存里面去了,所以说肯定能,所以当这部执行完成之后好了,我的b对象取到了,取到之后,我还有必要create吗,我是不是直接返回就可以了。
这个时候我的ab就结束了,这是我们刚刚ab已经结束这个流程。

所以刚刚我带你们debug过了一下这个流程,你现在还觉得模糊吗,有没有捋清楚一点,对吧,这个时候牛逼是不是该刷刷起来了,明白意思吗,你们为什么一直模糊,原因点就在于什么,你们从来没有像我一样。
跟着把这套流程给刷一下,梳理一下,如果你真的梳理清楚之后,他还难吗,你把每一个对象都放到这里面去,挨个步骤去迭代,它还难吗,它不难啊,最起码没你们想象中那么难,所以我一直给大家说,我说你注意了。
你一定要注意一件事,什么事注意思路和方法,这事儿比什么都重要。

懂了吗。
系列 6:P68:三级缓存解决循环依赖问题 - 马士兵学堂 - BV1RY4y1Q7DL
提问环节,提环节第一个问题听好了,现在到总结过程了,这个总结也非常非常重要,建好了三级或三个缓存对象,在获取数据的时候是按照什么顺序来获取的,第一个问题,123嘛先获取一级缓存,没有再获取二级缓存。
没有在获取三级缓存,所以当啊前面,到缓存中存在了,这么慢吗,我天哪,好诡异,我我我已经停了,他还在那个啥存在了对象,那么后面就需要把,什么缓存,对象,给清空,没问题吧,你想嘛你一级缓存没有了。
那么我二级三级就没有必没有存在的必要了,哎这个问题听麦同学给老师扣一,能听懂吗,我们一个来好吧,一个来第一个问题,来第二个问题,为什么,说如果只有一级缓存能解决循环依赖问题吗,不能为什么不能。
你告诉我为什么单例是因为单位吗,要是能死不就不写三级了,你别扯犊子好吧,如果只有一级缓存,那么成品对象和半成品对象会放到,一起这个时候没办法区分了,所以需要两个缓存来分别存放不同状态的对象。
一级缓存放什么东西成品,二级缓存放半成品,弄个不同的key key是我们的兵内,你能弄不同的key吗,大叔k是我们的b name,你能放不同的k吗,不能吧,所以最方便的,有人说老师我给你们一起缓存。
我在value里面,我给大家一个类型,value里面做一个标识不就行了吗,大叔的加一个123,你你你加多少个123啊,你加多少123,还有人说老师我在value里面封装一个类型,我给他一个标志位。
如果是一表示成品,如果是零表示半成品,你还要挨个取对象,判断取对象判断你麻烦不麻烦呀,你用两个缓存就可以解决这件事情,为什么要判断哪个属性值呢,累不累啊,是这意思啊,可以用语言方式。
但是你不能写那么low,在哪懂我意思吧,画这东西来,第三个问题,如果诶前两个问题那么多同学扣一,第三个问题,如果只有第二级两个缓存能解决,能否解决循环依赖问题,只有一级和二级可以解决吗,好了有说可以的。
有说不能的,那这时候我问一个问题啊,在刚刚在整个流程中啊,三级缓存一共出现了几次,几次,两次吧,第一个是在get singleton方法中,除了一次,第二个是在哪。
do create be方法的时候出现了一次,对吧,现在我做一件事,同学们做一件事。

能和不能,我们来分情况,说明我既然知道只有两个地方用到了好了。

我干一件事,找一下我们刚才方法叫什么,叫do create。

找一个方法,然后我把我现在的这行代码给干掉,这行代码是不是完成了三级缓存的一个一个,一个一个一个存放对吧,我把下面两行给解开,下面两个警察是什么意思啊,告诉我,看啊我把这行代码干掉了。
我把下面那行给解开,这是几级缓存,二级吧,也就是说我现在我存放完成之后,我不往三级里面放了,我只往二级里面放对吧。

这是第一个地方,第二个地方叫get singleton。

这里面吧我把整段方法我都干掉,然后我把这段数据逻辑解开,我自己写的好吧,这段里面有三级缓存存在的意义吗,往下看啊,第一个我先从一级缓存里面取,如果取不到的话,我从二级缓存里面取,如果也取不到的话。
我就返回空,现在还有三级缓存吗,没了吧好了。

如果没了的话,我们先来干一件事,我再按照这个逻辑我去执行一遍,我们的方法处理,看一下它能否正常,呃有一个lock,我把debug关掉,我把第八关掉,来把上面的lock给干掉,那文件表示锁定啊。
他不让你删,走,我把它删掉,我停了删除好吧,来重新执行游击run,这跟后置处理方案有啥关系啊,跟后置处理方案有关系吗,没关系好吧,来等我等我讲完好吧,先往下看,好了,我的ab有没有打印出来。
同学们看好了,我的ab有没有打印出来,有没有a b有了吧,我二级缓存能不能解决循环依赖问题,能还是不能,可以,但是如果他真的可以的话,为什么要加三级缓存呢,我来改一段逻辑,我把我们的配置文件打开。
打开之后,我把下面这段代码给解开,现在是干嘛的,现在干嘛呢,是不是加了一个a op啊,有的时候现在我就要把a b都创建代理对象了,然后这个时候我再来运行是吧,这个效果啊。

好了,非常抱歉,他报错了,报错呢,就这行代码,我把它代码粘出来,我先站出来,你站出来好吧,站完之后,我们这其实可得到一个结论,什么结论,如果对象的创建过程中不包含a op。
那么二级缓存就可以解决循环依赖问题啊,但是包含a op的操作,循环依赖问题是解决不了的,那你们这个结论理解的同学扣一理解吗,这么看这个结论好吧,然后这个时候我们再来看一下它报的错误凑啊,很多好吧。
我们我把它给你们截一下分割来看一下,其实这里面分了很多错误,但只有一行错误是最主要的,来看中间这句话,他说了,看到没啊,他说错误了,创建并name a的时候。
说ba的name a has been inject to other beans,说我们的a对象已经注入到其他病死了好吧。
然后音译roversion as part of socer reference,在情况演义中,but好吧,has evently been viper,他已经被包装了好吧,这是什么意思呢。
说this means that set other beans,do not use the final version of the bean,这几个字非常非常重要。
这说明其他病并没有使用最终版本的bean对象,那这个时候问题来了,什么叫最终版本的病对象,所以如果你能把这东西理解清楚,那基本上循环应用,循环依赖你就搞明白了好吧,所以我们现在来捋这套逻辑。

系列 6:P69:为什么添加aop操作后需添加三级缓存来解决问题 - 马士兵学堂 - BV1RY4y1Q7DL
第四个问题,为什么动态为什么添加了op这操作之后,就需要添加三级缓存来解决这个,这个问题好吧,那还是一样,我告诉你怎么做。

我们先试一下吧,我再把代码改回来啊,第一个把这个代码注释起来,我把上面解开,我们先看一下,当存在a op的时候,他能不能解决这个问题好吧,它解开,第二个我把这两个代码注释起来,我把它解开。
然后我们再重新测试一下,有机run看还会报错了好吧,结婚了给谁截胡了,好了有问题吗。

没问题吧,没搞错吧,就当我有了三级缓存之后,我a o p中存在侵权问题也可以解决了,这个时候很多同学能想明白到底是为什么,其实你在想为什么时候你就讲一件事,三级缓存它到底加了一个什么操作,三级缓存。
加了什么操作啊,同学们家长操作,创建代理对象不是,是不是只有一个添加,是一个get bean啊,get early,being reference,的方法还记得吗。
是不是只填了一个get ba的reference的方法,对不对,然后想搞明白这件事情,我想问一个问题,同学们在创建对象的来创建代理对象的时候,是否需要生成原始对象,需要还是不需要,需要吧。
有因为病的完整生命周期是这样的,我先创建出来原始对象之后,我再创建我们具体的一个代理对象,这个过程肯定是要的,对不对,那问题来了,当创建完成原始对象之后啊,后续又需要创建代理对象,代理对象。
那么对象在引用的时候应该使用哪一个,代理对象凭什么呀,换句话说就是一个宾name对应有两个对象啊,两个对象分别是原始对象和代理对象,那这个时候我在应用的时候,我怎么知道用哪个呀,凭什么你说代理的代理。
凭什么,你说原始有原始,凭什么程序是死的,它是不会像人一样,我去做一个智能的判断,说喂我刚才用代理了,诶,我感觉你延迟了,他没那么灵活,你想这件事怎么办怎么办,啊怎么办,缓存不是不是缓存在整个容器中。
有且仅能有一个同名的对象啊,当需要生成对象的时候,就要把代理对象覆盖原始对象,这句话能不能理解,覆盖吧,我是不是可以覆盖,我覆盖之后,我是不是就知道,是不是就可以指为对外暴露一个了,听懂理解吗。
啊来这句话能理解的扣个一,不理解的扣二,可以这么理解吧,你想嘛,我现在有一个代理对象,有一个原始对象,我原始对象是先创建的,带对象是后创建的,我在创建过程中,我是不是可以把我们的代理对象去覆盖掉。
原始对象,因为我覆盖之后就意味着我要对外暴露的时候,有且仅有一个对象,而不是两个对象都能对外暴露,能理解吗,就我不管我是否需要代理对象,我对象报告的时候,我只能有一个,我只能有一个。
但这个时候就又会又有另外的一个问题,什么问题,程序是怎么制造,在什么时候要进行代理对象的创建等等,所以怎么知道,我在进行这项复制的时候,我怎么知道我什么时候应该有这个东西呢。
所以这时候应该需要什么东西了,是不是需要一个类似于回调的接口判断,当需要第一次使用,第一次对外暴露使用的时候,来判断当前对象是否需要去创建代理对象,这样能理解吗,想想总结一下,想想。
当我第一次需要对外暴露使用的时候,我是不是可以判断对象是不是需要进行代理了,这个时候你再回想一下一件事,回想一下那个get early been reference,里面的那个if判断,这衣服判断。
还有东西吗,你想一下,你第三次在调用get in的时候,我是不是直接从三级缓存里面,我去我取出了我们的a b项,是从三句话里面取的,我是不是直接调用的是lambda表达式,里面的a对象。
能理解吗啊同学们想要这个想要这个过程,如果这个不理解,来我们看一下这个判断逻辑来找一下,完了电脑卡了,嘿嘿嘿,你们在吗,给我回个话好不好,没人说话了,来我们打开我们的代码,我们瞅一眼这个逻辑好吧。

找到那个方法是在这里面。

我们看一下这个get early be reference,点开点开之后我说了,中间这有一个if判断,在if判断里面,这个方法是可能去改变exposed object了。
那我们来看一下里面干什么事好不好,点开这个方法,找到它的实现子类只有一个吧,叫aboo abstract,auto corpse creator,你点进去,你再点开这个viper。
if necessary,你再点开下面的create property,你再点开里面的get policy,你再点开get policy,你再看实现类,你告诉我这里面干了什么事,什么事。
不就是创建代理对象吗,所以在刚刚这个方法里面,这个get early be reference这个方法里面,他干了什么事,就是用来判断,判断判怎么写,判断好吧,这个b在对外暴露,被其他对象引用的时候。
我到底暴露的是原始对象,还是暴露的是代理对象,但不管你是代理还是原始,我只能对外暴露一个。

听明白了吗,是不是这个逻辑右判断,如果需要代理就返回代理对象,如果没有代理,就返回原始,对象吗,是不是逻辑来这块儿能听吗,同学扣个一,所以这就是为什么我需要三级缓存的意义,在这儿。
三级缓存里面他为什么不放一个object对象,他放一放一个object factory对象,就是为了里面放一个lam表达式,当我需要第一次对外暴露的时候,我要判断一下。
我暴露的对象到底是原始对象还是代理对象,而我对外报的时候,我就没法判断,所以我先放到三级缓存里面,每次在取的时候,我要遵循一个123的顺序,所以不管怎么找,我都会先找到三级缓存,三极管在正在使用的时候。
就会判断到底是原始还是在于,这就是三级缓存的核心,明白意思吗,啊这块我觉得你们下去之后,肯定是还要再悟一下,我肯定还是需要再琢磨一下的,你想明白我写的这一段话好吧,李弘扬说。
为什么生成带对象要先生成原始对象呢,这个这个问题我不解释了好吧,我不解释了好吧,这个这个太太太简单了好吧,来刚刚这段有点感觉,听的有点感觉,同学给老师扣个一,老师是三级缓存,是属于a o p的。
刚才您将从三级缓存会对象这块蒙圈了,注意一件事,同学们,spring是一个框架,跟业务无关,没办法预先感知,是否需要,代理对象,所以整体的执行流程,会把所有可能的情况都考虑进去。
因此在存储的时候先要三级缓存扔一份,明白意思吧,这就是为什么要把三角块扔一份原因,因为你用了拉表达式之后,它传递的是一个函数,你的方法并不会实际的执行,明白吗,当你具体调的时候,你才可以执行。
懂这意思吧,随时才是,这才是核心o直接把带变量发出这款方行不行,不行不行,没有没有没有没有这个逻辑好吧,注意啊,你要想把带流量放到二级缓存里面。

你要判断一件事干什么事,你下去之后可以带着我们a o p的代码,你重新把我刚刚那个流逻辑和那个流程。

再整体的过一遍,过完之后你知道它到底行不行了,好吧,所以啊刚刚我写的这些东西,你要好好去琢磨一下,不是说我把这套逻辑捋清楚了,这东西就可以结束了,不是这样的,你要把它想明白,到底是因为啥。
他这样设计的好处到底是怎么样的,三级缓存放的是函数,怎么判断是不是代理,我说了三级缓存放的函数,你是不是代理,跟我没关系,但是我在获取对象的时候。

我是要进行判断的,刚刚那个if方法里面不就是判断吗,这一逻辑这一点会判断你是否需要进行代理,如果需要我会执行里面的东西,如果不需要我就不执行了嘛,明白意思吧啊所以把这个过程你要去想明白它。
它到底是怎么完成的,或者到底是怎么进行相关的一个操作的,好吧。

这是刚刚这个整体的一个流程好了,这东西我就聊这么多吧,为什么di注入的是原始对象,不是代理对象,你可以去看一下,你可以看一下di的逻辑吗,前面是你关注一下你,你把刚刚那个属性注入那个逻辑,你好好看一下。
你看一下这对象能否被注入进去,你试一下就知道了,好吧行了,别的东西啊,别的东西我们就不再聊了,所以我这节课,我重点讲的就是一个循环依赖问题,这种循环依赖问题很难吗,那我问一下他难吗,钢笔不错。
刚刚我改代码了,我把三级缓存给删掉,盖改成二级缓存了吗,只有二级缓存吗,我删了嘛,对不对,下方说这句话非常对啊,来看看下方说这句话,他说没有循环依赖的时候,创建的对象步骤应该放在填充属性之后。
初始化阶段创建代理对象,也就是说注意了,如果你有循环依赖,那么我会在get early been reference,里面进行代理对象创建,如果你没有循环依赖,那么这个时候我会在我们的bean。
post processor里面的after方法里面进行创建,它是两个环节,他互不干扰,明白意思吗,好spring它只是提供了一种机制,说我可以在一定程度上,解决你们的循环依赖问题。
但是你的循环依赖问题,我一定百分之百能解决掉吗,1388457同学,能面试逻辑吗,我只是说我有这样一种预防机制,它能预防一部分的错误,但不能预防全部的错误,懂了吗,所以你在写程序的时候。
有些情况下你还是会出现循环依赖的问题的,这时候你要找一下,你循环依赖是因为什么产生的,明白吗,需要什么产生的,然后你怎么继续解决当前这样的一个问题,那最简单的spring boot。
你在引用我们对应的那个叫什么那个data source,数据源的时候,是不是也会出现这样的问题,对不对,这个很正常好吧,他只能说我在一定程忘记,我不能说全部都解决掉,所以这个这个解决不了了。
所以他还问了,也就是说你这样的一个设计思想,他到底是干啥使的好吧,为什么网上看到三级缓存和二级缓存,可以互换的,从哪看的,把帖子发给我,我没见过怎么互换,换不了,好吧行了,这东西啊。
咱们大概就聊这么多吧,我呢花了一个半一个一小时。

40多分钟时间给大家讲解一下,循环依赖相关的问题,我觉得我讲的够明白了。

如果谁不清楚下去之后,你还是要把刚刚那个流程再整体去过一下,同学们记住了,我只能给你阐述思想,这个东西,你别指望说我一我我我讲一遍你就听懂了,如果我真的讲一遍,你就听懂了,那这东西也显得太容易了。
太简单了,它没那么容易,没那么简单,所以最关键和最核心的点在什么地方,你先听一个,大概有了整体的一个思路,当有了这个思路之后,你自己再去debug,再去过流程,再去捋,这个时候你的印象是非常深刻的。
而不是说你作为一个初学者,我压根儿没听过的一个状态,我就学这玩意儿,如果你是一个初学者,压根没学过两状态,一天的话肯定很难受,肯定很难受,明白意思吗好吧,所以把这个过程想清楚了,大叔能回答我的问题。
啥问题,刚才如果不加a o p的话,是不是就不会出现在对象了,直接选上,那肯定啊,你没有op的话,你串代象干嘛没意义了,6p本身就是因为加了一个代代理对象吗。

系列 6:P7:根据需求进行JVM的规划和预调优 - 马士兵学堂 - BV1RY4y1Q7DL
如何在实战之中啊定位jvm会产生的一些问题,比如说什么呢,它会频繁的fdc,看这里我这程序已经运行很长时间了,所以他在这里不断的f g c,这个fdc的时间大概一秒钟好几次好,当然还有一。
如果说它是呃产生了o o m和内存溢出好,这个时候怎么去定位它,但听我说啊,就是jvm的jvm课程,我是讲完了第一版前面的一点,我在2019年讲完第一版,现在呢再讲二,准备讲二点的课程呃。
现在加内容比较多,jvm这块儿是一个调优,这块是一个重点呃,我讲完第一版之后呢,很多小伙伴呢去面试啊,去在实际当中的环境之中去测试啊,发现了很多很多特别边缘化的东西,我打算第二版了以后呢。
给大家讲全了呃,比如说怎么定位这种直接内存的问题,direct memory啊,比如说如果一个j v m的进程静悄悄的死掉,我不知道有没有同学遇到过,就这y m进程啊,一般他死了之后呢。
会dump一个文件出来,结果他连dump都不dump,静悄悄就就被就被干掉了,有没有,有人遇到过吗,这个时候应该又该怎么去定位它,对,还会还会有静悄悄的,没错,好呃,今天呢我来给大家来讲这个内容。
作为jm的调优来说,大家听我说就,好作为呃jvm调优来说,它的内容上的包括的内容挺多的。

看这里,呃一般呢我们认为呢,这三项内容就可以都可以算作jvm调优的内容,第一个呢是根据需求进行这般的规划和语调,有什么意思呢,你要提前预估一下你的系统啊,将来是一个什么样的压力,它需要多大的内存啊。
然后在预算允许的情况下,选用什么样的硬件好,这个呢可以叫做预调油呃,在某本书里头,那书叫effective java,还是叫做叫做代码调优那本书我忘了呃,他会把成员的这个能力叫做成员的核心能力。
就是提前预估预估的这个能力好,第二个呢比如说你的运行环境慢卡顿,jbm的运行环境,我们在刚才的这个小程序你就会发现啊,他如果你在访问他的时候,他一定会变慢变卡顿,这是很正常的,为什么他把所有的资源都用。
都用来进行f g c了,你想想看他的木板能不卡顿吗,所以这个呢也是这边调优的一种呃,最常见的也是最容易被大家理解的,也是面试之中最容易问到的就是这个问题。
就是o o m om的全称叫做out of memory,内存溢出就是内存爆了,就这么回事儿啊,我呢给大家呢模拟了一个小程序,这个小程序呢我就不跟你讲这个代码,它是什么业务逻辑,是什么意思了。
总而言之呢它会出问题,而且呢如果大家能读懂这个小程序,这个小程序拿回去之后呢,你你你你自己跑一下,它会出问题,但是你真正把它想把它修改过来,也没那么容易,这个小程序呢做了一件事。
他会从数据库里面把对应的数据取出来,用特定的模型来对它进行过滤,那么这个过滤过程呢是通过线程池来进行的,我可以告诉你,问题就出在线程池上,但是它到底是哪出了问题,为什么会出这种问题,好,我现在面呢。
把这个小程序定位的这个过程和用到的工具,讲给大家听,这是我们今天要讲的内容来get到的,给老师扣一,我们可以开始了,你想要这个资料是吧,没问题啊,看这里我们有这个测试代码,我不跟你多做解释,总而言之。
这个测试代码呢是从数据库里面读出一些信息,来把这些信息呢组装成一个类的对象,这个类呢叫card infer,信用卡信息,它由big decimal,string int date这些个对象来构成。
这是它的成员变量,你记着这一点就行了,呃这个小程序运行了起来之后啊。

我先把这个给干掉,挺好的,他已经被干掉了,这小程运行起来之后呢,跑一段时间之后,他会不停的频繁的f d c,我们先来观察一下吧,跑一下小程序,看这里这个小程序啊,我对它进行的参数的设置是这样的。
xm 20兆,x m x20 兆,就最小堆呢是20,最大的也是20,防止内存抖动呃,只是打印了一些gc的特别基础的信息,为什么只打印基础呢,因为没给大家讲过gc的那个详细的认知信息,该怎么去阅读。
所以我把详细的认知信息打出来之后呢,反而容易混淆视听,还是那句话啊,学东西呢应该是先学梗概和脉络,我们先把最主要的矛盾给抓住,回车这小程序开始跑起来,这个小程序跑起来之后,他一定会产生各种各样的问题。
那么首先第一点,同学们,各位同学,首先第一点这些个问题啊,你是怎么观察到的,谁会告诉你你的程序有问题,问男友,你谁啊,这个日志不是日志,一般来说线上的系统应该是会有报警。
就是对于内存和cpu资源的相关的一个报警监控,监控报警,然后运维的人,运维告诉你说哥们儿你的成绩有问题好,你来进行排查,听懂这意思了吧,运维一般都是有报警之后,但这个报警呢,呃p8 课程里专门讲了。
这个监控和运维这块的内容,你得做一点点小小的开发,如果用自己特殊程序的话,然后把它挂到promise上面,或者是呃呃呃其他的这种监控工具上面,在咱们这儿呢我就用手工的给大家模拟一下。
你怎么观察到的小程序有问题呢,其实一个小小的命令就能观察到,看这里top一个小top就可以。

我们看这个top它所显示出来的进程,在这个进程里面呢,他会把这个我们每一个进程他用到的这种cpu啊,内存啊,都会给你列到这里,大家注意看啊,我们看这个c c c c p u呢。
它的呃呃呃使用的这种这种这种百分比。

你会发现它不断递增,内存这块是不是已经满了。

由于20张用的太少了,所以经满了,重新来再来一遍。


再来一遍啊,我们注意观察这个内存内存大小,这就是我们刚刚启动的那个小程序,刚开始你看它是4%,现在是4。3%,对不对,我们继续稍微等一会儿出。

嗯因为这时候他还没有进行f g c。

所以你看到的cpu的信息目前还占的不是特别高,你看现在已经是4。7了,我内存给的特别少,我内存只给了20兆,假如我内存给的特别多,给你到200兆两个g,你就会发现这块内存会不断的增长。
增长到一定程度之后,它不会降低,作为一个特别健康的jvm系统来说,你在里头不停地分配垃圾,他的垃圾回收器会不停的回收,所以它的内存的占比其实呢他不会说呃,就一下子特别高或者怎么样,而且呢它也不会爆掉。
也不会频繁的f d c,那么一旦发生这样的问题的时候,那一定是里边有内存的泄露,尤其是里边你通过读日志的时候。

你看它已经涨到嗯,内存已经涨到5。5了,尤其是你读日志的时候诶你会发现仔细读一下。

看看这个日志能不能读懂,你会发现一些问题没有。


这些日志呢相对来说容易读一些,看这里负g c表明我现在正在进行fdc是吧。

好的,已经out of memory error了啊,不管他。

你看啊,读一下这个日志呢。

它会给你显示出来f d c之前是19839k。

也就是20兆,回收之后是19838k what,这什么意思啊,就是这次f d c运行完了之后,只回收了1k那说明啥,说明他回收来回收取都回收不掉,回收不掉,回收不掉代表什么呀。
代表我内存里面的这些对象全都有用,知道吧,不断产生新的全都有用,回收不掉,说明什么内存有泄露。

都是活对象对都是活对象。

而且把你的内存全给你占满了,这不是有问题吗,当然有问题,所以下面呢就教大家怎么定位这个问题。

好图腾啊,问了一个特别牛叉的问题,图腾问了一个特别牛叉的问题。

就是这个问题是溢出还是泄露,来同学们这两个概念能理解的,同学给老师扣一,需要讲讲的,给老师扣二,溢出和泄露是同一个问题,不是不明白是吧,嗯我简单给大家说一下啊。

我先把程序给停掉,对。

好大家听我说什么叫做内存的泄露,我们先说溢出吧,什么叫做内存溢出,溢出非常简单,内存就这么大,个,允许你用20兆,结果20兆不够你用,因为你不断产生新对象,然后呢,而且这对象全都活着,这个时候填满了。
你20条已经满了,再往上填,已经到21了,爆出来了,一个盆里有水,水已经满了,这叫溢出,还有什么叫泄漏,泄露是啥,泄露泄露的含义是,你在这里分配了一块内存之后,永远不会被回收,听懂了吗。
就这块漏掉了一块,他应该被回收的,应该被当成垃圾回收的,可是你老有一个引用指着他,但是呢这个对象也没用了,这个叫泄露呃,泄露越来越多,再产生新对象就会溢出这个概念,不知道大家听清楚了没有嗯。
对啊刮香木箱举的例子非常到位啊,泄露就是占着茅坑不拉屎,这一出呢一出就是坑满了,再拉就拉出来了,我勒个去,花香木香,你太恶心了啊,好不凉了,我们继续,这就是泄漏和溢出的关系。
其实啊老师这个小程序有的时候会产生泄漏,有的时候会产生溢出啊,他就是这么的怪异,呃,总而言之,你会观察到它会不断的占领内存,那他不断占领内存的时候,我该怎么去定位它呢,好听我说呃。
作为一个远程的在线的工具来说。

有一些那种你可以用到的图形化的工具。

比如啊你只要是装了java的话,c program files,然后java只要你装了java的话,它会自带一些图形工具,这些图形工具呢,是可以远程连接到你的服务器上的,比如说常见的图形工具有哪些呢。
我不知道大家有没有知道的,第一个呢是这个j console,是这个,其实这个jiso呢嗯你你你你可以连远程进程啊,也可以连本地进程都可以,连我们随便先连一个本本地吧,a d。
ok它就会连到我们本地的这个这个这个进程上,然后你可以观察它内存,观察它线程,观察它类观察什么啊,这是图形界面,除了g consol之外呢,java也提供一个叫j v a v m的。
这个会比j cos的稍微的界面上更漂亮一些,那么这个界面呢也是可以连接到本地的,也可以连接到远程的,好吧,比如连他自己本地的好,你就可以监视到它的一些个内存的变化,可以看到它集中间的一些个线程。
也可以对内存进行一些抽样等等,我一会儿给大家讲这是什么意思。

呃总而言之,我们是有一些图形界面,如果有同学听说过的话,那么呃观察jvm来说,观察jvm来说,还有一还有一些比较著名的图形界面,它是可以功能更强大,但是呢它是收费的。
不知道大家有没有听说过j profiler啊,这个工具呃,目前来讲呢,如果你要用图形化的界面,它的功能应该是最强大的,但是很不幸的是,这哥们儿是一个收费的,所以我懒得去讲它,好吧嗯,但是有同学说。
老师你今天是要讲这个图形界面的工具吗,能不讲为啥,原因很简单,如果你跟面试官聊说,呃,我观测我们在线系统的图形,是用图形界面观测的,我跟你讲这个百分之八九十说不过去,虽然说啊确的的确确。
有一些系统是通过远程的这种工具进行连接,然后在远程界面上去观察它,但是啊大多数的,尤其是那个负载特别重的那些个系统,你上线之后,它是不允许你打开端口,通过远程图形界面去连它的。
不知道我能不能说清楚这件事,我再说一下,虽然说你在本地,你可以测试你自己的机器,这个没问题,但是如果一旦上线之后,在远程大多数都是linux的,环境,然后你要你想远程它的话。
你得通过远程的这种这种图形界面的工具,去连它,那么你连他的话就需要它开放一些端口,就增加了不安全性,另外呢也会对它产生一些负载,就是很这个负载倒是很正常,所以大多数情况下,我们做在线定位的时候。
往往不适用的图形界面,ok不知道我说清楚这件事没有,但有同学会说,那老师要面试官要问我,我说什么jv o v m。

我能圆得过去吗,作为老师这么体贴的人,我当然会教你圆过去的方法,其实并不是说老师不会给你讲这个啊,就是这东西呢我我我完全可以讲给你听,但是没意思了,就是远程连接到底该怎么连,呃。
我在文档里呢也说的特别清楚啊,那个你只要照着文档做,你想做远程连接的这种图形化界面监测,是没问题的,但是问题在于你是怎么跟面试官聊的,好吧,面试官怎么聊啊,你说我用的是图形界面工具。
那面试官肯定会问你啊,what你还能够在你的生产环境里头去观察,你们的生产环境里头的,用用用远程连接去观察吗,就不单单定位它吗,就把它内存给它导出来吗,肯定不行,但是你怎么圆过去呢。
你能你能自己圆过去吗。

我教了大家四种说法,好吧,ok在这里不展示了四种说法,你们自己去想啊,好,左拐去人事部签合同,ok可以啊,今天呢教大家专业一点的工具啊,对在测试环境没错啊,这是可以的,还有能能比较更牛逼一点的是。
我有高可用,你懂吗,我有高可用,我这两个都是一样的,然后呢我先干掉一个,我先给他隔离一台,然后我在其中一台上做观察,这可以吧,没问题啊,这个也可以嗯,还有一种呢是在测试环境,这是没问题的。
测试环境怎么做呢,像现在比较牛叉的一些个公司,它会有那种流量流量的呃,这种复制流量复制或者是什么流量的重放,就是大数据的重放过程,今天白天双11来了多少个量,这些量什么时间来的。
什么样的一个并发量过来的,我都给它存储下来,然后我在我的机器上可以进行重放,重新压测,那么这个时候我就可以通过远程的工具,去观测它了,嗯pcb cb没错嗯,呃这个过程不知道我说清楚没有。
也就是说你说你说你用的图形工具,你得能圆的过去才可以好吧,好能get到这点的同学老师扣一,当然我建议大家如果你说定位的话呢,呃用比较好的工具,这个工具呢叫做office,我建议大家用这个。
虽然说java也自带了一堆的这种命令行的工具啊,比如说gps这个也会用到,ok那个那个进程已经死了,那进程已经死了,所以就找不着那进程了,再把它骑起来,再来个shell吧,one two。
比如说gps它能找出来我的整个系统里面,现在正在讨论的jav进程,比如说这inf 1474。

他能给我列出来,我这个java进程的一些特殊的信息。

比如说jd gg c1474 。

ok他能给我列出来我的gc的一些信息啊,比如说像jdg诶。

1474,它能够给我列出来那些个里边的线程啊,比如说还有一些其他的,比如gmap,这个用的也非常多,一会重点讲它等等,这里面的虽然说有有这种命令行工具,但是我跟你说,这些命令行工具用起来都不太好用。
我推荐大家用的是阿里开源的工具。

叫做开源神器啊,叫做alice,这个assets我就不在这,我就不给大家讲怎么安装了,这件事情可以接受吗,咳咳我主要给大家讲讲ars怎么用,它的特点是什么,好不好,不不讲,怎么安装了alice呢。
你如果想自己安装,由于alice是阿里开源的,它有中文的文档写写的特别的呃完善,所以你看着装就可以,我已经装完了啊。

ass下载下来之后呢,解压解压开之后呢,我就解压到这个目录底下了,ass 3。1。4,现在好像新的版本已经超越这个版本了,你可以用最新的,作为阿森来说,它也是java写的。
所以你只要启动它这个ja文件就可以了,ok大家看这里这个others呢就已经启动了,阿特兹启动之后,它会自动的检测到有java进程,检测到一个ava进程是哪个呢,1474,当然它的内部编号是一nas。
就是说你哥们儿你让我监测哪个进程啊。

你告诉你告诉阿三四,我让你监测第1号进程好,他就已经attach上面去了。

但是很不幸的是,第1号进程好像又又死了,roc我们把它的内存稍微放大一些。

再重新来。

100兆。

100兆回车重新启动,others。

1号进程挂上去好,当你看到这个界面的时候,ok已经进入界面了,在这个alice里面有一些非常好用的命令。

如果你不知道这些命令怎么用,help,他会帮你把这些命令全部给你列出来,在这里我教大家几个比较常用的,比较漂亮的命令,每个命令怎么用呢,它的功能非常强大啊,你如果不知道怎么用的话,你就怎么办呢。
就就就就跟他,呃你就去读一读一读他的文档就可以,文档写的比较简略好看,这里啊呃第一个比较常用的命令叫什么命令呢。

叫这个vegetable dashboard的中控台,当你敲这个多控台之后,它会给你列出这么一个界面来,这个界面是什么意思,刚刚的我们那个java进程,在这个java进程里边有多少个县城,看到了吗。
这里都是现成的名字,破万thread挤,破万thread挤,以及timer线程以及互换线程以及main线程啊,刚才你都看到了好,他是怎么排列的呢,它的排列是以cpu占占比来排列的。
看看哪个cpu的占比最高,他就排在第一个。

所以通过这个进通过这个界面,你能够观察到说哪个哥们儿呢。

它的cpu的占比是最高的,他是不是有问题的,是不是超了超了超了cpu的,你预期那个占比了,你去定位他下面这个面板里边装的是啥呢,就是内存的一些大体的情况,比如ispace现在是多少。
survivor是多少,tenure是多少,tenure就是我们的老年代了,nhp非堆内存是多少等等,我在这里,这是我们的max,你你你你如果观察一致啊。
你就会发现呃我们的tenure generation,他一定是在不断的增长,就是老年代是在不断增长,增长的应用程度之后呢,还下不来,回收不回去,这时候你就关注内有内存要溢出了啊,下面是一些普通的信息。
我就不说了,当然这是dashboard。

除了30本之外呢。

还有一些比较常用的其他一些命令,我给你讲的时候呢。

我想干嘛呢,通过一个面试题来讲吧,呃作为jvm的常见的面试题,有的面试官是这么问的,他说如果你一个java进程,他的cpu突然暴增,原来正常就占个百分之五六十的,突然间最近占比居高不下90%以上。
请问如何定位问题,好这个问题大家听懂了吗,你们可以试着回答一下,这是面试里头经常会被问到的,top gun hp,top gun h,我教大家怎么用top找到进程,这不是废话吗。
呃我教大家怎么用这个这个,office去定位它,接着刚才这个你就可以。

dashboard就可以啊,这是最简单的一个dashboard,呃,dashboard的这个你会观察到,如果有某一个进程,某一个线程他老是占比占的比较高,那么就说明这个线程有问题,这点上大家能理解吧。
这非常简单,但是呢呃在说到这儿,我我我多多跟大家聊一点内容,呃扩扩充一点小小的内容啊,我们打开那个阿里的内部的规范,打开一下,嗯我们,不是。



浙公网安备 33010602011771号