00:00
去阿里美团面试的时候,如果笔试提上,人家跟你讲写个生产者或者什么,问一个什么阻塞队列,什么乱七八糟的写这个。下面我们需要给大家串串。第一个。所有的知识给大家创下外。是不是没用过啊,那上次啊,我们讲过一个什么刀并发下面的双端检索机制,我们是不是用过byla。第二个CS里CS理念。第三个奥。Integer。第四个干嘛阻塞队列啊,它写了,那么这个时候干嘛呢,考一下。再来县城交货。一个case全串起来。那么也就是说,你为什么要按照我的学习方法?没什么窍门,理论,每一个知识点,一个理论,你一个小DEMO,然后。
01:04
升级怎么玩,你把所有小DEMO。这个我们讲过了,这个讲过了,尤其是什么原子引用。你能不能把所有的小DEMO、小知识点再做个大的案例再串起来呢?一级级的迭代去升,那么这个时候你绝对牛逼,你的技术掉不下来,因为你学到了根本。学到了不变的这些东西,那么好,同学们请跟着我来。老规矩,是不是还是县城要操纵资源赖?那么来吧。我们现在要干一件什么事呢?3.0版。那么这个3.0版。哎,写不下呀。同学来。上一版传统版,我们企业生产者,消费者要不要我程序而后着。我是不是wait和饭,那么现在我们希望呢?哥们儿,你这么干?
02:03
开始啊,什么叫开始啊?我给你个条件是错。直接这边。生产一个。消费一个。生产一个,消费一个,生产一个消费一个,生产一个消费一个,这么说同学们能不能跟上?只要我这是错,你们就干这个事儿。而且100%保证你不用,不许你程序员,不许增加程序员的负担。干嘛?你不要自行去控制,什么时候wait,什么时候notify没了,3.0版是高并发版本。那么这个时候你只要给我阻塞队列。我拿这个队列,OK,你不要自我判断,结果呢,我说开始生产一个消费一个,生产一个消费一个,来五轮,然后我把开总开关一关。
03:00
假设这儿。我给他干成了force。OK。玩火。程序结束。同时关闭生产者、消费者,然后生产者停止生产,消费者给定一个时间,超过两秒钟了没有获得,生产者在队列里面有新的东西,我取不到了,我也走。言下之意,通过这样装在这个里面的就是我们的一个阻塞队列来模拟这个东东,这一步同学们能跟上。消息中间键基本上就有这种思路的影子,理解下面的什么不变的这些东西,好,同学们跟我来。首先。是不是有个true和false啊。好,那么呢,二话不说,Private。布尔型flag等于。错。
04:03
默认。开启进行生产加。消费。兄弟们。有没有多线程的交互啊?我这个案例,我刚才所说的这个诉求有没有,是不是要生产一个消费一个,生产一个消费一个。这种情况下。必须要保证线程之间的可见性。大哥,生产好了,马上提醒你过来用,消费完了马上告诉你重新再生产,我消费完了,所以说高并发下的程序。Volatile。好,我们的第一个知识点串起来了吧,第二个刚才。杨哥所写的是不是number加加?那是因为干嘛,兄弟你自己加了洛克安洛克你在里面用I加加这个是没问题的。现在。干嘛进化了,不要用那个了。
05:02
多线程环境,下面说穿了就不许用爱加加和加加,爱妈一定会给自己埋雷,你说没事,我技艺高超,胆大可以妄为,恭喜你,莫装逼,装逼是遭雷劈啊。过来。像我能活到现在,就是尽量选择小心保守的路线,干嘛有稳定的输出不出错。Private。用这货。Tomic integer atomic integer等于六。那兄弟们告诉我,这事默认值是。多少?是不是零啊,这一步啊,同学们。能不能跟上?好,那么接下来OK。开打。这两个,一个就是我们这儿这个标志外。另外一个干嘛,就是这的生产一个消费一个,生产一个消费一个,这一步同学们能不能跟上。好,那么这个时候呢,我们呢,开弓。
06:02
请问我们刚才讲了阻塞队列的落地有七种,我们用哪一种?有哪一个?来考考你们的架构。抱歉。一个都不要。而是。七个全用。你现在不能写死,尤其你如果去是吗?阿里基础架构部,你写的程序是给上面一大堆程序员,就是说哎,兄弟们,你们都要碰到这个问题是吧?有一种程序我最佩服的那是干嘛,我原来在的公司基本上在雅兴的时候大神特别多。当然,好汉不提当年勇了哈,我们八零后去的公司跟你们九零后不一样,人家就是你们有什么问题啊,哒哒哒哒哒哒哒好。20个程序员或者五个程序员以上都碰到这个问题,行了,我给你们写个抽象的,你们来,你来叫我就行了,你们五个人不要写了,你们写也是浪费时间。那这个时候呢,你就调用一下就行了,那么什么概念,凡是你写架构程序。
07:03
人家问你用哪一个的时候,你一定要注意。通顺适配和通用什么意思啊?传接口不许传,具体的类听懂了吗?那么所以说这个时候干嘛呢,比方说。你现在就不能够写什么?哪一个具体的什么AR瑞blocking,你应该什么通通适配,那么这个时候干什么呢?来blocking等于那兄弟们没问题吧,那么请问右边是哪一个?答案是不知道,你必须把你的口子放的足够宽,足够大,随便只要实现了这个接口的所有子类你都要满足,那么这种代码你写的才是人家要要的。那么这时候干嘛?Spring里面干嘛?依赖注入有两个是必须要学会的,第一个叫set get,设置注入,第二个叫什么构造注入。那么言下之业,我怎么知道你这个block king现在是什么?不知道怎么办?最简单的方法是不是要构造注入方法,构造方法传进来是哪一个就是哪一个呀?你传过我是lo,艾block king宿组阻塞队列,那么就是数组阻塞队列,你给我的是link的block king,那么就是链表阻塞队列,听懂了吗?
08:12
所以说这个时候干嘛,你不要只编编编编扯淡,那编完了他就废了。过来干嘛呢?只有这么一个。来,兄弟们,你跟我讲。我下面要调用,你调用这个类的构造方法,我传传的是传一个block的一个接口,凡接口是不是需要有实现类,如果我现在传的是I瑞list,哦不不抱歉是A瑞block king,那么是不是就是A瑞版传的是link版,是不是link版,你这样程序是不是就通用了?那么这就是什么?你永远看看一个高级五年工作期内那个Java高级程序员他写的方法,你会发现一个问题,高手都是传接口,绝对不会传类。传来的一定是水货,这就是我说的这个层次,它最多也就是三年工作经验,2万块钱封顶啊。不可能再高了,不能再多了。过来,我们往下翻。
09:01
那么这个时候。如果我让你来判断,我用的是哪一个传进来的,你怎么判断?比方说我现在要求你,你做架构的时候打印出。你传的是哪一个接口?你这是干嘛?你要给我把传进来的这个落地实现类的名字完整名给我打印出来,我这个时候是在后台一看哦,这次调用传的是阿瑞,下次调用传的是link,再下次是S考这么说听不听得懂,那么这是干嘛?基本上标配的程序。你只要传了我么干嘛?是不是synchize啊干嘛?look.get class.get name拿反射一打,是不是知道完整的类名和报名啊?哦,我就明白大哥,你现在传的是谁?给我坐等的给我干活的是谁?我告诉你这种哈,一定在你调错的时候会用到,因为只要人家给你写的基础类传的是接口,这个程序不出错是因为传的是艾瑞,只要另外一个程序传的是link可就错,那么这个时候你必须要有后台有一个日志上有个排查,到底传的是谁,你不能跟人家讲我传的就是block,传一个接口写能就是什么写。
10:03
足够的抽象往高处写但查,足够的落地往细节落地听懂。好,那么来,兄弟们。这三步一搞定,我们开打public avoid my product,这个就是我的生产。Exception。那么来了,我是不是得先生产才能消费,那么好,根据我们画的需求架构图,那么只要这个货是出生不生产。生不生产?第二个我们讲过了,只要是多线程交互,用if判断还是判断。啊,一定要记住啊,那么这个时候呢,过来看。Well。Flag,妈,这就牛逼了。干嘛呢?来。首先。我们呢,你补了个king。干嘛呢,你这个东东,你是不是要往这个阻塞堆里面放入数据啊,那你这个数据哪来呢。邻角也。
11:01
家家爱。加加I,听懂这个意思吗?And get,这一步同学们能不能跟上?就这种就是高倍原子版,原子版的整形它不会错,你就不要去关心什么爱加加加加爱了,听不听得到,那么来兄弟们。那干嘛呢,我要传一个什么类型进去啊。什么动作啊,什么出。这一步能跟上,那么言下之线这货默认值是零,零加一后是不是就是一代?那么好,我们干嘛呢?好,没有表达式,那么这块我们来看一眼,这块是个string。注意尽量的把这些代码呢,写在外面啊,你在这个里面要是写的话,它是不是外处不停的有string date呀。那么好,这一套。就等于这么一个。这哥们是除个数字int int连一个串,是不是就是个字符串,那么字符串是不是可以付给他,这一步同学们要懂。
12:01
好,开工。那接下来我有值了,有值了我就要开始造broken。第二,我法。刚才是不是讲了知道为什么我要花那么多时间去给你们讲那个AP了吧,那么刚才讲了四组。工作中用这个,为什么呢?兄弟第一个传数据,这个数据是不是就是刚才的这个。对,能跟上。我们呢,两秒钟取一个,为什么是两秒呢?是为了让大家眼睛好看,仅此而已,听懂不是刷运行完了看不到效果,听不听懂好过来。那么这哥们出什么出什么货,说布尔值啊。那么注意啊。你千万不能这么写啊。你这么写有没有错?没错。谁也不能说你错。但是不好,因为这个话是个Y错,听懂了吧,你这边左边的引用是不是特别多。尽量复用啊。那么好。那么一样。
13:00
布尔值value。默认是Bo,我就不写了。过了,兄弟们,这一波能不能跟上?好,If return value干嘛呢?是错代表安全这个线程。那么干嘛?是不是?插入队列。数据。那么这个时候我们的。Data。同学们。我去。能跟上。否则的话,哥们儿怎么着,你是不是插入队队列就挂了?这一步听不听得到?这一波兄弟们能不能跟上?好,那么这个时候呢,干嘛呢,只要这个外要这个错,那么他呢,就一直在这外要外要是不是就在生产生产生产生产。为了给大家好看,我们一秒钟来他一个。
14:07
那么欧拉。兄弟们,你不能一直这么生产,我们坏了这个需求了,这个生产有没有一个时间段。有没有?什么意思啊?这个false默认是啥?如果。大老板说叫停了,改为force了,他还能不能生产了?不能了,就是叫停了,整个动作听懂了吧,就跟你消息中间键在那个阻塞队列里面,消息中间经常就这样,好消息停限流,不要再往里面塞了,死了塞塞就倒了,好吧,全部县城停下来马上就好比说我高速奔跑,猛地一拉闸急刹车,那么这时候干嘛呢?如果这个。Flag是force了。马上打出来,那么干嘛呢。这个线他老板叫停。
15:00
那么这个时候。表示。什么呢?Flag。等于或了。生产动作结束,这么说,兄弟们能不能跟上好?这波。完活了。那么来了。那么下一波。这波是生产。这波就是消费。提示一句,兄弟们。哥们儿,我在干,杨哥在干这活的时候有没有加啊?有没有落落考?更不可能有wait和notify。3.0版。我过来。我们消费。早啊。一样。我呀。Flag,注意啊。这个flag,我开始生产这个flag。
16:03
错,我是不是也就开始消费,他们两个是同生共死的,要么一起干,要么一起提,消费和生产是匹配配对的,OK,那么好。接下来。干嘛呢?第二,Offer的另一组是不是poor?老规矩。我。两秒钟。等不到我也就不取了。听懂。干嘛呢?对象。那么好。这个对象是string类型。过来。那么兄弟们,这一步没什么问题吧?好,那么假设。如果一切顺利,那么呢?这个时候我们呢。那么呢?这边是插入队列乘高,那么这边我们是不是就可以写什么呀?
17:04
消费队列result成功同学们,同学们能不能跟上好,只要有我,两秒钟以内我,你看我不管别的,我就是。两秒钟。的等待时间,反正我就往这个阻塞队里面去取,取到了我消费队列,比方说取到的值时时,我成功了就打印出来,对不对。但问题什么取不到怎么办?第二个问题,细节在这儿,兄弟们。大老板叫停了。表示flag等于force生产动作五秒钟以后,我把flag降为force了,如果在这块你取不到了。会出现什么情况?如果。那等等,Out。或者。兄弟们。
18:04
那这活干过吧?没问题吧?我们干嘛呢?也就是说,还他。我们这样啊,三步,第一步flag出开始。生产一个消费一个,生产一个消费一个,生产一个消费一个,生产一个消费一个,没问题吧?大boss叫停,五秒钟以后停。不生产了。那么兄弟们。由于我们这加了V了VT,只要这个flag从处变成false以后,所有线程是不是立刻感知到这个叫V的,可见性能跟上,那么这个时候马上跳出这个while打出来。大老板叫停了,表示flag等于force生产动作结束,我不生产了,但是你跟我讲消费,那哥们在不在消费上?他在他傻傻的等着呢,那么这个时候他正常情况下。取打出,取打出,由于你是阻塞队列里面值不会空,所以说就弄成这样,但是如果只是空了呢?
19:02
我恭喜你。干嘛?这个时候。我也要停啦。听到,那么这个时候干嘛呢。好,我们继续。那么这块呢?要打出个什么东东呢,那么这块就是。我这儿时间多久?超过。两秒钟。没有迟到。蛋糕。那么呢,消费。退出。好。你退出可以怎么退?一定要加这个,否则你的生产那停了,你在那等等,等你死定了。那么这个时候干嘛?
20:01
消费队列。再加个蛋糕吧,好看一点,OK,那么来,兄弟们。说一下。我说。这个这个。那么呢?这个。构造方法。生产消费两个方法能跟上好,那么接下来继续。马上结束啊,同学们再咬咬牙,坚持一下。来。兄弟们,报没报错?为啥没有空仓构的方法?这就是我刚才问你们的,你们到底传哪个阻塞队列?我们用block用接口,是不是七个小矮人都能传?好。过来。然后三。或者你就写多一点,13和十都够你用来吧,你用十,那么来兄弟们,这个是不是我们的生产线产。
21:01
浇地。那么。干嘛呢?我这边。生产。那么这个时候。过来。那么干嘛呢?这边。生产线程。启动。那么呢?resource.my product。那么同学们。干嘛?这时候我是不是出来开始给它包起来好?那么下一轮。干嘛呢?直接consume。消费现场。消费线程启动,那么这个时候同学们点my consumer。这一步,兄弟们能不能跟上?那么好注意有没有完呢?
22:01
没了。Public VO stop。Exception this?Flag等于force,这是我前面所说的大老板叫田。那么什么概念呢?魅县城就是大老板刷过来,那你们就爽了。你们干嘛呢?给你们玩五五秒钟。那么这个时候。五。秒钟时间到。大boss。或者叫什么的大老板。喂。县城叫停。
23:01
那么呢?活动结束啥意思啊?这块是may先生下来my resource.stop兄弟们,这一步能跟上你stop以后你懂的,这个flag是不是设成force了?Force以后由于由于是velatile修饰,所有线程马上可见,及时通知听懂。那么这个时候。同学们,我们呢,简单的跑一下,我们的程序有问题,咱们再说,因为它东西比较多,一个问题是不是解决了很多知识点串烧啊。那么好,那么下面我们呢,来简单的来看一眼,那么如果说不好看的话呢,同学们在这。因为消费了以后干嘛呢,最好有两个回车,也给你们看得到。来同学们开始。好,我现在传的是不是这货。I book大家请看,那么现在生产者启动消费者现成启动,插入队列一成高,消费队列一成高,插入队列22334455,五秒钟时间到大boss大老板妹叫停,现成活动结束。
24:10
生产者消费生产者现成一听到大老板叫停了,表示flag已经被设置为错,生产动作结束,Consumer现成,我超过两秒钟了,没有取到蛋糕,消费退出,打完收购听懂。能跟上好,那么这边的话呢。来我们来稍微的呢,简单的呢,来进行一下调整哈,你看这块是不是消费线程启动。那么这消费线程启动,如果说你要是再不好看,我们再来一次。我这给它弄出来,相当于说这是加个空格啊,那么这块就是生产叉叉叉叉叉叉这一大堆,那么可能刚才太紧凑了,同学们看着不好看。1122生产三消费三生产四消费四生产五消费五五秒钟以后。
25:00
整个消息队列退出能跟上,那么这个时候大家搂一眼。大了,大boss叫停,你大boss叫停是不是叫这个stop方法,那么这个stop方法就给这个flag表示为force了了,Tell收到收到。生产者马上表示支持,要停了,生产动作结束,那么你生产动作结束以后,我consumer是不是还在这傻傻的?取着呢。这块干嘛呢,只要。我等于force了。也是。两秒钟没取到,我彻底退出。那么。来,同学,同学们这样是不是我们还记不记得刚才我们讲阻塞队列讲过这么一句话。很抱歉在这儿。以前的什么传统版,每个程序员都必须去控制这些细节,尤其还要兼顾效率和现场安全,我们以前写的话,是不是那个传统版,是不是要自己写wait合同去。
26:01
但是现在。我们不需要关心什么时候需要阻塞线程。什么时候需要唤醒?因为这一切阻塞队列都给你包办了,那么同学们,我们看这个新版的3.0版,我们唯一能控制就是初二和force,其他是不是一套带走啊?好,那么这个它是后面大家学勾UC高频发,下面如果底层消息中间件基本上都会有依照类似的影子和思想,那么这个就是我们新版的3.0版。好,那么呢,大家下课休息一下。
我来说两句