00:00
那前面我们演示了一个信号量,那接下来我们再来演示一个叫闭锁,那这个闭锁呢,我们使用的也非常多,特别是大家使用guc的时候,大家也经常可能在多线程任务调度的时候会使用康德当launch,比如这十个线程都给我们把任务全部做完了,那才算全部完成。我们以前GUUC里边有康当launch,当然我们分布式也有这个闭锁操作,那我们也可以来举一个场景的例子,好,这个举一个什么场景的例子呢?我们就举一个,咱们比如这个放假锁门,哎,我们这个学校锁门,锁门呢,那就必须等待我们所有班级的人全部走完,比如一班咱们这个没人了,我们这个没人走完了,没人了,二班没人了等等,只要他们全都走完了,我们才来锁门,假设呢,我们现在有五个班,诶,我们要等待五个班,五个班全部。做完我们可以锁大门,那想要完成这个工作怎么做呢?好,我们就可以使用分布式的闭锁,当然我们这一块呢,全部是演示分布式下的这些锁操作。
01:11
你们说本地锁呢,如果我们应用复制上doer,那就完蛋了,好,那么现在来写一个public词润,比如呢,我们有一个方法就叫lock door,我们现在想要锁门,但是锁门呢,不是上来就锁的,来写一个get map,比如我们这个门卫现在想要锁门,好,我们这个请求就叫lock door,门卫想要锁门,然后呢,只要锁门锁成功了,那么就给他打印,诶,放假放假了,哎。那没扫成功,那么就得等待所有班人全部走完,我们才能锁,所以呢,我们再来提供一个请求,好,那现在来用response body来演示呢,都以请求的方式,这样就更好看了,比如呢,我们就叫gogo,好,我们现在呢有五个班想要都要走,我们写一个get get map。
02:07
好,我们假设呢,方法我们就叫go gogo,哪个班的人走了呢?比如我们给个班级的ID,我在这还必须接受一个班级的ID,我们来写一个an pass variable,好,我们来接受班级的ID,只要他们走了,我们就来返回return,哎,我们几班,我们就是这个ID,这个几几班。的人都走了,那么想要调度这个过程怎么调度,我们每走一个班,我们还得实时监控,五个班都走完了,我们才能全部放假,那么就可以来使用我们这个分布式的闭锁,我们使用reddi,它呢有一个方法叫get,有一个叫counterdown launch,诶我们看到这个lunch池呢,有一个叫闭锁的名儿,比如我们就叫door,我们这个门,那现在呢,想要放假锁门,但我们得等待五个班都锁完,我们这个才能执行我们业务,放假了我们去来锁门,所以呢,我们拿到这个闭锁,这个闭锁呢,我们调用一个方法叫外,什么叫away,就是等待,等待什么呢?等待闭锁完成,所以我们这个away意思呢,就是等待我们这个闭锁。
03:18
都完成,那到底有多少个人,那我们可以在这设置一下,这有一个door,有一个叫set count,我们写一个五,相当于呢,我们将会等待五个班的人都走完,那么就来锁门了,那接下来每一个班要走人,我们就可以使用这个方法,Red点一个还是get counter,当lunch好,我们呢还是这个door,因为这个闭锁呢,都是同一把锁,这个人在这儿,门卫在这儿等着锁门呢。所以呢,别人就得一个一个挨个走,我们走一个就countdown一个,好countdown呢,这就是相当于计数减一计数我们这个减一,我们只要走一个人,我们这个计数就减一个一,那我们这个门卫等到什么时候才能关门呢?那就是所有人都走完来,可以看一下我们这个效果走。
04:11
好,我们现在呢,想要锁门来,我们在这儿来演示我们的这个代码,我们同样是来local host1万端口们现在想要要锁门把这个代码拿到这。好,我们想要锁门,然后呢,我们在这儿来等待,来把这一块控制台让他等待一下,我们来清空我们这个控制台,我们现在门卫呢,想要锁门,这个是锁门方法,那我们顺便把这个每一个班都要走的方法也复制在这儿,每个班都要走,会调用gogogo,并且呢传入几班的这个名字,比如一班好,然后呢,我们准备要锁门,走,我想锁门,但是一直在这转,锁不了,锁不了的原因那就是我们这个是一个闭锁,这个锁呢要有五个数,我班呢每走一个减一个好,我走一个走。我们返回一班的人都走了,哎,但是我们这块异常,异常是我们没responsibility body行了,不responsibility了无所谓,好,我们再来走一个,我们来给一个二好,二班的人又走了,来看一下我们的这个B锁的基数好减了,然后呢,我们现在走一个三,三班的走好三班的人呢又走了,哎,这一块呢,页面找不到,无所谓,我们来看什么时候锁门好,我们四班的好都走了,还有五班的走,诶我们五班的人都走了,我们这个门卫呢,就锁门了,放假了。
05:30
这就是我们说的闭锁,等待其他全部完成以后,我们再来干这个事。但是我们现在用的是一个分布式闭锁,要无论服务复制多少份,我们这块代码都会运行成功。而且reddi里边所有的锁跟我们以前guc的都是一样的,比如guc里边以前的闭锁countdown lunch,我们看这就是guc包下的,我们guc包下的也有闭锁,包括这个闭锁呢,也是countdown white方法,所以说一模一样的,包括我们guc下也有simple for,我们的信号量,比如我们来看一下simple for,诶,我们这个guc下边的跟我们的使用方法是一模一样的,比如我们来new一个simple。
06:14
我们想要使用这个信号量,我们就可以给他传,诶比如现在是五个车位,那每组一个呢,我们可以release死一个,诶每组一个我们在这儿release一个,然后呢,每想要停一个车,那我们就A块一个。这其实跟我们以前guc里边的所有用法都是一样,包括我们以前的分布式锁以及读写锁,我们都可以参照guc里边的,比如我们读写锁,我们可以new一个guc里边有一个re read right look,这就是我们的读写锁,我们创建出读写锁同样的。这是guc包下的我们独家读锁写加解锁,所有东西跟guc的API完全一样,这是我们给大家演示的我们red完成的各种分布式锁,大家在下边呢,也可以来测试一遍。
07:03
包括后来这些东西,我们在后来的系统里边也会使用,当然guc的所有详细所得内容,大家还是参照周阳老师讲的guc相关的内容就行了,比如Java u concurrent这个并发包下的所有的锁都怎么用?
我来说两句