threadlocal
Thread原理
https://blog.csdn.net/winwill2012/article/details/71625570
jdk1.3之前
threadlocal在堆中(全局变量),然后维护一个MAP,MAP中,key为线程ID,value为线程设定的值
jdk1.3之后到现在:
threadLocal还是在堆中,
线程的栈中,维护着一个threadLocals变量,这个变量是threadLocalMap类,这个MAP中,key为threadLocal的弱引用,值为线程设定值
1、为什么要改成这种线程维护MAP,而不是全局变量threadLocal来维护线程map?
以前是一个MAP,多个key,value
现在是多个MAP,一个key,value
以前是thread死了,一个key,value删除,多线程,会造成频繁的插入,删除操作
现在thread死了,MAP就会消失掉一个,
官方说法如下:
这样设计之后每个Map的Entry数量变小了:之前是Thread的数量,现在是ThreadLocal的数量,能提高性能,据说性能的提升不是一点两点(没有亲测)
当Thread销毁之后对应的ThreadLocalMap也就随之销毁了,能减少内存使用量。
、内存泄漏?
threadLocal如果没用被强引用了,或者说强引用的对象呗回收了,threadLocal会被回收,回收后,当前线程的threadLocalMap如果不手动释放该MAP,那么该MAP一直存在,threadLocalMap只要线程存在,就一直回收不了,出现内存泄漏。在Tomcat中,我们经常出现线程空闲不死,下次请求还会使用该线程的情况。所以request退出时,尽量remove
tips: threadLocalMap在调用set,get时也会有remove的功效,但我们不可能每次都会调用这两函数,
3、为什么用弱引用,如果改成强引用是否能避免内存泄漏
key 使用强引用:
threadLocalMap如果没用被回收,那么ThreadLocal也不会被回收,线程重复利用的时候,就麻烦了
引用的ThreadLocal的对象被回收了,但是ThreadLocalMap还持有ThreadLocal的强引用,如果没有手动删除,ThreadLocal不会被回收,导致Entry内存泄漏。
key 使用弱引用:
threadLocal被回收,threadLocal不被回收,内存泄漏
引用的ThreadLocal的对象被回收了,由于ThreadLocalMap持有ThreadLocal的弱引用,即使没有手动删除,ThreadLocal也会被回收。value在下一次ThreadLocalMap调用set,get,remove的时候会被清除。
文章最后发布于: 2018-09-23 11:08:08
相关阅读
ThreadLocal 最近在做Spark项目的时候,使用Scala语言,遇到了多线程的问题,想到之前理解的ThreadLocal的数据隔离的意义,在使用后,以为
摘要 ThreadLocal是Java中的一个类,在Java 1.2版本加入,它的作者是Josh Bloch和Doug Lea。这篇文章会详细深入的分析ThreadLocal(基