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类(源码分析基于JDK8) 问答内容 1、问:Thre...
    Sophia_dd35阅读 2,104评论 1 36
  • 移步Android Handler机制详解[https://www.jianshu.com/p/e37e2db2b...
    凯玲之恋阅读 900评论 0 0
  • 以下内容转载自:ThreadLocal 深度解析最近想学习ThreadLocal原理方面知识,通过多篇博客对比学习...
    逆水寻洲阅读 770评论 0 2
  • 一.对ThreadLocal的理解二.深入解析ThreadLocal类三.ThreadLocal的应用场景 对Th...
    CoderZS阅读 426评论 0 1
  • 爸:床前明月光 娃:疑是地上霜 爸:抬头思故乡 娃:举头~ 娃:妈妈,我做了一个梦。我梦到美人鱼了。 我:为什么呢...
    zjj朱阅读 153评论 0 0