ThreadLocal

Thread原理

https://blog.youkuaiyun.com/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的时候会被清除。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值