00:00
前面呢,我们已经演示了reducing的入门程序啊,并且呢,重点去讲解了它底层原理。那么还去验证了代码,验证了它的可重入性以及自动信息。那么在red里面,它其实除了咱们这个可重入索之外,还提供了其他的一些锁。那么在分布式锁和同步器这一章,那么可重入锁呢?只是其中的一个。那除了这个lock之外,他还给咱提供了fair lock,那么还提供了连锁,那么还提供了红锁,那么以及呢,读写锁,哎等等等。那我们呢,可以呢,一一的去看过去啊,那么首先来看这个公平锁,那公平锁呢,他说呢,是基于radi的radi分布式可重入供应所,那么也实现了。Lock接口的。一种ILO对象。那么这个可啊公平锁啊,公平锁怎么回事呢?可从的公平锁呀,它跟我们前面的可重锁不太一样,那公平锁呀,咱前面介绍过,所以的公平锁呀,就大家都排好队啊,来去于火炬所。
01:11
如果我们的秒杀程序,咱使用的是公平锁的情况下,那就拼速度啊,那么看谁的啊手速快,看谁的网速快,那么谁的手速快,谁的网速快,那么可能就会先报达我们的应用程序,他就可以先回到素让进人呢,可以买到他想要的商品。那如果我们什么是前面那个可成摸锁的话啊,之前那个可成摸索的话,他拼什么呢?拼的是运气啊。那么你运气好的情况下,你可能是后来的,但是呢,你抢到锁了,那你就可以买到我们的商品了。那如果你运气不好,你可能是前几名啊,发送就过来的,但是呢,你没有抢到,没有抢到你要去排队,你排队一旦进入队列的,那排队的情况下,你可能永远都抢不到了啊。
02:00
好,正常的知识可重入索。好,那我们之前那个是非公平的,拼的是运气啊。而我们公平所它拼的是手速和网速啊。OK,我们来去看一下后面的介绍,同时呢,还提供了这些东西,那它保证了当多个客户端线程,那么同时请求加锁时,优先分配给分配给先发出请求的线程。那是什么意思呢?那比如说呢,我们有100。那么幺零还有10086,哎,那么我有多个reason客户端线程,那同时呢,请求到A加锁啊A加锁那么首先会导索呢,它会优先分配给先发出请求的线程。那其实呢,我这两个服务里面呢,每个服务里面可能还有多个线程的。那么每个每个请求,每个请求的话,我们的服务内部的时候呀,都有现成的啊,那么每个线程先来或解锁。那么十就可以先获一到我们的说哈。
03:01
那么然后呢,所有请求线程会在一个最终的排队。当某一个线程出现宕机时呢?会等待五秒后那继续下一个线程。那么就是呢,如果我的某一个线程。啊,没有获取到锁,然后就去宕机的,那怎么办呢?哎,那么瑞呢,会给他五秒钟的等待时间。啊,那么五秒钟之后呢,会让下一个线程去获取错了。那么也就是说,如果前面有五个线程同时都处于等待状态,那么后面的线程呢?会等待至少25秒。啊,25秒,好,那我们呢,可以去玩一下啊,它的玩法呢,其实跟可同索的玩法差不多,也就通过RA clean客户端来去获取一个公平所对象来指定一个K。那么在里面就会以它作为key保存起来哈。那么让它返回一个fair lock对象,通过fair lock.lock就可以加锁文件。最常见的方法通过lock的加速。那么在finally里面通过这个unlock可以解锁啊。
04:04
那么它里面呢,也有话呢,也有这个,呃,Cominging狗啊监控cominging狗,那就做自动续期,那么这句话呢,是跟上面那个可重索那个是一模一样的。好,我们呢,就不重复去读了啊。那么这个公平锁咱们呢,还去验证一下它怎么公平的,咱们可以呢,打开我们的程序来去写一个案例啊,咱们不需要地方把它关掉。啊,把这些东西也给它关掉啊,这个呢也也给它关掉啊,那么打开一个CTRL了吧。在CTRL里面呢,我们可以写一个嗯,测试公平锁的一个方法,那么来一个get,好路径,我们可以来一个in,嗯,派啊是。飞啊。Lock,然后再来一个。ID参数。好,那么我们在这个地方啊,来一个反应结果集,这是分,等于是test。We lock这样的一个方法。
05:03
那么这个方法里面呢,我们可以获取这个占参数,那咱可以通过pass variable这个注解,那就获取ID这样的一个参数,来一个long ID嘛。然后这个地方呢,我们可以来一个this点,然后呢是talk service点上,我们可以定义一个here fair test fair lock这样的一个色方法,那么来一个ID传进去。那么这里呢,我们就可以直接。呃,Hello,是test。Lock啊,这样一句话,随便打印一句话。那么然后呢,我们再来一句。啊,创建这样一个思的方法,在这个C的方法里面,我们就可以去哎,输出一句话了啊。好,那么这里呢,是测试测试公平所的一个测试啊,再加上一个华丽的分割线,再加上这个ID。
06:02
啊,给它输入出来。那么然后呢,在这个前后啊,我们可以去加锁和解锁啊,那假装呢,我们这是一个啊,一顿操作,一顿业务操作,那么前后呢,来进行加锁和解锁。好,那么然后在这个地方啊,来一个this.clean点上get fair。那么给这个所呢起个名字,等来一个啊fair啊block这样的一个名字。那么咱把这个地方给它换成一个大写的。然后最终返回的啊是一个fair lock对象,那么fair lock呢,点上lock给你加锁了。那么然后呢,在这个下面这个地方啊,咱可以通过。这个fairlock点上unlock a解锁,但这个解锁呀,你最好放在那个final里面去啊。那么这里呢,为了方便演示,可以这样呢,我可以不手动解锁。啊,我可以不手动解锁啊,或者我手动解锁也可以对吧,你在这个中间呢,我可以让他去睡一会儿啊。
07:00
啊,去睡一会儿。在这个地方来一个time unit,顶上second,顶上sleep,比如呢,睡一个十秒钟,那么有异常我们可以来一个吹。吹,然后是K翻那里吧,咱这个东西呢,还是放那个final里面去。好,那我这个代码呢,就已经选好了,那么写好之后呢,呃,相于这个代码呀,应该大部分同学都可以看得懂啊,那么很简单,那就是一个睡眠嘛,是一个十秒钟,然后呢睡醒,睡醒了之后呢,我们开始打印这句话,把这个ID呢一个输入出来啊,那最后呢,可以解锁。那么写完之后呢,我们来去,嗯,来去重新启动一下吧。来看一下这个最终效果啊,重新启动咱们这两个服务。这两个服务启动好之后呢,我们可以在浏览浏览器上来去访问一下,那比如说呢,我们可以访问一下咱们这样的一个路径,来把这个路径呢,直接拷贝过来,然后呢,放在我们浏览器的。
08:06
地址栏这个位置。啊,找了一个杠给它加上去啊,加上斜杠。那么来一个呃一嗯,然后呢是二。三。四。五这样的一个顺序。好,最终打印结果是不是这样的一个顺序呢?好,我们来看一下啊,那么一已经打印出来了。那么第二个打印的应该是二,它应该是我们的访问程序啊,这是公平锁啊,来看一下你二呢已经打印出来了。他到了同一个客户端啊,那么三啊会怎么样呢。我们要等十秒钟,这个睡眠时间呢,可能有点长啊,念三呢已经出来了。那么然后呢是四,那么四呀。我们等一下看看呢,你看四呢,也已经出来了。那么最后呢,是我们的这个啊。
09:04
那最后呢,是我们的股也已经出来了。好,那么咱就可以看到公民所致的一个效果了。好,那我们可以再去看一下公平所在里面,它怎么保存的呢?好,我们再去访问一下试试啊,咱把这些日志呢,全部给它清空掉啊,把这个呢给它清空掉,不要干扰我们,好,我们再去访问那么一。二。三。四。好五它我访问了五个星球,好在我们这个底层啊,应有个fair lock,它以它作为key保存到咱的这个里面去的啊。因为这个里面呢,还有呢,还有一个队列呢,一个啊red lock这样的一个队列。啊,公平所对列那里面呢,还有两个呢。还有两个呢,那它里面其实是放对立里面去的啊,那我们呢,可以去看一下啊,应该呢有一些请求啊,已经处理好了,你里面还剩两个嘛。
10:02
啊,这样子。那么然后现在呢,还剩几个呢。啊,又除以了一个,那么此时应该里面只有一个了啊,诶已经没有了,对啊,也没有了哈。只是呢,我们这个应用程序呢,它可能啊有点慢啊,在已经出来出来出来完了。好,那么这样的话呢,我们就可以看到公平所的一个效果了,它是按照我们的访问顺序先来先得的啊。好,那我们来换一个,如果我不使用公平锁,我使用之前那个锁的话,它会怎么样呢?比如说呢,这个地方啊,我给它换成那个get lock啊,就这个数。而现在这个虽然名字是lock啊,但是我这里呢,使用的是一个。普通的可重入算啊,不是公平算啊,啊,它会怎么样,还是不是还是这样一个顺序呢。好,我们来去重新启动。啊,咱们这两个服务。看看是不是还是12345这么一个顺序啊。
11:02
好,都已经启动成功了,那么启动成功的情况下,我们在浏览器地址栏依然按照之前的顺序啊,一,然后呢二。三。四。五啊,这个顺序好,来看一下最终效果怎么样啊。因为我们这的话呢,是公平锁嘛,但不是公平锁啊,咱们呢是普通的可重入锁。因为这个一呢,因为这个请求啊,他先发过来,此时还没有人有所呢,他上去了就获取到锁了。那么后面四个请求是不是按照正常顺序访问的呢?你发现三这个请求呢,他比较强势,运气呢比较好,他先活到少了。那么然呢,是四,哎,四回到所了。那么然后呢,是我们的。啊几呢?二才会一道索,那最后呢,五才会一道索啊。那么它是按照先来先得那个顺序吗?不是。啊,所以运气好呢,所以就可以先回到是啊,啊他这样子的。
12:03
好是咱们这个,呃,可重入锁。A同学发现出现了,出现什么问题呢?出现这样的一个问题,就是三,哎,应该又发了一个请求过来了,那这个二呢,又发了一个请求过来了,哎,这是什么情况呢?啊,经常有同学出现这个情况啊,就是比如这个三这个请求二这个请已经处理过了,处理过之后呢,你看这个地方又来了一个,呃,三和二啊这两个请求。你看这个又来了一次,还什么情况。哎,这是N导致的啊。那么N这个,嗯,他在给我们分发请求的时候。它其实内部呢,也有一个呃,错误机制啊,如果迟迟得不到响应的话,NG格的话呢,它就会。会给我们进行重发。那么你得要把这个重发这个东西呢,给它禁用掉啊,或者呢,你把这个超时间呢,设置的长一点,它就不会重发了啊。好,那我们呢,比如说大家可以设置一下这个代理的时候的一个超时时间。
13:02
那么操作时间呢,主要是有这么几个操作时间啊,有这个卡。Connect,然后就是time out超时间给大家设置为,呃,咱是十秒钟超十秒钟的睡眠时间,咱可以呢让呢是12秒超时。那么注意是毫秒为单位的啊好,那么这设置了一个操作时间,那么这个的话呢,咱们还可以去设置一下,嗯,这个发送请求的操作时间,那么如果我这么多秒,这么多这么长时间还没有发出去,那么它可能会进行重试。那我们把这个时间呢,给它发到啊,给他试着尝一下啊。那么然后呢,还有这个获取响应的超时时间啊,读取响应的超时时间,来一个read timeout,那么也是12秒。它那么这样设置好之后呀,它就不会出现刚才这种情况了啊也是呢,它发生了这个重发,你看四和五。嗯,三和二都除掉两次。都出现了两次,那么N呢,给我们发了两次啊好,那我们来去重新。
14:05
加载一下这个N这个配置文件。好来去执行啊,N这个杠S是reload进行加载就可以了。那么下载好之后呢,那我们再回到咱的浏览器里面去,我们再去试一下试试啊,咱先把这些日志呢,给它清空掉。都给它清空掉。那我们再回到浏览器里面去,我们来去发送一个一啊请求,那么二请求三请求。四这个请求以及五这个请求,好,我们这个五个请求啊,都已经发出去了。那方法之后呢,我们去看一下啊,因为这个一呢,首先回到所啊,那么然后呢,是。是,二也已经回到所了。哎,按照我们那个顺序回答错了啊。那然后是五回到所了,哎,这已经不符合他的访问顺序了。
15:05
哎,怎么总是第一个呢?那第二个呢,能不能获取到。哎,你咱这个是三回到所了。啊,第二个客户端程序啊,他比较弱势啊,啊,他只处理了一个请求啊。然后四呢啊也啊输入出来了,因为它访问顺序呢是一二好像是呃354吧,对吧,354这样的顺序啊。那他不是按照我们的访问顺序来访问的。那么此时N这个啊,有给我们进行重试吗?那就没有重试了啊。好,那么经常有同学呢,会出现这样的一个问题啊,那么你们可以把这三个参数啊给它设置一下啊,就可以避免N这个重试啊给你带来的一些误差了,那么到这里呢,我们的公平所呢,我们就验证完了。那么公平所得底层啊,它其实有一个等待队列啊,那么在red release里面有一个reducing的所队列。
16:04
那么这个队列呢,它是排好队的,那么先来先得啊,谁先来谁排在最前面,谁就可以优先回一道错。
我来说两句