00:00
我们都明白,根据刚才老师的讲解。第一板斧已经完成了我们的理论知识的学习。说白了就一句话,读写所。读多个线程可以操作共享写,同一时间段只能有一个。好,以前我们加洛克那就是读和写,那通通只允许一个人。数据一致性得以保证,但并发量下降,我们现在更加需要进一步的增强和增加这个并发量,那么所以说呢,我们呢,这边。那么接下来呢,我们呢,来尝试着。给大家。讲解一下读写锁。好,还是那句话,我们讲这些题,绝对不是让大家去背。而是通过这些题反哺来大家,提升我们的知识。另外一个,我讲任何东西,一定是跟你讲三个字,方法论。我为什么要用这个技术啊?我不做这个技术,你能把我怎么样?换句话说,作为一个技术人员,你的提升为什么很多九零后读了这么多技术书,却依旧没有办法增长?
01:03
那么这个时候,我们不妨用这样一种思维方式,学技术两个AB,工作中两个AB。那么什么概念呢?这个A是after,这个B是b before,二话不说。你给我划一条线。现在老师你要讲解一个知识点,叫读写锁。以前我们讲过一个知识点,叫锁,叫洛,现在叫read red lock,那我好端端的,我为什么要学这个技术,我不服。那么言下之见,我们学技术人员,你不要只是去背代码,就什么API调用工程师,我最烦这种不爱动脑子的人,那么before。现在我们没有读写锁。碰上我们的业务情况,我们会产生哪些故障?我为什么要学这个东西?很简单,为什么安卓苹果手机要把诺基亚手机给替代了,我把它宰了,我诺基亚打电话好好的呀,我没做错什么事啊,那么好。
02:05
接下来。After。更重要的,杨哥要教大家三个字的方法论。那么好,现在我们不妨写一个粗糙的。由于之前我带着大家读过美味的源码,我们现在手写一个缓存。大家都明白。我们是不是讲过一个分布式内存数据库叫啊。你懂的,如果在内存里面的东西。一边读一边写,可读可写同时发生,这个是不是肯定的绝对的业务诉求?那么接下来你怎么玩技术,怎么加深这个技术的理解,那我现在我不用是什么情况,会产生哪些故障,然后我用了这个故障解决,我们得到更好的性能效果,那么这个时候时候才能证明我用在哪,怎么用,解决了哪些问题,同意否?好,那么接下来同学们露一眼。那么前面你一直跟着杨哥来学的话讲过了,多线程线程在高内距低耦合的前提下,是不是线程操纵资源类啊,这个小口诀已经说过N多次了。那么言下之夜。
03:12
然也高定句第和把对这个资源内。那么言下之界,你可以把它抽象成这个,就是首都机场。放在大厅中央的各个到港离港信息的航班号的那个电子显示屏幕,大家要共同读的听懂。但是有可能机场的工作人员会调换其中一条记录,比方说现在我要去写,是不是只允许一个人在写啊,能跟上吗?那么接下来。最简单,那么怎么来写这么一个模拟的分布式缓存呢?它的底层是什么?其实底层就是map及其子接口KV键值对好private。Volatile。Map。
04:01
那么string object object是什么都能装的,那么MAP6哈西好,那么这边导入包。好,来,同学们,换以前我们大家都明白。Lock。Look。那么这个时候,同学们。干嘛呢?导入8LOCK,那么以前我们是不是写的是。Reran落款。还记不记得那么言下之意,这就是我们一般的替换的size啊,那个一般的枷锁,这个枷锁没问题,你能现在能解决这个问题,但是我说过了,加了这种锁以后,Lock克按lock克只有一个线程进去,但是我们现在要求什么菜刀切豆腐两面关,写的时候只允许一个线程进去,读的时候要求多个线程可以进去共享读,那么如果你还用洛克是不合适啊。
05:03
言下之意就变成了嘛,一竹竿打死了一船人,你只要加罗,我管你读和写,反正我现在只允许一个人操作,那么这个时候什么你一致性?原子性获得了保障,但是你共享毒的特性没有获得,那么这个时候OK,我们先干嘛呢?不加任何锁,那么现在我们就是一个map,好。只要是卖,必然欠人写缓存同学们。复习一下三大操作,什么动不到?首先你是不是有set k1要写吧,第二个你要读吧,Get第三一个是不是要清空缓存?言下之意,一言不合,三个方法读写清空,这是所有做缓存框架的三大基本方法,就像面向对象特征的三大特性继承多态封端那么OK,同学们不画不废话,注意。现在杨哥既没有在这加。
06:01
我也不在里面,加洛,换句话说,我现在干的这事是不是根本就没有加锁。我们现在呢,干嘛比付。不加锁会是什么样?之后引申出学到递进的学习方法,我为什么要加这个锁来解决?学要学根本绝对不要是API调用工程师啊,行了,我懂了,那以后我们代码就是渣,哎呀,基本上都是水货,干个两三五年以后又是我说的那种干嘛,他根本不是有五年工作经验,他是一个经验用了五年。那么这种程序员最多干嘛?阿里P6。京东T4的级别,你可以等退休了,你是成长不上去,你练武不练功,到老一场空,内功没有获得提升,好同学们。只要是什么,我们的map必然牵扯到是血。我们要现在是什么?读写共享,读写分离,是不是先要写进去数据我们才能读,那么所以说。葡萄。
07:02
那么这个时候string key。Object value,好,那么这个时候干嘛呢?我们为了给大家演示。线程,那么这个时候就是正在。写弱,那么OK,你写个什么鬼呢?这个时候我们写,我们都知道哈希map的TV建制,对,重要的是这个T不是那个value,那个value可以是任何东西,K相当于是主见,有主见有一切,所以说我们干嘛。以K为例,那么好。这个时候这是第一步,那么言下之意,map.put那么这时候key value搞定。来。干嘛呢?正在写入,写入完成。好,那么来。
08:03
我们呢?干脆这样,我得给大家好看一点,我呢稍微给它停一会,模拟网络拥堵的情况,那么这块就不能是second,我们呢million,那么这个呢,不多,我们就300毫秒,就大概0.3秒的模拟网络延时拥堵,听懂主要是让大家好看这个效果。好兄弟们。完火以后,这是我们的血。那么什么意思呢?同学们,从这句话你一定要明白写。操作两个,第一个原子啊。第二个,独占。啥意思啊,现在杨哥去卫生间。上厕所,或者我现在去一个。干嘛浴室里面洗澡?不可能,我才洗着头,才洗完一半,头上的泡沫还没冲水呢,被人拉出来,被中断。
09:04
所谓原子性,是不是要独一无二?完整一致,听懂了吗?没有哪位同学去洗澡的时候先洗头不洗身子,然后说没事,我待会再来洗。早上我洗澡,我一般分两次洗,哪位同学洗澡是分两次洗的,那早上先洗头,晚上洗屁股。基本上是不是一竞选都是什么彻底完整,一致性,不许分割,听懂了吗?那么这个时候我们来看一眼。连下去什么叫B不不许分割呢?就说比方说现在我这个线程是A线程,我正在写入一个K,假设这个K是A。那么这个时候紧接着的下一行也必须要是写入完成,这个叫写操作独占,不可中断,能跟上。好,那么兄弟们再次强调,现在杨哥先给你们讲左边这一栏,细细的讲慢一点,我们不是背题,我们拿这些题目来复习,我现在是不是比before这一栏是既没有加size,也没有加锁。
10:03
好,那么这个是我写了,那么读呢。来put是写get是读好。那么这个时候同学们。老爷。跟刚才一样,那么呢,那么呢正在读取。那么呢,你读拿这个K是不对的,那么你按照K。正在读取,那么来干嘛?那么这边是不是。读取完成,那你完成以后你获得个什么东东啊,那么来同学们,我这边直接过来,这边就不不再能够是put,我们这边是不是哈希map的get方法,这一步同学们能跟上,那么这边大家看它的get返回的,那么言下之意,我们的这边是不是object。那么好,直接过来。那么为了有一个区分吧,我就叫吧,那么好,现在大家看啊写你写了个什么。
11:06
读,你读了个什么那么好,注意读它是可以共享的。抬头,现在各位同学,你们你们班现在。这么多人,这是你们班,假设你们的成绩表填在这,你跟我讲,一堆人,七八个同学站在这一块,看这堵墙,各自的找到各自的名字去读,这个没问题吧,有没有种可能,有些同学只读自己的,他读两秒钟他就跑了,有些同学呢,特喜欢呢,把全部的预览一遍,他可能在这会读十秒钟,就说读共享,每个线程读的时间段不一样,这一步能跟上。你想嘛,你现在要去看一个东东,有些人看两秒钟就跑了,有些人可能看了一分钟,每个线程不一样,每个人想捕捉的信息不一样,听懂了吧,读共享,且时间段不一样,好,那么来,同学们,此时。我们呢?Put get套通通完成,那么好了,老规矩线程操作资源类,我们现在就是我们这个缓存资源类那么过来。
12:10
好线程,此时大家请看是我们的什么呢?AAA线程那么好。我这个现场。干什么呢?那么或者说我们直接这样吧。我们接下来呢,这个缓存哈,五个人来写。五个人来读,听懂了吧,那么呢,这个时候呢,干嘛呢?其实刚才那个写法也一样啊,只不过把负循环放在里面,一个线程写五次,一个线程读五次,我现在反过来负循环放外面,那是不是负里面是。New thread是不是六五个这么说拼了,那么来,同学们。现在直接过来五个线程来读,那么你干嘛呢?麦看点,我现在是不是要先写啊,那么put那么干嘛I加上这个。
13:04
逗号二。加上这个东洞,当然由于在拉姆的表达式这个东东里面干嘛,我们需要它是一个final类型的。那么好,Tempt in等于I,好,那么这个时候。兄弟们漏,我们这儿可以清晰的看到。负循环五次。每次尿,那么言下之意是不是六了123455个线程这一步能跟上,一号线程写的值就是一,二号线程写的值就是二,以此类推,听懂,这是我们干嘛正在写。让杨哥读呢?老规矩,五个线程来写,五个线程来读,那么这个时候同学们你们懂得读是不是get了,那么这个get的话。干嘛跟刚才一样temp ID是就是个循环,12345,我写进去的是不是12345,相当于是我现在map.put1逗号一,二逗号二,三逗号三,这个K键池对同学们能跟上好,此时同学们搂一哈现在。
14:17
哥们儿,我干的这票是既没有加同步,也没有加洛克,根本就没有。那么这个时候来吧,我们呢,不妨来跑一下,看看我们的程序。请看。二正在写入。记住我这句话,写操作要干嘛?原子加独占的意思就是什么?中间整个过程必须是一个完整的统一体。中间不许。哎,峰哥。
15:02
被打断。这句话非常重要。写锁的时候。整个过程必须是一个完整的统一体。中间不许被分割,不许被打断。我们讲过一个问题,现在。车队出来了。有哪个车子敢中间进去加塞儿了?好,什么概念呢?二正在写,我有没有写完呢?我没有。这个时候请看。二写入完成。超级坑爹,中间是不是被打断了很多?也就是说你这种写操作完全是胡说八道。就好比现在我要求同学们签到今天来听课的签到。张强这位同学,他刚刚写了张这个名字呢,马上就被人家笔被抢走了,中间来了个什么郭松同学去写他的名字了,那么这个时候干嘛?更坑爹的什么郭松的郭字还没写一半呢,又被什么?
16:03
另外的同学给抢走了,那么言下之意,我们会明显的发现,你看。写操作是不是应该不被打断啊?完全违背了原子性,请看正在写入二,正在写入一。正常情况应该什么?二、正在写入,紧接着下一行应该是什么?二写入完成。一正在写入,紧接着下一行不能是我正在写入,而应该是一写入完成,这样的话,两两配对,这样的东东是不是才叫原子性,同学们听懂,所以说切记这句话干嘛?写操作是独占,写操作就是独占所互吃啊,有哪位男生去跟其他男生共享女朋友的,举手我看看。你女朋友是不是应该独占啊?这事儿不合适吧,你怎么跟跟他讲,没事儿,兄弟们,我们三个一块儿用,135陪你,246陪他,星期随机看她心情,这就很诡异的现象了,听懂了吧?那么这个时候请大家看。
17:02
整个过程必须是一个完整的统计题,中间不许被分割,被打断,你说小的苗头二话不说干嘛?Private。洛卡洛卡。等于那加不搞定吗。来搞定了。大哥,你别忘了。现在咱们是模拟一个缓存,所有mango DB慢慢开始,缓存必须100%,绝对是什么。同读同写,你就说有毒的情况,你有血的情况,你只要加了这个锁,确实啊,你能保证一致性不会被打断了,但抱歉,你的毒是不是保证某一时间段也只有一个线程来读,所以说这样的细利度的控制啊,需要加深,传统的洛克不足以满足我们的需求,那么呢,我们亲爱的GOUC。
18:01
那么再次强调啊,后面呢,有新来的同学,所谓的勾践就是这个类。到。Java u concurrent,俗称Java并发包。坦白讲,你现在去面试,我明确的说了,从2018年开始。这三个包,GOUCGUU原GOUC原子操作,Go UC lock操作,这三个包不懂,你绝对找不到一万五以上的工作。很多人为什么冲不上年薪30万,月薪两万五以上,注意说过这个数字了,月薪两万五乘以12刚好就是年薪30万,你可以按计算器,那么你要拿两万五以上的,坦白讲这种干嘛,你千万不要什么各种框架满天飞,哎呀,你用OSGI他用什么,什么VC,他用DSF那些框架么?扯淡,完全底层都都是这些不变的,不变的思想才是最重要的,尤其是什么做支付接口的医保支付啊,你要是去支付宝这样的去。我的弟子有七个人在支付宝了,现在基本上干嘛都是什么玩高并发,没有见过什么登上改查的不重要那个动作好,那么接下来同学们请看我们这呢,找找找找找。
19:07
将会找到我们漯河下面。然后呢?找到洛卡。凡洛克。它是锁,但是我们刚刚讲过这个诺一言不合干嘛。宁可错杀1000,绝不放过一个。一致性得到保证,但并发性落后。所以说现在我们换过来。Read write lock,读写锁。那么好,大家看又是一个接口,凡接口必然有实线类,那么所以说这个时候干嘛,我们的实现类。换了。Read right look。那么这个时候B2啊。会让大家引来一个问题,可重入的读写锁。那麻烦了,按照我们正常人而言,锅是锅。
20:03
晚是晚,但是大家请看它这块什么read red lock,是不是有点什么雌雄同体?读和所是不是一样啊?那你这个时候坑爹啦。你到底读书还是写所呢?那么言下之意,需要把读写所按照我们的API干嘛进行一下?转换。那么这个时候大家请看。他们两个是一个合体。那么呢,就好比是什么,没办法,就好比现在性别有三种,要么男,要么女,要么李宇春。这货就是李宇春版,言下之意就是读和写合一体了,但是你用的时候,其实有时候我们得怀疑一下李宇春上厕所时会不会有犹豫的情况,那么这个时候我们得确定你正儿八经用的时候该用什么,那么过来看。Redlo。然后前面必然而然会有什么right look,好,那么不废话,我们直接代码说话。
21:06
来,同学们。讲过。这个时候必须D快捷键,超级熟悉lock,按lo,这种代码不许手写,一键自动化生成,你手写就是水货,你一定没干过。那么这个时候什么leave temp idea走起,以前我们讲过干嘛?那么这个时候,TRY洛克。Lock,那么现在是写锁,那么就是right lock,那么这个时候OK。我们讲过这个是不是代码模块化,要求自动化生成,不许手写,那么再来业务逻辑。彻底拿进来。放到这儿。OK。言下之意。老师。哥们儿,我这属于en read right lock,定性了,性别定了什么锁解锁,我们put操作是往缓存里面写,那么注意。
22:00
凡缓存的东西一般要用V太修饰啊,你可以去看美倍的源码,源码都这么写,什么概念?最重要的是不是要保证可见性,因为你缓存东西非常快,只要有更新了,马上就要通知大家,你想一下,抱歉呢,通知各位旅客,由于今天雾霾,航班延误,全部推迟一个小时。首都机场它的离港和到达这样的最新的航班变化信息,是不是要第一时间通知在场的各位乘客,没问题吧?那么所以说这个可见性和及时性非常重要,再次强调完了,看杨哥详细讲过,我们花了一天时间讲三大特性,可见不保证原子性和禁止指令重排非常重要,你没用到时你现在的业务特别简单,你去大厂用的时候100%用,没用到使你low,不是代表这个东西不重要。别拿你的认知啊来评价整个技术体系。好,我们过来。接下来一样。我们呢,加完锁以后这是写锁,同理,Get获取,获取是不是从缓冲里面读出来,那么这个时候那不用讲,同学们加写锁还读锁。
23:02
100%是要叫独锁,那么OK,跟刚才一样。那么这个时候读写锁,然后OK。锐了,那么这个时候干嘛呢?直接把我们的业务逻辑拷贝进来上,那么这个时候同学们。当然正常的哈,你可以public word干嘛,Clear map干嘛模拟清除一个缓存这块的话呢,map.clear那么这个时候呢干嘛?就是我们的缓存的三大操作,但是我们现在主要讲的读写锁,不是讲手写缓存这个事儿,我们这个方法我就没写了,但是如果同学们以后去比方说百度基础架构部,阿里基础架构部要你写这样的话,手写一些什么东西,那么这些基本的标配。那么大家呢,是要明白,好,那兄弟们干嘛呢?现在我们就加了锁,那么现在是不是能不能理解我现在所说的比before,我们是不是根本没加。没问题吧,现在after你加了以后呢,你给我看到效果,学习就是这样,Before after,我不服,不服拿代码说话,那么这个时候有你和没你有什么样的效果,这个时候你的印象会非常深刻。
24:12
干嘛这种学习方法?慢,但是你会发现,就跟学自行车一样,学会了你永远就是掌握了,根本掉不下来。那么这个时候同学们搂眼。我们呢,看。现在啊,我先把这个。效果。拷贝下来。那么干嘛呢?来中间是不是被打断了,有加三不连续被打断,好同学们,我们现在我跑。Lawyer。三正在写入,写入完成一正在写入,写入完成二正在写入,写入完成四正在写入,写入完成我正在写入,写入完成,是不是写操作被严格的控制了?
25:04
中间根本没有加三。那么这种情况下,既保证了数据的一致性,又提升了数据的并发性,读写分离,同时共线。这就是我们的读写所。这就是为什么后面的lock会取代了前面的SNCH,你加一个SYNCH是重锁,废话,你肯定能控制S,就什么你上个厕所干嘛?把上硅谷学校大门给锁了。那这事肯定没人给你争对吧,你出来以后呢,街道给清了,那这事肯定你不会有交通事故啊,绝对安全,但这并发性你懂的,我估计你活不过第二季。好,那么这时候老爷请看,一正在读,一读取完成得到一,四读取完成什么概念先读。再次强调读,用不用严格的控制顺序,不用你想嘛,我读这个东西,比方说现在各位同学就在读杨哥共享的屏幕,刚好有个同学可能要出去外面收个快递,其他同学都在读,我不读了,你不能要求所有人的读一样,所有人的每个人都要读十秒钟,每个人都要读一个小时,但是读共享不限制,但是再次强调写怎么样。
26:14
必须限制三,正在写的时候不许加三。原子性,数据之性,完整独立性,你看。比起这个同学们,我们两相对比。Lawyer。我们明显看到三正在写入,写入完成,你看这边的三呢,三正在写入,我去5231堆,是不是加三了。这个效果一对比,我们就明白为什么要用读写锁,好那么同学们读写分离的思想O了吧,好,那么呢?这个。佩,希望大家下去的话呢,晚上回去做练习的时候,一定要写一下加没加锁之前和没加锁之前是什么情况好,那么呢,案例就给大家介绍到这。
我来说两句