00:00
各位同学大家好,接下来给大家介绍第十章聊一聊riad local,那么从字面意思上翻译线程本地,那就是本地线程或者叫线程本地,那么网络上对它的翻译呢有很多种,那么目前我们建议呢,和官网保持一致,Th local提该类提供线程局部变量,所以后续我们都叫它线程局部变量,好,那接下来。在说他之前为什么要学?他冒出来以后又解决了哪些技术痛点?我们呢,不管三七二十一,先过来看看他的简介,那么它是什么,怎么出来的来?先来看看恶心的大场面试题,而实不相瞒,我就见过很多,至少见过四次了,直接来问你,请说thread thread group和thread local分别是什么意思啊?前两个好说,它的暗点是这个,尤其它现在考的呢,非常非常的多。那么来,同学们不妨我们来搂。
01:03
第一个thread local当中,Thread local map的数据结构和他们两者的关系是什么?第二个local的key是弱引用。为什么要用沃若饮药?这是为什么?涉及到GM第32的log当中内存泄流的问题,你知不知道第42的local当中最后为什么要加remove方法,这是为什么?OK,还有其他,那么所以说呢,兄弟们来吧,咱们继续。首先来看一下所是什么,它能干嘛?结合我们前面的知识,注意我们前面是不是讲过一个东西叫内存模型GMM也是它的一个前置知识,那么下面我们来看看它的出现给我们解决了哪些痛点,带来了哪些好处。好,同学们抬高。这是我从官网拷贝的原始官网的解释,稍微翻译一下。这个类提供了一种线程局部变量,这些变量与正常的变量注意不同。
02:07
OK,它不是一样的。因为每一个线程变量在访问所有的local实例的时候,访问的方法是通过set get啊,都有自己的注意,独立初始化的变量副本,我们在哪说过?变量副本中的东西,我们是不是在GMM这章介绍过?还记得这个图吗?好,待会聊十的local实例通常是类中的私有静态字段。使用它的目的是希望将状态,比如说用户ID或输ID与线程关联起来。OK,英文原版,这是中文翻译,我相信如果你自学的话,第一次接触local这个知识,那么可能读下来以后每一个中国字啊。你都明白,但是拼起来的话或多或少有点懵逼对吧?那么接下来跟着老师来,那么首先他能干一件什么事啊?为什么会有这种东西?那么同学们请看。
03:09
他要实现的是每一个线程都有自己专属的本地变量副本,也就是说自己用自己的变量,不麻烦别人,不和其他线程共享,人人有份,人手一份,人各一份。那么主要解决让每个县城。绑定自己的值,通过set get方法获取默认值,或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。哇塞,这个太爽了,从而避免了线程安全问题。那么言下之意,是不是也是一种解决线程安全问题的途径啊?那么来吧,同学们,我们先来看看这个案例,然后咱们再来说说我们这个模型。来。老规矩。又是我们的什么AB法则比before?
04:04
After,还是那句话,不是会用,要给同学们讲清楚这个技术的演变和原理。好端端的,为什么出现这个技术?你解决了哪些问题?那么来吧,那么杨哥local好像听你这么说了一遍。模模糊糊,那么下面能不能用一句话整明白呢?那么听好。所谓的local,它的出现以及他能解决的问题,就一句话,在他出现之前,为了解决现场安全问题,我们都是什么?群雄逐鹿起纷争。他之后出来了以后,他所能完成的东西,那么就是什么人手一份天下啊,OK,同学们,Local出现的意义,解决的问题,讲完了就这两句话。好,我杨哥听不懂,说人话。来吧。我们现在再读一下我们的理论实现每一个线程都有自己专属的本地变量副本。
05:00
自己用自己的便利啊,不麻烦别人人各一份好弟兄们,假设我们这儿有一个资源类,我们之前讲过八所那个案例还记得吧?那么现在我们的资源类就是一部电话,我们晓得的现在的问题就是什么?多对一多是人,一就是这个资源类。有铁仅有一份,为了避免大家的争抢,那么大家要去用就要去争抢,为了避免大家的争抢出现数据不一致,吃相太难看,我们所研发的能耐是不是加了SYNCH啊?OK,或者我们的洛安洛这么说,能跟上再直白1.cas吧,对吧,管你是乐观悲观或者等等等等那么一句话,同一时间段只能有一个线程进来。OK,其他的线程只能默默的在外面排着队,我不管你用这个缝去干什么,总之一句话,多对一的情况下,为了线程出事。
06:03
避免县城出事,吃相太难看,咱们就只能转枷锁,没问题,这个呢,安全性得到保证,性能下降,所以说这个时候我们就思考一个问题,假设一部手机,这个手机也就是在这种模型。是不是叫什么公用电话。一个人在打的时候,后面的人只能排队打,大家都很烦,那么接下来如果我们实现像什么?人手一个手机,人人有份,那么弟兄们,你晓得的,还需不需要加什么锁?不用了,基本上我们现在是不是完成了一对一这样的模型,相当于说一个线程就有自己的一个专属的手机,你用你的,我用我的,回答我这个时候是不是人手一份天下啊?不用多废话了吧,这个时候我们都清楚资源类,假设现在有三个人,每个人都有一部手机,OK,还抢什么抢,还需要加这些东西吗?
07:05
不用了,所以说这个某种角度而言,就是我们thread local。他。出现的意义。非常舒服,人手一份,好,那么同学们回到我们这儿。原来我们讲解过在GM内存模型,多线程对主内存当中的同一个共享变量。他是不可以。乱修改的,因为这个是大家共用的,这就好比我们原来说过锅在这儿,锅里面放着粥,你也爱吃甜的,爱吃咸的,各自打到各自碗里面,你自己去吃啊,你不能破坏公有的,对吧,不能直接修改它,只能说读出来了以后在自己的。各自线程私有空间,就是各自线程的本地内存空间里面自己改完了以后,如有需要你再写回来,通过GMM完了这些等等,我们前面讲过的跟其他线程进行消息的互换和通知啊,那么现在我们的问题就是你现在呢,需要线程,哎,你自己有的东西,你自己有些信息,你不必要写回主内存,你也没有必要跟别人共享,那么这就是什么?该写回去的你写回去,跟你自己相关的,你自身留着一份,跟别人不相关,那么这就是我们前面所说的自己用自己的。
08:27
不麻烦别人,人人有份,人各一份,OK,那么这个就是我们local所出现的意义,说白了,让每个线程绑定自己的值,自己搞定自己好。那么接下来。同学们,我们再举一个反恐精英射击游戏的一个画面,一个案例,这是最经典的。来吧,目力所及,眼前所见,123456。总共六个游戏玩家,假设每个游戏玩家就是一个线程,那么大家都清楚,对于游戏角色,这个游戏角色他的生命值啊。
09:04
它的武器数量,它的金钱经济金额分别是多少?是不是应该是六个县城六个玩家不同的结果呀?那么现在是不是应该是每一个县城都应该自己带着自己的血槽?护盾,哎呀,经济金额,手榴弹速等等等等,那么这样是不是人手一份人各一份,每个玩家的装备、经验,血槽,武器均不一样,OK,所以说th local干的就是记录只属于自己现成的一些东西,不用写回,不用写回主物理内存的内容,OK,所以说它存在的意义就是这样,那么反过来讲,人手一份了,还需不需要加锁,不需要了,那么这样是不是也是可以用人手一份出现的意义来解决了什么线程安全的问题,这么说能跟上避免了线安全问题,好,那么它的API,那么同学们我们可以简单的看一下,那么一切都要从什么?
10:06
最简单的hello world开始构造器。就这么一个方法,不多get这个这个这个这个好我们来。我们将会对这五个方法进行详细的解释,保证大家一举拿下对应的API。好,那么API呢,和刚才我们看的都一样,就给大家先说到这儿,下面从hello word开始讲起,结合阿里巴巴手册给大家演示正确的编码风格,最后我们再来介绍源码分析。
我来说两句