您现在的位置是:课程教程文章
java threadLocal源码探究
2023-12-15 21:13课程教程文章 人已围观
跟汤老师学Java(第1季):初识Java
跟汤老师学Java(第1季):初识Java课程目标 零基础学习Java,用通俗易懂的方式讲解Java,最适合初学者的教程:...C#零基础手写FlappyBird【源码课件脚本加
C#零基础手写FlappyBird【源码课件脚本加扫码关注公众号,领取学习资料包 (含环境-视频-课件-代码-笔试题等)...阿里微服务架构Spring Cloud Alibaba源码深度
阿里微服务架构Spring Cloud Alibaba源码深度需要领取课前资料的同学可以加群联系萌萌或者艾琳老师领取资料 给你开通直...java高并发编程之AQS源码分析,java多线程
java高并发编程之AQS源码分析,java多线程...
有些人对使用ThreadLocal的使用不是很理解,这里还要从原理讲起。我们可以在其中找到许多方法,ThreadLocal可以加名称后面加入一些方法,然后结合在一起使用,可以把它看成方法的汇集。下面我们就以ThreadLocalMap使用为例,对ThreadLocal源码进行探索和分析。
1.ThreadLocal的内部结构
ThreadLocal并不维护ThreadLocalMap,并不是一个存储数据的容器,它只是相当于一个工具包,提供了操作该容器的方法,如get、set、remove等。而ThreadLocal内部类ThreadLocalMap才是存储数据的容器,并且该容器由Thread维护。
2.ThreadLocalMap实例
static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */ static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } } //还有很多很多 }
我们可以看到ThreadLocalMap其实就是ThreadLocal的一个静态内部类,里面定义了一个Entry来保存数据,而且还是继承的弱引用。在Entry内部使用ThreadLocal作为key,使用我们设置的value作为value。
3.ThreadLocal源码总结
(1)每个Thread维护着一个ThreadLocalMap的引用。
(2)ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储。
(3)ThreadLocal创建的副本是存储在自己的threadLocals中的,也就是自己的ThreadLocalMap。
(4)ThreadLocalMap的键值为ThreadLocal对象,而且可以有多个threadLocal变量,因此保存在map中。
以上就是java中关于threadLocal源码探究,相信大家已经能够理论threadLocal使用的原理。把threadLocal作为其他方法的使用基础,然后可以结合起来带来更多的使用。
课程教程:java threadLocal源码探究下一篇:没有了