论坛首页 Java企业应用论坛

深入浅出ThreadLocal

浏览 38361 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-09-08  
楼主说到了用空间来换取时间   对这个观点  本人还是非常同意的

在信息化时代  对于网页开发 我们平常所说的性能  不就是指的时间吗?

不禁让我想到索引  索引就是用空间换时间的典型应用  如果大家熟悉lucence的话 大家

应该都深有同感
0 请登录后投票
   发表时间:2010-09-08  
ThreadLocal适用于资源共享 ??
robbin曾说过
robbin 写道
ThreadLocal和多线程并发没有什么关系。ThreadLocal模式是为了解决单线程内的跨类跨方法调用的,有点AOP的味道。前面已经讲了很多了,还是搜索一下吧。

0 请登录后投票
   发表时间:2010-09-08  
pouyang 写道
ThreadLocal适用于资源共享 ??
robbin曾说过
robbin 写道
ThreadLocal和多线程并发没有什么关系。ThreadLocal模式是为了解决单线程内的跨类跨方法调用的,有点AOP的味道。前面已经讲了很多了,还是搜索一下吧。


robbin是谁??
0 请登录后投票
   发表时间:2010-09-08  
这个有什么好深入浅出的,看看API不就全明白了,最初我想走捷径google没找到能说清楚的,
自己看看API反而是最好的捷径
0 请登录后投票
   发表时间:2010-09-09  
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方法你就明白了!

 

 

0 请登录后投票
   发表时间:2010-09-09  
每个线程Thread有一个ThreadLocalMap变量threadLocals,类似一个map,
Thread t = Thread.currentThread();
ThreadLocalMap map = t.threadLocals;

这个map的Key为ThreadLocal对象,Value为当前设置的值

设置值:
map.set(ThreadLocal对象, Value);

取值:
map.get(ThreadLocal对象)
0 请登录后投票
   发表时间:2010-09-09  
 static class ThreadLocalMap {

        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }


请看以上的源代码,在ThreadLocalMap 内部的Entry 是WeakReference。  请问这个entry定义为弱类型,不是会很快随机的被GC回收吗?  不过通常一个 Thread的生存时间可能更小,所以应该没有问题,是吧?请GS解答一下
0 请登录后投票
   发表时间:2010-09-09  
holly2k 写道
pouyang 写道
ThreadLocal适用于资源共享 ??
robbin曾说过
robbin 写道
ThreadLocal和多线程并发没有什么关系。ThreadLocal模式是为了解决单线程内的跨类跨方法调用的,有点AOP的味道。前面已经讲了很多了,还是搜索一下吧。


robbin是谁??


robbin 你都不知道,你就不算来过javaeye
0 请登录后投票
   发表时间:2010-09-10  
推荐一篇老帖,分析的非常透彻:
ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。
http://www.iteye.com/topic/617368
0 请登录后投票
   发表时间:2010-09-10  
看robbin的 http://robbin.iteye.com/blog/602354 就知道robbin是谁了
0 请登录后投票
论坛首页 Java企业应用版

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