ThreadLocal心得


一个http请求到tomcat,tomcat会从线程池里取出一个线程分配给此请求。

请求到webservice(即线程到webservice),从当前线程里取出ThreadLocalMap<ThreadLocal,value>集合(每个线程都拥有一个属于自己的ThreadLocalMap),以ThreadLocal为key可以get和set值(value)

线程结束时,正常情况会清除当前线程里的ThreadLocalMap,但因种种原因可能扩大了ThreadLocal对象的生命周期,线程结束前不一定会清除掉当前线程的ThreadLocalMap。

tomcat线程池里线程数量不是无限的,所以会出现线程复用。当一个新请求来了,复用了上面的线程,因上面请求的ThreadLocalMap还在,遗留下来了里面的ThreadLocal,所以现在的请求一开始就有一个旧的ThreadLocalMap,这个ThreadLocalMap里存留下旧的ThreadLocal。

处理方式:在每一次请求结束时,主动从ThreadLocalMap里remove()掉ThreadLocal,让以后复用线程的请求在一开始自己去新增属于自己的ThreadLocal到ThreadLocalMap里,避免数据混淆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值