阅读445 返回首页    go 阿里云 go 技术社区[云栖]


面试官问你ThreadLocal原理

如果面试碰见让你解释ThreadLocal。怎么解释?
首先:ThreadLocal是线程封闭技术中的一种。那么什么是线程封闭?当访问共享数据时,通常需要同步,一种避免使用同步的方式就是不共享数据,如果仅在单线程内访问数据,就不需要同步,这种技术就是线程封闭。

然后:解释Thread和ThreadLocal之间是什么关系?
虽然是通过ThreadLocal来设置特定于各个线程的资源,但是ThreadLocal自身不会保存这些特点的数据资源,每个Thread类都有一个ThreadLocal.ThreadLocalMap类型的名为threadLocals的成员变量,那么这个threadLocals就是用来保存哪些通过ThreadLocal设置给这个线程的数据资源的地方。看JDK,当通过ThreadLocal的set(data)方法来设置数据的时候,ThreadLocal会首先获取当前线程的引用,然后是getMap(t)是吧,然后点进去这个getMap(t)方法,得到就是t.threadLocals。所以threadLocals就是保存。
举例:以一个条高铁线路作为例子说明Thread和ThreadLocal之间关系。
深圳到北京是一条高铁线路,中途有长沙,武汉等站点。线路上跑的是和谐号,和谐号有很多,和谐号1,和谐号2......。
那么这条高铁线就是Thread,和谐号就是Thread的threadLocals,和谐号就是装载保存乘客(数据资源),那么武汉站,长沙站就是乘车点。乘车点就是ThreadLocal,乘车点的目的就是set(乘客)到和谐号(threadLocals)上去。那么同一个乘车点(如武汉站)会为很多高铁线路set(乘客),但是只会将当前乘客指定到当前的正在停靠的和谐号(threadLocals)上去。也就是只会将当前的数据资源指定到当前的线程中。
很多书上会将ThreadLocalMap,可以参考上面总结讲给面试官听一听。

最后更新:2017-06-06 21:38:46

  上一篇:go  香港ECS上的MySQL数据同步到数加MaxCompute
  下一篇:go  python-代码库 :requests 模拟登陆网站