ThreadLocal的目的:为当前线程绑定一个值,解决线程安全问题。
ThreadLocal的实现方式(线程与值的绑定):
下面是ThreadLocal的set方法:
根据当前线程获取其 ThreadLocalMap对象,来执行绑定操作。
下面是 ThreadLocal的get方法
是根据当前ThreadLocal对象来获取 entry的值, 拿threadLocalHashCode与长度减一相与,求出哈希表的位置。
3.Threadlocal的生命周期
每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱引用指向threadlocal. 像上面code中的例子,当把threadlocal实例tl置为null以后,没有任何强引用指向threadlocal实例,所以 threadlocal将会被gc回收. 但是,我们的value却不能回收,因为存在一条从current thread连接过来的强引用. 只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.
从中可以看出,弱引用只存在于key上,所以key会被回收. 而value还存在着强引用.只有thead退出以后,value的强引用链条才会断掉
需要注意的问题
1)ThreadLocal需要注意的问题,每次执行完毕后,要使用remove()方法来清空对象,否则 ThreadLocal 存放大对象后,会出现OMM。
2) ThreadLocal要使用static的 ,在其他地方可以直接用get 和 set方法。
相关推荐
NULL 博文链接:https://gerrard-ok.iteye.com/blog/1851903
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。
ThreadLocal源码分析和使用
ThreadLocal_ThreadLocal源码分析_源码.zip
问题背景在 Tomcat 中,下面的代码都在 webapp 内,会导致 WebappClassLoaderWebappClassLoader 泄漏,无法被回收。
主要介绍ThreadLocal的原理,实例分析以及注意事项
java并发包源码分析(3)ThreadLocal 详细配图讲解 java并发包源码分析(3)ThreadLocal 详细配图讲解
ThreadLocal的原理,源码深度分析及使用.docx,这是一份ThreadLocal的技术文档
主要介绍了java 中ThreadLocal实例分析的相关资料,需要的朋友可以参考下
NULL 博文链接:https://liuinsect.iteye.com/blog/1827012
简单分析Java线程编程中ThreadLocal类的使用共4页.pdf.zip
ThreadLocal 线程微本地变量 及 源码分析
导致JVM内存泄露的ThreadLocal详解 为什么要有ThreadLocal ThreadLocal的使用 实现解析 引发的内存泄漏分析 错误使用ThreadLocal导致 线程不安全分析
主要介绍了从面试中的问题分析ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
分析都是基于android sdk 23 源码进行的,ThreadLocal在android和jdk中的实现可能并不一致。 在最初使用Threadlocal的时候,很容易会产生的误解就是threadlocal就是一个线程。 首先来看下Threadlocal的简单...
主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下
主要介绍了ThreadLocal使用案例分析,需要的朋友可以参考下
一篇文章我们来分析一个Java中ThreadLocal内存泄露的案例。分析问题的过程比结果更重要,理论结合实际才能彻底分析出内存泄漏的原因。