ThreadLocal

ThreadLocal是一个关于创建线程局部变量的类。使用ThreadLocal创建的变量是线程隔离的,其他线程则无法访问和修改。开发过程中利用ThreadLocal可以比较方便的实现线程级别的局部变量,典型应用:Spring MVC中的HttpServletRequest、SecurityContextHolder等。之前对于ThreadLocal只是知其然不知其所以然,本着求是的态度对ThreadLocal源码做了进一步的解析。主要有几个部分:简单应用实例,关键名词及其关系,关键方法及其主要流程。

下面通过一个实例直观感受下ThreadLocal实现的变量的线程隔离:


多个线程共享threadLocal变量


线程隔离

ThreadLocal、Thread以及ThreadLocalMap

三个ThreadLocal相关的关键名词的相互关系为:每一个Thread中都有一个ThreadLocalMap存储线程级别变量,ThreadLocalMap的key为定义的同一个ThreadLocal变量。ThreadLocal虽然只有一个并且在Thread之间贡献但是却可以从不同的Thread中取出不同的值的秘诀就在于此:key虽然是同一个但是Map却不相同。

ThreadLocal方法主要是set,get,remove以及initial,

    set:首先从Thread中拿到ThreadLocalMap,判断ThreadLocalMap是否为空如果不为空以当前ThreadLocal作为Key存入ThreadLocal,如果为空创建map然后存储value。

set

get,remove也是一样,先从当前线程拿到相应map再做相关操作。

getMap:实现真的超级简单:


getMap

另外ThreadLocal还提供了一些诸如createInheritedMap、withInitial等相关方便操作的方法。有兴趣的同学可以研究。

你可能感兴趣的:(ThreadLocal)