00:01
接下来。我们架构梳理也全部完成了。对对对。包括同步队列。好。那么。主次队列你用上了?生肖。不是十二生肖,那个生肖生产者消费者模式。宣传。下降。我们会看到。一餐全退货。消息中间键。那么其实你只要把这两个整明白了。这些你通不通通懂?你一定要要学那些不变的,天天变来变去,那根本没有任何意义,那都是虚的,不变这些才是真的。好吧。我们就以生产消费模式创起。我们。全部的高并发的知识,一个case。全部拉下来。首先。先写传统版。那么什么叫传统版呢?我们讲过啊。
01:01
首先呢。兄弟们。以前。大家都知道。你要懂。这是第一组。第一大。那第二组呢?这个袋子。洛克皮的。然后呢?Wait。被wait体态。Notify。Things what?我们呢?1.0版。过渡到2.0版。杨哥今天要给大家写的是高并发下面的。3.0版。但是呢,为了给大家复习。
02:03
我就从最底层往上攀科技树。从最原始的写到最高端的。两个case,彻底复习。传统版。那么也就是什么。大家在学我GUUC之前。说白了,就是在学阻塞队列之前,我们怎么来解决这个问题。初始值为零的一个变量。两个线程对齐交替操作,一个加一,一个减一来五轮,那么大家你懂的什么,一个加一个减,一个加一个减,模型一套,这不就生产者消费者模式啊。好,那么这道题目的变种题目和变形题目我们要干嘛复习,至少。如下知识点。第一个多线程的企业级模板口诀。高并发。下面的话一定注意。那么一定是高内聚低耦合的前提下,线程操纵资源类。这是我们的内副对联,杨哥讲的对联的上半联。
03:01
那么下半年是什么?判断干活唤醒通知。有对联就要有横幅,横幅是什么?那就是严防多线程并发状态下的虚假唤醒。这三条上面包含的知识不下八个,自己脑补讲过口诀,就这三句口诀没那么多书啊,那些书写厚了是故意卖钱的,我卖你,我卖给你的话就是一张A4纸就完了。好,那么接下来。我们呢,来看。按照我们的口诀来看。首先,一个初始值为零的变量,两个线程对其交替操作。二话不说。我们说过一言不合,只要是多线程的操作,是不是一定需要有个东西叫资源赖?能跟上线程操纵资源类,我的口诀第一句是这个那么好。暑假就醒了吧。
04:00
姓柴。操作。资源类什么叫高利聚体耦合呢?也说过了,说白了。尽量切啊。现在。一个初始温度为26度的一个空调,有两个同学要对空调交替操作,一个同学要让空调深一度,一个同学让空调减一度,那你跟我讲这部空调是不是就是两个同学要操作的资源赖?你再说白点,这个资源内,你们觉得这个升温一度降温一度,这种方法应该是在资源内自身携带,还是跟这两个同学有关系啊。那是不是一定是出厂默认的时候,天花板上这空调自己就带着两大功能,一个叫制冷,一个叫制热,OK,好,那么所以说这货相当于咱们的什么。微软输入法。志愿内同学们没问题吧,好。面向对象编程,我操作的是一个初始值为零的变量,但你懂的,我们不可能直接操作变量。所有Java操作说过一句话。
05:02
一切记对象是不是要先操作对象,再操作对象里面的这个变量,反过来讲,那么这个初始值位定的变量应该在哪?是不是在这个对象里面。OK,那么兄弟们开打。Private number。那么等于零。好。那么二话不说,我们用新版写法不再用SNCH了,那么你懂的,那这种只要涉及到多个线程操作,同一个资源类同一份资源,必然会有真气,必然需要加锁,能跟上,那么好。尿。相信这一步,同学们秒懂。开高那么多线程的,干活的第二步要干什么呢?判断。干活通知。什么叫判断?弟兄们,两个线程操作,你怎么知道现在轮到我干?
06:02
生产一个消费一个,那比方说现在杨哥和小姚。他要制冷,我要制热。默认初始车空调出厂默认恒定26度。周阳点一下升一度,小油点一下降一度,但是你懂的,这个空调除非是神经病。否则的话,一个要加,一个要减,是不是总要有一个人抢到,一个人抢不到。那么这个时候你也懂得,不可能有一部车子有两个方向盘,一个向左,一个向右,那这个空调不是老裂了?欧啦,那么开高。我们第一步最重要的是判断。慢慢来。接下来。资源类。所谓的操作,就是反过来讲,你要对资源类进行什么样的操作,咱们现在是不是理个解,理个解,那说白了所谓的操作就是什么。方法。欧了。开个public。
07:03
偷了直接丢出来,能跟上那么好。二话不说。这个里面逻辑上再带着大家复习,我们先复习传统版的写法,那么干什么先判断。那么现在你懂的,初始值数为零,说明现在就算什么蛋糕房里面没蛋糕,没蛋糕这个厨师可不可以生产?可以吧,那么换成判断是判断是你现在这个线程,你要给我一个状态,给我一个标志位,该不该轮到我做,轮到我做,我做从零变成一。马上不能做了,哎,生产好了过来消费,对另外一个线程,是不是把它从一又变回零啊,如此交替。大厨,我已经消化掉这个蛋糕了,请再做第二次生产一个消费一个,生产一个消费一个,交替来五轮,是不是后面就是?101010AB2个线程,这么说,兄弟们秒倒。好,那么接下来。我们来看。
08:00
首先两个线程那么能判断,那么注意啊,还有第三条干嘛防止虚假唤醒机制。非常重要,那么这句话一句话干嘛?多线程的判断。用if还是用Y啊?一定是用Y啊,那么这个时候呢,不要着急,待会给你们一边把所有知识用代码把所有知识串起来。还是那句话。彻彻底底吃透掌握,深透明细这四个字啊,是技术人员的。底子和功夫,什么技术都一样,你别搞,那么现在什么什么人工智能,学个探索flow,会做点东西,觉得牛逼了,你那是API调用工程师啊,你那个干的不是人工智能,你干的是人工智障。好,那么接下来开工先判断。哇。干嘛呢?Number。不等于零。这个时候,我们就要什么等待。
09:00
不能生产。这一波同学们能不能跟上?你看哈,分析哈。出事之际。是不是连总要有第一个线程进来吧?第一个线程进来的就应该是我们的生产线程能跟上。一开始这哥们拿到了这个资源类,初始值是几啊,零,那么你跟我讲零不等于零处还是负啊?这有问题吗?零不等。零不等于零处还是负啊。我不困啦。李。不等于零,那这个还有什么犹豫吗?小学逻辑题啊。能跟上。然后这事呢,干嘛呢?游欢不等于游欢处还是副词,这么废话,肯定是副词,游欢就等于游欢啊。能跟上。你想吧,一开始是等于零,零不等于零是负,我是不进去,说明一开始这个生产者线程不应该等我一开始是零,我要干活能跟上。
10:08
那么所以说兄弟们。那么这个等待怎么写?好,这把锁一体两面,年下支线。对货。叠awake新版写法我们讲过是不是这个,如果老板写法呢?你这给我写个SYNCH,里面是不是写个this.wait听懂了吧?我们现在用新版写法。老板,写法是一八年第一个月的是吗?刘悠老师给大家讲的课,那么现在是六个月以后杨哥给你讲的是新版,当然别忘了。你现在我给你讲的才是这的2.0版,他妈3.0的,你你你你你到还不还不得去买块豆腐赚死啊。还没到呢啊,还没到你难受的时候呢,这这叫什么常规操作,常规操作听懂了吗?
11:04
过来先判断,轮到我干了,我干第二步。干活干什么呢?你干什么活啊?最简单,咱们这儿是不是。Number。佳佳这么说。因为初始值是零嘛。我只要调这个方法,我就加一个。一那么这个时候是不是零加没问题吧?那么这时候干嘛呢?那么这个时候同学们请看。加number,那么兄弟们你们懂的,这个线程进来从零到了执行这行是不是加加成一啊,那么假设这个是A线程,那么A线程就什么生产一个,那么这个时候干嘛呢?这个值就是一听不听得懂,好,那么过来第三步通知唤醒。因为我们现在是多线程的交互,哎哎,哥们,你不能一直把着这个de啊,你用完了你是不是得赶快让啊,那么这个时候干嘛通知啊唤醒那咋咋整呢,这个时候干嘛。
12:08
以前我们是不是干嘛this点干嘛。我能忘啊。以前的第一组铁三角,Wait和notify,以前是叫wait notify了。通知现在不了,陈科长,我们干嘛呢?没有,这个现在变成condition.single wall这一波兄弟们能不能跟上?好,但是逐渐能不能这么写。不能,你看是不是没加锁啊,那么过来。好。那么呢?咱们先把主业务逻辑弄上去干嘛?这种代码不值钱,这叫模板,这是idea快捷键,你可千万不要写这个很厉害啊。过来。这才是什么重要的业务逻辑。那么好,一进来,洛克。
13:01
安洛克,相当于是不是同步代码块,我加锁了,好,那么过来判断。欧了。这是加。那么点呢?一下,那么干什么呢?这哥们儿。如果。等于零了。等这。不能生产了。否则。减减秒倒,那么剩下来干完活了,通知唤醒,能不能理解多线程编程的这三句口诀呢?请看现场。在里面。待会有两个AB不就完了吗?线程你要干嘛?我要去操作,你操作谁?我操纵资源类,那你资源类凭什么被操作?因为我资源类自身高内聚。带着对我要进行操作的方法,那这个空调是不是高内置自身提供了两个功能,一个叫制冷,制冷一个叫制热,能理解吗?其实跟生活的case是一样的。
14:03
那么当然你你你你要是在拓展功能,是不是可以什么干什么除湿啊,烘干除甲醛,杀老鼠杀蟑螂对吧。好,那么这个时候过来看。彻底完成以后。如果这等于零了。Number等于零了以后,说明已经什么蛋糕?已经消费掉了,你再去吃,是不是连厨房都吃光了,你就等着了,这就不能再干了,那么这个时候来减减那么好。开高。那叫啥来着?S。那么好。来。卖只是一切程序的入口,不重要。一进来没有资源类,我这是不是缺什么,你有什么好,那么现在资源类有了,那么现成的几个两个。那么OK,那么来,兄弟们。这个就是我们的AA线程,那么来吧。来几轮五轮,那么这个时候是不是负。
15:04
不应该这个,那么这个时候负循环。这个是我来,兄弟们。干什么呢?Share data.increase增加,然后呢,代码块包起来,那么弟兄们,这个是不是我们的A线产它现在。需要做加法,同学们能跟上,那么这个时候我们的什么B线程,它现在需要做减法,OK,那么这个时候变成什么AA线程,我要生产,BB线产我要消费。没问题吧,加和消费是不是一回事啊好。那么这个时候如果一切顺利,那么同学们搂一眼来五轮生产一个消费一个,生产一个消费一个,生产一个消费一个一个一个一个一个秒倒,那么这个就是我们的什么?以前的什么东东?传统版的生产者消费者模式,多线程交互,说穿了就是我们的这两个三角形的变种。
16:01
被洛克替代。Wait被替代。Notify被signal所替代,那么这个呢,不是我要求的,是guc要求的,你看这个是不是我们的接口?那么好吗?人家也说了嘛。洛克实现了,提供了更加什么?可扩展的牛逼的looking操作,那么扔坑逼那一读懂事是不是就明白了是不是什么什么牛逼的意思啊?你们能够能够比说通过用size获得的话更加的牛逼,那么这事我们是不是干嘛?只好苦逼的来学习啊。好,那么接下来这货完了,那么再给大家复习什么鬼。虚假唤醒。什么叫虚假换钱?兄弟们。Lawyer。我们呢?都明白,那你跟我讲一个问题哈,在这儿再给大家复习一次啊,希望大家不要答错啊。我们以前是不是讲过一个东西叫wait方法,就是wait和。
17:05
楼梯还记不记得?那个wait方法属于哪个类的?打一个。是object类的啊,跟线程没关系啊。来什么意思呢,请看。我们找到了我们的object类。弟兄们,方法大家请看,这是不是有个wait和notify?那讲这个什么意思呀。直接跟你说了,伴随着某某时段的一种情况。中断和虚假唤醒是有可能发生的,所以这些什么wait,这种方法should。Always be used ina loop要放在一个循环里面。言下之意,多线程的判断,你不能用if,你要用什么鬼?啊。也就是说,被唤醒起来以后,要被拉回来重新再过一次判断。
18:04
那么这个时候就说我没有发现有什么区别啊,弟兄们。衣服啊。这个是已经讲过了啊。只是带大家复习来。兄弟们,我跑。正不正确?你敢说错,不废话嘛,肯定正确嘛,对不对,因为我编的对吧,双根。放个大。但是问题是,同学们请看一。我再跑一次。是不是也正确,兄弟,题目一变,你现在是什么啊,两个线程。不是A,就是B。请把它扩到四个线程。你再看你用if判断是否正确。两个生产。BCC。弟弟,兄弟们没问题吧?来五轮,那么这个时候干嘛我跑。
19:02
很诡异的现象出现了,两个线程你就对,四个线程你就错。那么这个时候。你千万不要跟我讲为什么等于二,因为一加一等于二。这胡说八道,什么废话,小学生也知道一加一等于二。言下之意,是不是没有控制住生产一个消费一个,现在是不是生产了两个?更恐怖,就像我说他妈这事,是不是不但吃了蛋糕,连厨房都吃了?那么好。所以说同学们一定要注意啊。多线程的判断。必须要用Y啊,这不是我胡说八道,这是API文档。能跟上,你不用去翻什么书啊,这就是最权威的API Java吧。我们过来。YO了,那么这个时候同学们我们再跑跑看试试你改成外要以后。一条龙1010,所以说多线程的程序,你们不管是去看各大框架,比方说disturb,还有什么native里面,只要是多线程的,基本上都是用while判断。除非你说我保证我的线程只有两个,那你用一判断我也就闭嘴了,因为你想吗,海涛同学们。
20:06
现在不是他。就是他。就这样,就这样两个线程它不会错。但是有可能是什么呢,这个时候呢,就坑爹了。这我现在生产一个,我希望进来的是这瓶水。但是抱歉。你进来的还是这瓶水,我这样是不是被加了两次啊?好,所以说这个非常重要,那么呢,这个呢,就是我们的什么。2.0版。生产者消费者模式的什么传统版?
我来说两句