00:00
来看我屏幕啊。我们接着把剩下的一点知识点,咱们把它说完。呃。我们上一个知识点讲的是riad local相关的啊,我们的事务管理其中用了一个比较重要的一个组件叫local。这个瑞的logo呢?大家目前啊,大家得得会用来看一下啊,我们再看一下。在这儿。Connect,我们这个当中有一个叫thread local thad呢,我们可以认认为叫本地线程。啊,这个东这个东西它到底是什么呢?来,我们回到read me,我们回到这里面来。我们把这个three的logo,咱们一起来把它看一下。好,稍等一下啊。我们这边写一个叫的local。第二个。的logo。
01:01
那么第一个local,它有两个常用的方法。第一个方法叫get。第二个方法叫set。啊,我们可以扔一个对象。是set,那么瑞的我们称之为叫。本地县城啊,称之为本地县城。这个其实是硬翻译过来的,Local表示本地嘛,对吧,瑞表示线程嘛,啊称之为叫本地线程。大家需要注意一下啊,这个local它是和我们线程相关的。如果你是两个线程,你在第一个线程里面去set,你在第二个线程里面是获取不到的。大家需要搞清楚这一点。这就像什么呢?我们这个流水线,它是第一个企业。假设你第二个企业的流水线,你能获取到第一个企业的工这个工具箱吗?你是获取不到的。所以说他是和我们具体的。是和我们具体的线程有关系的。
02:02
所以我们通过set方法。可以往我当前的这个线程。啊,往我当前这个线程里面去存储数据。当然我说往县城里面去存储数据呢,这个其实呢,不是非常的准确。啊,或者说这个不是很很很正确。一会儿呢,我带着大家去把这个源代码可以把它看一看啊,但是呢,这个原理性的东西呢,如果说大家实在实在感觉到很吃力。啊,你暂时先暂时不了解也没有关系的,你先先学会使用它。总之大家一定要记住一点,我们的three local指的是,它指的是啊,同一个线程当中,我们进行数据通信,我们可以往里面去存储数据,我们可以通过get,在同一个线程内部我们可以去获取数据。啊,Local称之为叫本地线程。然后呢,我们。可以。通过。晒的方法。啊赛的方法在当前线程啊在当前线程上。
03:05
存储。存储数据。通过get的方法在当前线程上获取数据。哎,就是这样的,当然了,这个数据它其实并不是存储在线程上的,好不好,同学们。再来。那么我们一起来看一下它的get以及set,它是怎么来做的呢?咱们简单一起来看一下啊。比如说我这个local,我点进去。它里面有两个方法,Get和set。随便看哪一个啊,咱们比如说我们看一下啊。呃,Set吧,先往里面去保存set方法。赛方法是怎么做的呢?我们一起来看一下。赛的方法。源码分析,我们一起来看一下,这是我们的set方法。
04:00
你看一下他这个赛的方法,第一句话是什么,第一句话是获取当前的线程是不是。获取当前的线程。好。第二步是什么呢?第二步其实我们每一个线程啊。它其实都维护了一个叫thread local map这么一个集合容器。每一个线程都维护。啊,各自各自的一个集合容器。一个容器。我们称之为叫th map,你就认为是一个map。每一个县城都维护各自的一个容器。我们当前往这个县城里面去扔的时候呢,诶,我们扔了一个connection。啊,每个线路都维护一个自己一个各自各自的s local map好。所以呢,我们这个县城。把这个T放进去,就调用他的get get map这个方法,我们就可以获取到一个map。
05:03
那请问一下,如果我第二个线程过来,这个T是不是就不一样了。那你根据第二个线程第二个T,你获取到的map和第一个线程获取到的map是不是不是一码事。能听懂吗?他其实不是一码事。那你看看我们获救这个map想干嘛?哦,我们把我们一个对象,比如说connection对象。我们就可以把connection对象,我们可以去set。我们就调用一下set方法,就把这个connection你看就扔进去,你看它对应的key叫什么。Key是this。这个this是谁啊?This,是谁啊?This看好了,This不是当前线程。我这方写在哪里面,是不是写在three local里面呢?这个this是不是代表的是three local呀,啊,它这个key是我们当前的local。不要搞错了。啊,这个key是我们当前的local。
06:00
那肯定必须得是SP local啊,如果是当年现成,那是获取不到的。啊,不能存储的是当前现场的ID啊,这个之前这个有同学这个会造成误解。Else比较简单,Else就是说如果说这个容器你是第一次,第一次它是采取的是延迟加载或者懒加载啊,延迟初始化默认情况下,这个map它是等于none。如果说你是等于,那你为空为空,那我就重新初始化创建一个。啊,创建一个map,就这样子,创建map的时候,你看我们是不是把这个TT是不是就当前线程啊,我们把当前线程扔进去。来就是这样的。好了。那么我们同学可能会在这个this这边啊,咱们有同学可能会,呃,可能会什么呢?可能会很有疑惑,老师为什么这边是这个this啊,大家要知道我当前的程序当中,我当前的程序当中,我当前的local,你看我只写了一个local。
07:01
是不是里面存的是connection,请问一下假设啊假设我就随便瞎写一个假设,我这边一个THREE2。这里面存储的不是connection,假设它存储的是另外一个东西,随便意思一下行吗?我随便瞎写或者不写这个吧,我存储的假设是object吧,我瞎写一个啊,瞎写一个反正都没啥用啊,Li lock on。假设我还有瑞的local,是不是的LOCAL3啊。这个是不是就意味着同一个公司,它是不是有三个那个工作的纽带啊。能听懂吗?一个工作的留在上面只放一个工具箱,我这个公司要干活,你光靠一套工具箱不行,你得靠三套工具箱,那不就有三个思维的local吗?每一个three里面只放一个。然后,然后这个工具箱,我怎么去在同一个线程里面,听好了同一个线程。一个性能上面我有三个工具箱,我到底想取哪一个呢?是不是根据我的local这个key来取啊,因此这就是这边它为什么用的是this this是local。
08:03
有可能是three的LOGO1,也有可能是three log2,也可能是LOG3,因此我这个map里面是不是可以放多套工具箱啊?能听懂吗?就这样子,我假设有三套工具箱,那我这个map里面就应该有三对建筑队。Value就是三个工具箱。Key是什么?K是不是就是我的三个log,不就是我的三个工作纽带嘛,那也就意味着你K的话,你根据K去取取工具箱嘛,那就看你从哪个工作流带上去获取嘛。就这样子。所以呢,它这个map里面这个key是我们的local。好,就是这样的。好,我们写一下。这里的T。对应的是类的local。啊,因为因为什么呢?因为我们的组件中。啊,因为我们的祖经中。需要。需要传输或者叫共享。
09:02
的啊,对象。可能会有多个,也就是说不止一个。我们不止connection需要传递吗?假设我们还有其他对象也需要传递吗?那不就多个了吗?那多个我们怎么进行进行这个操作呢?进行存储呢?你得需要用多个。一个three的,我们只负责保存一个信息,再保存connection这个,保存fruit这个,保存其他的什么什么。啊,就是这样的。好,这个是我们所说的叫。Set这个方法。再来这个else就无所谓了啊,这个我就注释就简单写一下。默认情况下。Map是没有初始化的。啊,那么第一次往。其中。添加啊,添加信息时,添加数据时。
10:00
会去初始化,这个其实很容易理解。就这样吧。这是我们set,那你猜一下,如果是get的方法。啊,如果大家能理解的话,其实get就差不多了啊看一下。我们找一下get。好,就是它。这是一个get方法。从这到这儿,我们把它拷过来。放到这边来。一样的第一步,我们是不是先获取当前的线程?拷过来。这第一步获取当前的线程,为什么要获取当前的线程,我获取了当前的线程,我是不是就可以获取到这个three local map呀,咱们刚刚是不是也是一样的呀。线程不一样,是不是我所得到的这个three local map就不一样?每一个线程都会维护自己的local map。那同学们,我刚才是不是说过的local map是不是指的是我的工作纽带啊,那我一个公司可能不止这一个工作纽带,我可能会有三个四个五个是吧?有多个工作纽带,每一个工作流在上面只放一个工具箱,就这样的。
11:05
所以第一步我们先获取当前的线程。第二步。第二步。获取和这个县城其实就是我说的企业。啊,相关的map。Thread local map。啊,也就是什么呢?也就是工作纽带的集合嘛。是不是啊,我获取的工作流在的集合啊,和我这个企业相关的工作流在的集合。然后如果你不等于now啊等于,那就这个就就无所谓了,等于那的话,那我是不是就要去初始化啊,这方法不用看啊再来,然后如果你不等于now不等于那怎么办呢?This是什么?是不是当前这个的local对象啊。是不是three的local里three local是不是相当于是啊,我通过这个three的local是不是我才能,我才能知道我到底获取的是哪一个工作流在上的。哎,是不是啊,是的。好,所以说这个地方的this啊,指的是来。
12:01
指的是瑞的local。对象。啊,通过它。才能知道是哪一个工作纽带。就这样的。啊,那么我们就获取到的安全,那安全点value不就行了吗。好,这个比较简单啊,安全点,Value。Value。就可以获取到工具箱了。是吧?这个比较简单啊。好了,所以说我们这个当中比较关键的就两步,第一步我们一定是取到当前的线程,根据当前的这个线程去获取它的纽带的集合。也就意味着当前县城接下来是能够定位到到底是哪家企业。啊,或者这些这家企业所有的工作流带的集合。然后,然后比如说这个我们再通过你到底要根据哪一个工作纽带定位到哪一个工作纽带,我就能取到这个纽带上的工具箱。
13:04
或者我在这个地方,我定位到哪一个工作纽带,我就可以往里面去扔工具箱,往哪一个纽带上面去放工具箱。这是get。那行吧,咱们再继续。
我来说两句