锁定老帖子 主题:深入浅出ThreadLocal
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-13
pxlfxl2 写道
snake1987 写道
其实哪有这么复杂,就一个2层的map
第一层是Thread.currentThreand()为key,存的map 第二层是ThreadLocal.this为key,存的值,不就取出来了 这样说也不对,你所说的第一层map是不存在的,你所说的第二层Map实际上是Thread的一个属性,仔细读读niumd的这个这个帖子你就明白了。看看Thread中的一小段代码:
/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null; 上面的代码来自JDK源码,给Thread定义了一个ThreadLocal.ThreadLocalMap类型的属性,用于存线程变量。你再看看ThreadLocal中的get和set方法你就明白了!
上一层的大MAP存在堆上? |
|
返回顶楼 | |
发表时间:2010-09-14
ThreadLocal 使用时确实要注意回收。否则可能会导致一些对象无法GC。
ThreadLocal最好不要做成static的 |
|
返回顶楼 | |
发表时间:2010-09-15
srdrm 写道 ThreadLocal 使用时确实要注意回收。否则可能会导致一些对象无法GC。
ThreadLocal最好不要做成static的 ThreadLocal最好不要做成static的 : 你。。。说反了吧 |
|
返回顶楼 | |
发表时间:2011-07-11
sdh5724 写道 srdrm 写道 ThreadLocal 使用时确实要注意回收。否则可能会导致一些对象无法GC。
ThreadLocal最好不要做成static的 ThreadLocal最好不要做成static的 : 你。。。说反了吧 如果做成static的话,很显然所有实例共享一个变量,占用空间变小。但是如果线程对象增多(动态创建),里面保存的值就变多,对象占用空间变大,static这时还有优势吗? 我注意到ThreadLocalMap中有这样一段注释“ However, since reference queues are not used, stale entries are guaranteed to be removed only when the table starts running out of space”,只要当超出空间限制的时候才被remove掉,如果很频繁的使用的话是不是很容易就溢出了? 我有几点不明白,如果做成static不主动remove,弱引用的对象是什么时候被回收的?是线程结束时?还是? |
|
返回顶楼 | |