00:00
各位同学大家好,我们继续通过前面的理论知识介绍,那么来到了我们的第二板斧local的动手编码阶段,那么我们将从最简单的起手式hello word讲起,结合API官方文档给大家说一下这些方法该怎么用,分别有什么意思。第二个结合我们的阿里巴巴开发手册,对thad local它相应的编码规范做一些要求和深度的讲解,以及为大家介绍th local使用过程当中的注意事项,以及有哪些坑。好,下面编码的时候,我们为了接地气,先来说一下我们的需求。假设。某房产公司。五个销售卖房子,那么集团高层只关心销售总量的准确统计数,比如说某某某集团,你告诉我某某某门店,你们这个门店五个销售,今天卖出去多少套房子,按日、按月按周统计等等等等。那么上层的集团。
01:00
总公司它是按照总销售额统计,我只关心你们这个这个月卖出去多少套,走流水,然后我们按照规矩方便集团公司给部门分发奖金,OK,那么这个时候同学们就有点类似于我们这儿这个资源类。那么现在是买一套卖出去一套叫加个一,卖出去一套叫加个一,这个总的销售数叫加,那么自然而然,兄弟们为了保证这个数据安全,我们怎么着是不是?群雄逐鹿起纷争,就是大家都要往里面报自己的速,我卖了多少套,那么这个时候干嘛?为了数据安全是不是只能加锁啊,SYNCH啊,Lo unlo等等,好,我们来说一下我们之前的。那么来我们这。第一个需求就是这么简单,五个销售卖房子啊,集团高层只关心销售总量的准确统计数,那就是五个销售,卖一套加个烟,卖出去一套加个烟,那么在考虑到多线程并发的情况下,我们是不是要加锁呀?也就是我们这儿所说的大家都要往里面去写,那么这个时候只能加锁,OK,好,那么同学们这个也很简单啊,那么public,那么synchize VO。
02:12
Cell。耗那么点一套我加个些,点一套我加个些,加些,那么这个总数是不是就往里面加,这个就跟我们卖票一样,没什么好说的,OK来我们重点不是讲这个,只是为了给大家做一个演示和两者的对比,那么现在线程操纵资源类几个线程,那么来吧,是不是五个线程,那你这五个线程,五个销售人员。你卖了多少套啊,那么这个时候我们不能说写死了,对吧,我们模拟的像个样子。我们来搞一个随机数,那假设啊,就是呃,五零到四,那么加个一,OK,那么size。这么说,同学们没问题吧?那呃,相当于说啊。在这块。
03:02
这个呢就是一好,那么干一件什么事呢,我们呢,就。也把这个size打出来,就是模拟随机一下啊,像个样子,就是比如说五个销售,五个县城,第一个县城进来随机了是个二,那么说明什么,我就卖出去两套房子,那么每卖一套现成操作资源类,那么我们就点一下这house OK完活,那么现在这五个都完成了以后,那么假设啊,我们就。0.3秒以后,300毫秒以后,我们来看看统计一下,我们现在就是。共计卖出多少套,那么来吧,搁到这儿了,以后我们是对house啊这个资源内,那么现在求它的这个销售速的。计算是多少。那么来,同学们。程序很简单,咱们一跑结果大家请看每个线程332,那么加起来这是80 15套,没问题吧,相当于说这五个销售,那么他们的随机卖出来这的繁数的套数就是这个size,我们大家运作了以后,我们会得到最后这个魅县城啊,相当于是集团总公司啊来进行统计,那么共计卖出多少套啊,15套,你这15套怎么来的,就上面这些累加OK吧,那么这样呢,大家请看一下,这个不用我多废话了,对吧,这是80,那么再加27套,这么一家很简单的事,OK,那么所以说这个呢,不用多说,就是我们以前的卖票,OK,下面的问题是。
04:33
需求变了。总公司只关心一个总的销售额度,那假设这次你就卖了17套,那么给这个部门的奖金假设170万,好吧?王华,集团总公司就不管了,但是对于各个销售,就是这五个现成,怎么可能销售是拿一样的工资的,销售都是走提成的,对吧,按业绩说话,所以说需求变了往下降,从集团总公司降到了各个销售,那么这个时候呢?
05:06
希望各自分灶吃饭,打破大锅饭和平均主计各凭销售本是提成,按照出单数各自统计。那么来,同学们请看。比如某房产中介销售都有自己的销售额的指标,自己专属自己的,不和别人掺和,能理解我们现在要用哪个了吧?所以说呢,结合我们之前所讲解的内容来,在这儿它能干些什么?每一个线程都有自己专属的本地变量副本,那是不是应该每一个销售都有自己专属的?销售额好,总共部门卖了十套,A卖了五套,B卖了三套,C卖了两套,那么这个时候我们自己有自己的销售额,不可能跟别人独享好了,那么下面需求听懂以后,咱们立刻代码说话,那么也就是说咱们在这儿呢,需求呢就变成了咱们一个。
06:06
随机住的房子各自独立销售自己业绩按提成走,分灶吃饭好了么,来吧,开始使用red local,那么每个销售自己的业绩自己背,那么接下来就要来了,如何正确的使用10LOCAL呢啊?Thread local,那么销售额就这个好,那接下来啊。他的自己的销售额,那么接下来啊,我们先这么写,相当于说前面已经介绍过,自己的销售,自己的额度自己背,不跟他人共享,每个县城都有一份。OK,那。打开我们的API。这五个方法。Set get remove。一看就明白,关键是这两个。Initial value和with initial OK,那么下面它的意思就是说返回此线程局部变量当前线程初始值,而这个和这个它们两个是一样的,作用都是创建一个线程的就不变量,并且有初始值写法不一样,那么来同学们,我们简单的可以来看一下啊,返回此线程就不变量单线程的什么初始值?该方法将被调用的第一次一个线程访问与可变的get方法,除非线程先前调用过set,否则的话在这种情况下。
07:26
这个initial value方法将不被调用的线程,通然每个线程最多调用此方法几次啊,只有一次啊,就是初始化数据,但如果后续调用了remove后跟get,则可以再调用此方法,就相当于说你先了以后再跟get,那么再第二次调用,好等好说这个实现只反馈什么?那哎,如果后面重要程序员希望线程就变量具有除那以外的初始值,注意一般都要给它初始化,否则会报控制针异常。所以说我们所local必须对local进行子类化,并且什么重写此方法通常将使用什么匿名类不类那么一句话。
08:07
每个销售进来,你的销售额一初始的时候是多少呀?当然是零了,我一套房子都没卖,那么这个时候我们就要用调用这么一个。初始化的方法告诉你,你的这个local类型的这个销售额初始值啊,就是零,OK,那么该怎么写呢?那么结合我们阿里巴巴的规范,大家请看一般他要按照刚才我们所说的用什么匿名类不类,好,那么这个时候请看通常将使用匿名类不类,那么先说一下这个要介绍,但是现实中不再用这个方法了,至于说为什么呢?我们先写完咱们再说来,那么同学们,那么现在就是尿在的local。好类型呢,先写这个啊,哎。先写这个啊。那么来它呢?直接搁到这儿,那么现在我们protected的这个。
09:03
有这么一个initial value这么一个方法,Return,兄弟们几,我们就给它写为零,说明什么?每一个线程一旦要调用的时候,先获得自己这个销售额的初始值是多少都是零,OK,所有销售公平都是从零开始卖,那么好,这个就是什么所local这种变量的初始化方法,这是其中之间,但是工作中不要用这个了,为什么?匿名内部类是不是写的非常的繁琐,非常的。冗于难看啊,所以说加八之后给我们带来了一个新的写法,这个我泥鳅和前面这个是一样的,来,那么他呢,这么干。请大家呢,按照老师的建议给这么写,还是销售额,以前我是六一个用匿名累不累?现在呢,请大家看这哥们是个什么static,静态的,所以说thad,嗯,Local第2WITH,那么这个时候supply,前面介绍过了都晓得诶。
10:04
键盘飞了,好,那么这个时候说明什么?相当于这样的写法,作用和上面这个是一模一样的,两个是ERR2 R1的事儿,推荐大家用这个,这种东西是不是写着清爽啊,相当于是outlow outlow等于等于什么尿对不对,Outlaw,那么这样假设这我写个零这样的,那么这样的话呢,是不是?定义和运用起来的特别清爽啊,我个人呢喜欢用这个风格,而且这个的话前面说过了,这个方法的话呢,它是出自于多少加法八,所以说用它清爽一些好,那么下面public,那么这个时候我就不再加S了。同样不加s look and look要解决线程安全的问题,因为每个线程独自一份,自己用自己的,我跟别人不争,所以说这个时候为的你的销售额。BY什么ad,那么相当于说这个就是什么自己的销售额通过。
11:03
自己去完成,OK,那么这个时候我们应该怎么玩呢?那么这个就是销售额,我点一下点二赛是不是应该加一套,没错吧,跟上面一样,但是注意每个销售可能这个销售卖了三套,另外一个销售卖了五套,他都有累加的,所以说我们这儿基本上要把销售额度在线get。OK,好了,那么相当于说跟前面一样,前面是大家吃大锅饭,我只关心总数正确,所以要think加加,而现在是分灶吃饭,各是各的,所以说我点一下这要回累加,那么先得到上一次,比如说我卖了第一,开出了第一单,我初始值是多少,是零,我点一下卖出去第一套是一加零,就是一,那么现在我这个销售。我的额销售额度就是接再点一次,又卖了第二套,那么是不是先获得自己县城身上拿的这个值是多少?是直接一加一等于二说明什么?我又设置回去,我目前我这个销售的额度就是两套,本月我就卖了两套房子,假设这样好,那么下面我们就来喽。
12:08
我们搁到这儿了以后,还是熟悉的配方,还是熟悉的味道,那么跑到这儿,这个呢,就。注掉吧,OK好了,那么我们呢,House那么来吧,我们现在销售额度是buy这个的,那么这卖完了以后我们来统计一下。那么这个时候好销售卖出,那么你卖出多少套啊,那么这个时候我们来看看这个。线程操作资源类,你资源类里面的话,这个时候我们呢,来看一眼你的这个销售额是多少,那么大家看我要打出这个OK,那么得到它是个什么TH的local,那么怎么获得它的方法,那么这个就是我们的get,同学们没问题吧,那么接下来我们就要清清楚楚的给大家反映共计卖出多少套,那么每一个销售分别卖出了多少套,OK,那么干脆这个也用不到了,我们把它直接呢删掉,那么同学们跑一下程序,看一下后台运行的效果。
13:10
此时我们会清清楚楚的看到,一号销售卖出了三套,二号销售卖出了一套,三号卖出一套。那么。举一反三。这个时候大家请看三。基本上四到71套怎么来的,就是这么一个情况,OK,所以说大家请看啊,这样的话呢,就是什么保证每个销售自己独立的销售额度,销售额在这说的清清楚楚,你这12套怎么来的,一号销售卖三套,四号销售卖两套,那么六。对吧?那么这是九,那么这十,12套就这么来的,OK,这些加法很简单,不再废话,那么所以说听懂这个意思,那么得到我们这儿上述需求,我们就可以清清楚楚的深刻理解什么叫人手一份天下安,OK,所以它出现的意义就是可以不加锁,同样解决线程安全的问题,好,那么来吧。
14:06
我们呢,就可以看得出,针对上述需求,我们就完成了我们对应的编码,各个销售各自凭本事吃饭,好,那么这个就是我们对local做的一个讲解,那么下面来想想啊,我这么写有没有什么隐患和bug,好,待会。阿里巴巴编码规范,咱们继续走起。
我来说两句