00:00
上节课呢,我们讲了sing的一个使用,那么C的使用啊,还是比较简单的啊,那么首先我们通过reding clean可以初始化一个S对象。加A呢,咱们会以它作为K绑到release里面去。那么拿到这个C对象之后呢,我们就要首先设置一下咱们的资源量啊,这个呢是啊设置资源量,那么或者说呢,是设置限流的这个线程数啊都可以啊。那么如果我们的请求量超过了这样的一个资源量的话,那么多余的请求会被阻塞住,在哪里阻塞住呢?在枯叶方法这个地方呢,组合住啊,OK,那么它呢,可以去获取资源,那么获取资源成功的线程。那么可以呢,继续处理业务操作啊,那么否则会被阻塞住。
01:05
好,这是咱们这个,嗯嗯,这几个方法啊。那么然后这个呃,资源量这个位置啊,要注意了,如果你前面已经设置过了,那release里面呢,它会复用原来的那个。所以呢,你想使用这个,使这个生效的话,你必须得要把release里面原来这个呢,给它删掉啊删掉,然后再去重新声明。那否则这个最新的这个修改啊,它不能生效啊,这是一个细节性的问题啊。那么然后呢,我们处理完业务逻辑之后,要去手动释放资源,手动释放资源,那么这样后续请求请求线程,那么就可以获取该资源啊,那并且呢。处理业务操作。啊,周而复始啊这个样子。那么信号量呢,呃,咱们呢,就这样子啊,那我们来去看一下下面一个啊,可过期的信号量。
02:03
那么可过去的信号量呢,咱们就不大能演示了。啊,它其实就有一个特点,就是多了一个过期时间这样的一个玩意儿。他除了这个,呃,Que方法还有一个呢,在过期时间的,呃亏方法。那么这个配方法。嗯,它呢,就限定了一个过期时间,那么一旦超过这个时间,咱们资源呢,会自动释放。OK,那么这个东西呢,其实啊,用处不是很大啊,那我们呢,就直接过了。那我们来看最后一个啊,就是这个闭锁啊,啊,咱们又称之为。啊,倒计数器。那么英文名称呢,叫康当大气,那翻过来呢,就是数量倒数的门栓啊,这是门栓的意思啊,那其实呢,就是倒计数器啊这么一个玩意儿。那么官方呢,称之为B锁,那我们也可以叫他闭锁。那这个闭锁该如何去玩呢?啊,其实呢,咱以前如果学过guc的话啊,对这个东西呢,应该也不陌生。
03:05
那么GUC里面也有一个抗垃圾。啊,作用呢,跟它类似,那么还是一样,一个是单机版本的,那么一个呢,是分布式版本的啊。好,那我们可以举个例子,那B所到底是一个?那什么的应用场景呢?啊,那么小时候呀,我们经常性的会玩一个游戏啊,什么游戏呢,比如321这么开门。啊,那数到数到321了,那么这本就可以开门,这不一个倒倒计数器嘛。那数字减为零的时候,它就可以进行执行啊,啊倒计数。那么在我们的实际使用中呢?啊,咱们很多同学应该都玩过手机,手机里面的这个安装程序啊,比如我们安装了一个新的APP。那他会有一步一步的让我们去确认啊,确认授权什么之类的。那么你每确认一个,它就会进入下一个。那么一旦你某一个授权你没有确认的话,那么他可能就会停止安装我们的APP了,或者就直接关掉我们的APP了。
04:10
让你打开它。那么其实呢,它也可以使用咱们这个倒计数器来实现。那么大聚气呢,到底怎么玩呢?我们可以举个例子啊,那比如说呢,咱们以前嗯。学guc的时候啊啊,只要是上一个的同学应该都知道这样的一个例子,那比如说呢,我们班里面有六个同学。六个同学,那么已经放学了,那放学的话呢,班长等着锁门呢,那有六个同学在班里面怎么办呢?那肯定要等六个同学都出来了,那班长他们就锁门。那么否则呢,那肯定就产生问题了嘛,你把人给锁在班里面了,那肯定是不行的。好,那我们呃,看代码该怎么去实现这么一个案例啊。那我们先去玩一下GUUC里面的个counter large啊,GUUC里面也有一个count large,我们可以去搜一下啊,来一个啊counter当large GU UC也有这个玩意。
05:05
啊,咱们来认识一下哈。那首先它也是一个普通类,那也就是说我们也可以去直接啊去new一个抗垃圾,你里面呢,可以设置一个数字啊,可以设置一个初始值。那么然后呢,呃,咱每调一次countdown方法,那么它会在这个初始值的基础上来用减一,每调一次呢,会减一。那么减为零的时候。那我们的,呃,那个被阻塞的线程就可以放行了啊。那么怎么阻塞某一个线程呢?我们可以通过呃,Y等法来阻塞。那比如说呢,班长要锁门了,我们先通过位的方法把班长给阻塞住。等六个同学都出来完了,那么我们的班长呢,他们去锁门,那每次呢,一位同学我们可以看当一下啊,可以记记一下数,那比如说班长呢,可以去数一数啊,654321啊,零减为零的时候,他就可以锁门了。
06:01
他这样的。啊,那么到底该怎么去玩这个东西呢?好,我们来去写一下这个代码啊,好,我们可以把这个C这个东西呢,我们给它注释掉啊,把它给收起来啊,然后呢,我们在这个上面呢,来去玩一玩啊。那么首先我们只要有一个嗯,Count large,咱们可以用一个啊countdown large这个玩意儿,好这个里面啊,我们可以设置一个嗯,初始值,比如它是六个同学,你就写个六就可以了,我等六个同学出来,那么此时我们的慢方法它是一个呢?是一个慢线程啊,它本质是一个慢线程。咱可以把这个慢线程,那么想象成。想象成然后班长啊班长啊好,那么然后呢,我们嗯,在六个同学出来之前,但是要组合度,咱们可以通过这个count。到。Count countdown lunch,点上呢,Wait可以阻塞一下,那么等六个同学都出来了,那我们这个地方呢,才能去放行,那么此时班长才能锁门啊。
07:09
班长锁门,那班长是哪个线程的?我们也可以输出一下看看啊,Three点上看three点上get name可以加上他吗?那么这个六个同学啊,六个同学,我们就是六个线程,六个子线程。好,那么咱这呢,是几号同学,我们可以去把给加上去啊,几号同学。然后呢,咱是I啊,给我们现成的取个名字啊。OK,哎,咱应该是六个同学,他应该有一个,呃,六点上for I,咱六个线程啊啊,把它给放到我们这个循环里面去。那么然后呢,我们在这个里面啊。在这个里面哈,那我们可以呢,去输出一下,那比如说呢,某一个同学准备出门了,把一个three点上kind.get name给加上,那么这位同学呢,已经准备啊出门了啊。
08:07
准备出门了,那准备出门,准备出门,他可能还要磨叽一会儿。那我们呢,可能要在这地方呢,那睡一会啊,Time unit.second.sleep比就是一个呃,随机时间,那么点上next int,我来一个五以内的随机值吧,那不可那么长时间了啊。然后呢,最后呢,啊,墨迹一会之后啊,这个同学呢,就开始出门了,来一个right,点上kind.get name,好来就加上,那么哎,好出门了。啊,出门了啊,那么这样呢,我们嗯,这个代码啊,啊就写的差不多了啊,那么每出门一个同学,我们得把资源呢给释放掉,来一个countdown点上的,呃,Count点上countdown这样一个方法。啊,来进行减一啊,减为零的时候,我这个贝塔呢,才能去放行。那么有异常怎么办呢?有异常啊,我们去开开启一下啊,这个地方开开,那么这个异常啊,我们也可以开开启一下,或者我们就直接剖一下就可以了。
09:10
好,那我们代码呢,就已经写好了。那么下了之后呢,我们来去看这个最终效果怎么样啊,我们来去运行啊来走。你看这个呢啊,六位同学啊,都喊着啊,我们啊就准备出门了,就准备出门了啊,都准备出门了啊。那么然后的话呢,六个同学都出门了之后,班长呢才能锁门。那班长是哪个线程呢?就是慢线程,因为线程名称就是慢线程。那么然后呢,这是啊,012345啊,六个同学啊。六个同学线程对吧,啊他们呢,执行完了,班长同学送门。那么如果我们不使用抗纳基的话,比如说把这抗拉我给它注释掉。啊,注意掉,OK,那么。
10:00
他会怎么样呢?好,我们来去执行一下,看看这个具体效果啊,好,我们来运行。那么此时呢,我没有去使用抗垃圾因,就会出现什么情况啊,这六个同学准备出门了,准备出门了,结果班长呢,二话不说,把班长把这个门啊给锁住了。那合适吗?那肯定不合适呀。啊,所以呢,咱肯定不能这么去玩。那么此时啊,我们就可以去使用抗拉,那么来去处理我们这样的一个操作啊。可以问这个操作来解决这么一个问题哈,那么抗纳它适用于什么场景呢?它就适用于那么一个线程,等待一组线程的线程的这个执行。啊,或者是发生等到一组线程的,那么其实我们这个抗档这个方法呀,你可以在我们这一组线程的,比如说这一组线程应该是六个线程啊,六个子线程啊,六个子线程我们可以呢,是在最后这个位置来进行抗。
11:04
哎,都执行完了,哎,我再去让班长去锁门,才长长去锁门。哎,我们可以在最后这个位置来抗当,那我能不能在一开始这个位置来抗当的,哎,也可以,比如说我一开始就来抗当。那么这样的话呢,哎,我这一组线程只要发生了,我就让这个线程来执行,我就让这个事件呢来继续执行,那可不可以呢?啊也可以。那我在这一组事件的中间位置啊,我就看到啊,只要这一组事件啊,执行到某一个位置了,我就让这个事件呢,啊,这个阻塞的事件呢,来运行,那可不可以呢。啊,也可以。好,那总之的话呢,咱们康当它适合于一个事件。啊,等待一组事件的发生,执行啊,或者是结束。OK,那我们就可以使用这个倒计数题了。那么刚才呢,我们玩的呀,这个是单机版本啊。
12:02
那么,分布式版本的抗能垃圾又该如何去玩呢?好,我们也去写一个案例啊,那咱可以呢,把这个方法呀拷贝一下。啊,拷贝到这个下面去啊,那么此时我们可以来一个test,嗯,然后就是large吧,啊,咱叫班长这里的方法啊。这个呢,咱看看成一个班长方法。那么此时我这个地方呢,我可以来一个,嗯,输出啊班长啊,锁门了,班长锁门了。好,那么咱这个地方呢,可以定义一个test拉,用这个方法。好,那我们可以把这个话筒再去拷贝一下,然后给它放在下面这个位置。那么然后这个地方呢,咱们可以使用这个count,嗯,当啊这个这个路径好,那么咱们这个方法名啊,给它改成count。看到。然后呢,咱可以把这个方法呀,给它拷贝下去啊,放到这个位置好,我们来去创建咱们这样的一个CTRL了,那么然后呢,再来去创建呃,这个CTRL方法。
13:09
啊,这个C的方法啊,啊这两个的方法呢,已经创建好了,好那我们就要去使用啊,Ready里面那个抗当垃圾,那才能锁得住啊,你像我现在是是在这个微服务里面啊,两个微服务来运行。那如果我不使用康那个release里面康拉的话,那么使用这个guc里面的康,你想能锁住吗?肯定锁不住。啊,你们呢,也可以去尝试一下啊,比如说呢,我们也可以尝试一下,那我们可以去初始化一个,怎么看到垃圾,我要初始化的这个,因要初始化的这个外面去啊。那么然后呢,我们这个地方啊,哎,我就可以,嗯。去执行一下,我来去执行一下啊,假装呢,我们就计划呢,就是todo啊,反正呢是一顿操作。啊,一顿操作准备一顿操作啊,是准备准备锁门哈。
14:06
那么然后的话呢,我这个时间呢,要堵塞一下,等所有的人出来我才能去锁门,我都要来来一个去堵塞一下。啊,组塞好了之后,那么才能去锁门哈。OK,那么然后呢,我们,嗯,在这个地方。啊,我也可以呢,去调下这个countdown里面的。那么然后是countdown方法,那每调用一次,那我应该是减一啊减一,那这个呢,也应该想的应该是啊todo,那么然后是一顿啊一顿啊操作。难道是出门的啊,一定操作出门啊,那是一定操作锁门呀,它应该是在这个下面的一个直行,那等都出门了,那我这个地方才能去放行,那么进而呢才能去锁门嘛。啊,这样的。好,那我们,嗯。
15:00
编写好之后呀,这个地方呢,有一个异常,这个异常啊,我们可以去来一个开开处理一下啊好,咱们呢,来去重新启动我们这两个微服务,大家看看能不能给我锁住啊。嗯。他都已经启动成功了,那么启动成功之后呢,我们先去访问一下test拉这个方法,哎,那怎么样,它一直在这里阻塞着呢。那么等六位同学都出来了啊,咱们最终呢才能去放行啊,来一个count到啊,这个路径我们访问一下,来半张锁门了,我们这个打印好像有点问题啊,啊,是出来了一位同学啊。出来了,出来了,那么一位一位啊同学啊,OK,那么下好之后呢,我们再来去重启一下吧。那刚才我们这个演示呀,咱们就直接放行吧,直接给他,嗯,取消掉啊。
16:03
啊,应该都启动好了,启动好之后呢,我们再去访问这个。啊。Large。啊,Large卢俊选错了啊。让他一直在这里组成着啊,那么然后呢,我们这边呢,开始放行来走念出来的一位同学,那么还剩五位,那再出来一位同学。还剩四位、三位、两位。啊,一位,那关键时候到了啊,哎,还剩每位同学你放行了吗?没有放行,为啥没有放行呢?啊,那么此时呀。这是因为我们的这六个请求,它分发给这两个V服务了。那么每一个唯一服务里面可能只有三个请求。哎,那嗯,我这个地方呢,要减为零。它可能只减为三才减为三啊,那我这个唯一服务里面有一个初始值是是六的一个资源啊,初始值六的资源,那我这个服务里面一个初始值为六的资源。
17:05
明知见六次。你只访问六次,只访问六次情况下,每个服务可能只有三次请求啊,那么三次请求的话呢,有减为零啊,没有减为零,那你多访问几次,这个地方才能放行啊,那比如说呢,我来去访问访问访问访问访问可能要访问12次。那么这个地方呢,啊才能去放心。所以这明显不符合我们的要求。好,那我们呢,由于使用分布式的。看到了垃圾,那么才可以。那么回到这个地方去,我们可以改造一下了。那么此时在这个地方呢?我们要去初始化一个可垃圾。那么this.red啊clean,那咱可以把这个啊指掉了啊,它没啥用啊,OK,那么点上啊get。Countdown large啊这个玩意儿,那给它起个名字嘛,来一个CDL啊,那么最终返回的啊是一个c dl large啊CL点上。
18:04
然后呢,是吹sit count,那么就给它设置为六就可以了。那么将来呀,它就会以CDL作为T,那么以这个六作为value保存到里面去。那么然后呢,我这个地方呢,就可以来一个CDL,那是a wait来阻塞一点。那么下面这个地方呢啊,我们一样去初始化一个抗垃圾,一上来就要出发一抗垃圾。那么此时this.ready点上get,那么turndown large。那么这个地方呢,也是一个C,所以这两个K呀,必须得要一模一样啊,如果你要是不一样的话,还能控制住吗?它就控制不住了。现在这个K必点一模一样。好,那么然后呢,我们来一个CDL点上,然后就来一个countdown,那每访问一次,那我就行减一。再进行简易,那应该是一定通了之后呢,我们来进行简易啊,那么这个呢,咱就不需要了,好我们给它删掉就可以了。
19:03
好,那我们,呃,这个地方呢,程序就已经改放好了,那么此时我们能不能控制住呢。好,我们来去重新。启动一下。好,启动成功之后呀,我们来去先刷新这个班长这个方法啊拉班长方法,那班长法呢,是一直会在这里操着。那么直到六位同学都出来了,那么咱这个地方才会放行。好,那我们来去看一下,来我来去刷新啊,出来了一位同学,还有五位,那么还有四位三位,两位一位,那关键的时候到了啊,还有最后一个正确。点击刷新啊,最后位同最后一位同学出来了,那这个电脑班长就可以立马锁门了啊。好,那么这个抗纳气呢,咱们就演示出我们想要的一个效果了。
20:01
啊,那么康纳基啊,玩法呢,也非常简单。那么直接clean。那点上呢,Get get成large,那么指定一个K。它会以这个K啊作为作为K啊,以这个CDL作为K保存到red里面去,但我们现在好像没有这个东西了啊。那我们可以呢,再去演示一下,比如去刷新,那班长又要锁门了啊,那么此时我的re release里面你就会有一个CDL这个K,那初始值呢是六。那每请求一次,每执行次看大,那么它就会减一,减为零的时候就可以把这个CDL给删掉了。那么既然呢,这个white这个地方啊,这个地方就可以放。那这个al贝塔就在这里,一直用于水啊,看看这个值呢啊,是不是为零,那如果为零了,那么咱们这个地方呢,就可以去放行。那就可以进行执行锁门操作啊。好,那我们嗯来去看,比如说我就访问这个康,哎,每访问一次,咱们这个值呢会减一,那每访问一次呢,会进行简易操作,那最后呢,我访问完了减为零的时候,那么这个地方就可以进行方形。
21:12
好,那么这是它啊,那么然后呢,我们这是呃,通过trans count来设置一个初始时,那通过wait来阻塞住我们的某一个线程。那么然后呢,通过comedown啊来进行减一。好,咱们这个啊使用啊还是非常简单的啊。
我来说两句