论坛首页 Java企业应用论坛

正确理解ThreadLocal

浏览 368485 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-05-26  
受教了,只是用过,没有分析这么透彻。
0 请登录后投票
   发表时间:2008-06-05  
jieyuan_cg 写道
LZ的这篇对ThreadLocal的解释真到位。。。多谢!
坛子里面有几篇对ThreadLocal的解释好像都有些误解。。。看得晕晕乎乎。

0 请登录后投票
   发表时间:2008-06-05  
总结的不错。可以把各种框架和容器对ThreadLocal的应用拿来一起分析一下,看看究竟有什么神奇的地方。
0 请登录后投票
   发表时间:2008-06-05  
那你就看看spring事务管理是如果实现的好了
0 请登录后投票
   发表时间:2008-06-06  
lz的这句话不对:
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。

其他线程能否访问,还要看你的get和set怎么写了, 如果两个线程都存入同一个对象引用,那就会有线程共享问题。

0 请登录后投票
   发表时间:2008-06-06  
青蛙支持下你! 呵呵!
个人理解: 这个 静态变量 ThreadLocal.ThreadLocalMap threadLocals 从实现上放在哪里都一样可以,只是规范和语义上来说放在Thread 里面更合理,
Thread t = Thread.currentThread(); 用来获得存放map的对象也更快捷(nitive方法麻)

既然threadLocal 是key  那么不同线程使用同一个threadLocal对象 ,那么他们存什么进去肯定都会覆盖原来的其他线程存进去

如果不同线程 使用不同的 threadLocal对象 存的value 是同一个对象 ,那么他们就在共享一个value ,这个时候 value  就是一个多线程的 resource  这个时候就是要考虑下并发安全了  :)
不过好像把resource作为共享数据buffer来操作不大合理,一般这样的buffer都是拥有自己的业务需求了,不够common,应该自己另外定义一个共享数据源给多个线程作为私有数据或是(共享数据源是静态的可供线程访问), 而不是通过local放到map里去  

一般看到的使用local的用法,都是存放一些数据库资源信息或是session(信息量少)


to :  csrcom    有点不明白为什么要这么做,set的value 是obejct ,自己定义的类 和jdk 的集合类  不都是object的麻 ,只是进去出来转一下就好


现在我有个新问题: 希望有人解答

我看到在ThreadLocal类实现中 只看到remove()方法,那么我是否可以这么理解?在拥有 ThreadLocal对象(有可能是静态对象,也可能不是静态对象) 的线程结束时一定的记得判断 从local 塞进去的value 是否还需要,如果不需要了,然而没有调用remove()方法,多出现几次 Thread 中静态的 localMap 会只进不出越来越大,也就是无意思的内存未回收  
这样的情况是否都必须自己来做 remove() 回收, 还是有其他的机制已经做了这件事?


希望大家别吝啬手上的石头,砸到我醒为止! :)  

0 请登录后投票
论坛首页 Java企业应用版

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