论坛首页 Java企业应用论坛

深入浅出ThreadLocal

浏览 38360 次
该帖已经被评为良好帖
作者 正文
   发表时间: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
ThreadLocal对象本身存放在线程栈上,他用来存储线程的变量, 可自身也是线程的一个变量?

上一层的大MAP存在堆上?

0 请登录后投票
   发表时间:2010-09-14  
ThreadLocal 使用时确实要注意回收。否则可能会导致一些对象无法GC。

ThreadLocal最好不要做成static的

0 请登录后投票
   发表时间:2010-09-15  
srdrm 写道
ThreadLocal 使用时确实要注意回收。否则可能会导致一些对象无法GC。

ThreadLocal最好不要做成static的




ThreadLocal最好不要做成static的 :  你。。。说反了吧
0 请登录后投票
   发表时间: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,弱引用的对象是什么时候被回收的?是线程结束时?还是?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics