必威体育Betway必威体育官网
当前位置:首页 > IT技术

ThreadLocal

时间:2019-11-08 05:15:44来源:IT技术作者:seo实验室小编阅读:54次「手机版」
 

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的原理与使用

ThreadLocal 最近在做Spark项目的时候,使用Scala语言,遇到了多线程的问题,想到之前理解的ThreadLocal的数据隔离的意义,在使用后,以为

我和Java ThreadLocal的故事

摘要 ThreadLocal是Java中的一个类,在Java 1.2版本加入,它的作者是Josh Bloch和Doug Lea。这篇文章会详细深入的分析ThreadLocal(基

分享到:

栏目导航

推荐阅读

热门阅读