00:00
下来呢,我们往下看看,下一个叫做闭锁,什么是闭锁呢?我们说所谓个闭锁是5.0上是不是也提供了这么个方法,这么个类,所以这个B锁呢,它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直处于等待状态,说白了就是什么意思,说白了就是说说当你要完成一些运算,如果其他的运算没有完成,对吧,那我就怎么办,当其他运算都完成了,那是不是我当前的这个再继续执行啊,这就是所谓的闭锁操作,说什么是闭锁?过来,我们试一试,叫做test count do down a。叫做闭锁,闭锁说什么是这个闭锁呢?所以B所就是说在完成某些运算时,在完成某些对吧,运算时,只有只有其他所有的运算全部完成,那么我当前的这个运算是不是才继续执行啊,当前运算才会继续执行,或者说其他所有现成的对吧?所有现成的运算全部完成,当前的运算才会继续执行,这就是一种闭锁操作,比如说什么意思呢?以前咱们是不是都计算一段代码的执行时间呢?你以前要是用多线程的话,你能计算,比如说十个线程执行完一共要多长时间,就是我们说开启十个线程,十个线程是不是并发执行啊,对吧?我们要计算这个时间的线程。
01:51
全部执行完对吧?一共要多长时间考虑过这个问题吗?对吧,你十个线程都是并发,并发的执行,那你说你要是不用这种闭锁操作的话,那你说说它怎么计算呢?是不是计算不了啊,对吧?那我们现在接下来是不是就可以模拟一个这样类似的操作的呀?对吧?比如说class叫做B锁,叫做let DEMO,然后让他去implement runable,然后来个什么意思呢?在这里呢,我就来一个B组,叫做private comedown lunch,对吧?然后呢,然后来个叫做LTCH,等于不等于这个分号,然后是不是等着传过来啊,我搞一个构造器对吧,DEMO搞一个构造器,然后呢,传过来一个count down LA ch。
02:48
对吧?然后this.less等于Fla对吧?Ctrl shift都导下包,那么其他人我要干什么呢?我现在啊,就先在现成中对吧,打印或者说呃,就是打印5万以内的偶数可以吧,对吧?来个简单点的,我们说就来打印5万以内的偶数,就判断if I取模,零等于这个呃,穷二,穷二等于零对吧?然后呢,我去c out这个I的值是不是挺简单的呀?那么接下来呢,我们说我们先不考虑这个闭锁的问题的话呢,我们是不是先执行啊,先来个let DEMO l let DEMO等于new一个LD等于new,一个light DEMO,这是不是就是我的那个线程类啊,但是呢,我现在得先传,那我就先传一个叫做count。
03:48
到let叫做LTC,等于谬一个B数,然后这里指定一个五媳妇再给大家解释啊,现在我传他,我说不用,我说没用啊,没用呢,现在呢,我就让大家感受这么一个事儿,我现在呢,我要开启十个线程,是不是来个破循环呢,我要开启十个线程,我让这十个线程是不是同时的去执行这个这个刚才那个5万以内偶数的操作呀,用一个thread,然后传过来一个LD,然后点去start,是不是十个线程都去操作,都去访问计算5万以内偶数的一个,呃,一个操作吧,打印5万以内偶数,那现在呢,我要干什么呢?我要计算执行时间,计算执行时间我们说单纯的这样,你觉得能不能计算,嗯。
04:37
你觉得行不行,为啥不行,是过是吧,为啥为啥不吱声呢?叫耗费时间为是不是来个叫做呃,拼音上叫做and减去start呀,And减去start问能不能计算出来时间,因为为什么不能,因为我这是主线程吧,这是十个非线程,这11个线程他们怎么样说同时的执行,那哪哪能计算出来一个时间呢?那我希望的是中间这十个线程结束了,那这俩是不是才执行啊,对吧,而现在十个线程同时执行,你是不都看不出来,有可能你是不是看不着这句话都对吧,因为他说先都执行完了,确实没看到那句话吧,但是不能代表那句话没执行吧,对吧,他已经执行了,只不过这是为主线程,这是十个分线程11。
05:38
这线程同时执行,你没有办法计算这段代码的执行时间,是不是行理这能听懂吧,那么现在我们希望什么?我们现在希望是不是主线程在,哎是不是等待啊,等待这十个是不分线程都执行完了,我主线程再执行,那实际上这也算是对线程控制的一个操作吧,对吧?那这就是对线程控制的一个操作,那么也就是说什么呢?我们这个时候就需要用到闭锁,也就是我当前运算得等其他所有线程的运算都完成以后,当前运算时候才能继续,那这个操作必须用到这个B图。
06:21
那么怎么用呢?我们说这个闭锁呀,它实际上它是不是就说一个倒计时啊,是不是cut cutdown light叫倒计时闭锁吧,或者是倒计时阀门,是不是类似于这样的翻译啊,实际上它在底层就维护了一个变量,我刚开始是不初始化这个变量为十,这个五啊,刚开始初始这个变量为五,也就是说你每一个线程当执行它的时候呢,就会把这个变变量你得D减一,每次一个线程去操作它的时候呢,你每次都D减一,D减一什么时候当它维护的这个变量运行为零了,那就说明它所有的任务都完成了,也就是说它可以进行继续执行了,就是每次你有一个线程完成的时候,你是不是就递减一啊,线程这操作是不是递减一啊,以此类推吧,对吧,那么怎么来呢?我们说你这个操作完成,你要不要把这个B锁减一。
07:16
对吧,我们注意我传过来的初始容量是不是为五啊,这意思是不是有五个线程在操作它对吧?注意啊,我这里是五个线程操作它对吧?所以说它俩是不是得一致啊,所以说呢,每次呢,你都得D减一,也就是说我得这个let b所得叫做cut down,是不是要减一啊,看不到减一才行,并且你这个减一操作是必须执行的吧?啊,他要是减不不为零,你是不是有其他线程它得一直在那等你说得让这些代码一定要执行。怎么能让它一定要执行,哎,那首先得得放到finally手中才能严谨一点啊,来个TRY,然后来个把它放到TRY里来一个叫做finally,然后呢,让我这个light,然后实现的维护的那个计数器给它递减一那十个线程访问,它是不是也可能存在一些线程安全问题啊,所以说我给它加个锁有问题吗?
08:14
这没问题吧,对吧,是不是有可能存在现制安全问题,对吧,加个速,那这个时候呢,注意看我还没完,你这个只是D减一吧,对吧,它不减为零,我的主线能力怎么样,是不能直径得等着呀,对吧?那么等着的话,那也就是说我得在这里用这个let.waitit等待它有一个异常,是不是给它抛抛出interrupted exception还知道干啥的,不是不是用于中断的呀,对吧,用中断那是let wait呀,对吧,注意这个let他们是不是用的是同一个实例呀,对吧,那这个时候用尽。运行。这个就没有,是不是就有了呀,对吧,那这就是闭锁的一个操作,也就是说你等得得等其他的所有的线程上面所有的运算都完成了以后,我当前预算才能继续,这就是一种闭锁的操作,能听懂吧,能说吗?精东生就用的这个东西啊,精东专这个干嘛呢?京东专用这个,比如说他搞那个对吧,我们实际上可以回头也可以模拟的这个操作,他是不是搞每是不是有很多这个type类型商品是不是都有类型啊,然后他就根据类型运算出不同的类型上是不是有很多的库存,这个类型上也有库存,这个类型上也有库存,就这个类型上也有一大堆库存的,对吧?然后呢,他最终要算出各个库存的,比如说总和啊,平均值啊,平均的销售时间呐,等等等等等类似的操作,来最终把这些操作完成了之后,我们是不是可以算算所有库存的总和,所有库存的。
09:57
什么平均值,所有库存的平均销售时间等等,类似于这样的操作,那可能那也就说,那你要是说单线程完成这个操作,你说效率低不低,你你说成这个再算这个,再算这个,再算这个,那是肯定低啊,于是怎么办?是就多线程啊,一个线程计算,比如说这数码类一个线程计算,这个食品类一个线程计算,图书类一个线程计算,什么什么别的类,然后呢,当他们所有的都运行完了以后,说不最后再算出总的,那也就说你这个总运算,你是不得等前边的这一大堆运算完了以后才能算总运算,那这是不是就是用B组的操作是不是。
我来说两句