论坛首页 Java企业应用论坛

ThreadLocal与synchronized

浏览 107793 次
精华帖 (8) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-26  
呵呵,ThreadLocal那叫Thread specified,LZ估计只是想说明特定环境下特定问题解决方式的选择,没必要争论人家的文字怎么样吧,hoho,要不我写一篇?!(没空)
0 请登录后投票
   发表时间:2007-05-26  
fujohnwang 写道
呵呵,ThreadLocal那叫Thread specified,LZ估计只是想说明特定环境下特定问题解决方式的选择,没必要争论人家的文字怎么样吧,hoho,要不我写一篇?!(没空)


不是文字上的问题,是概念上的问题,楼主对ThreadLocal的理解是完全错误的,什么副本啊,正确得理解好多人都说了。
ThreadLocal不能解决多线程的共享资源访问问题,最好由楼主自己出来澄清一下,免得误导别人。
0 请登录后投票
   发表时间:2007-05-27  
klyuan 写道
magice 写道
那如果当前有2000个用户登陆,那么就会有2000个变量副本吧,如果不是存放什么大的对象到是没什么问题,要是存放大的对象,该怎么办呢?


一般情况下是不会存放大对象滴!


对ThreadLocal & Synchronized分析的很透彻,但一般的情况下大对象也是有的.至少我们那个很多都是大对象!个人觉得用多线程还是Synchronized的好,特别加上静态的对象锁就简单很多了!
0 请登录后投票
   发表时间:2007-05-28  
嗯 感觉是楼主那个count惹的祸 不过对ThreadLocal的理解更进一步了 谢谢
0 请登录后投票
   发表时间:2007-05-28  
ThreadLocal,线程变量而已,避免通过方法传递参数就是他的优点!

至于与synchronized的关系,方法中的参数有什么关系,ThreadLocal就有什么关系了。
0 请登录后投票
   发表时间:2007-05-29  
ThreadLocal本身的作用是保证任何一个线程都拥有属于自己的实例,而对于某一个线程内部而言则只拥有一个共享的实例。

ThreadLocal本身的设计目的并非用作控制并发访问与线程安全性,所以楼主的提法的确有待商榷;另外,楼主提供的例子不具太好的实际意义,不便于理解,其实一个很好的例子就是HibernateUtil类。对于ThreadLocal的使用,我觉得更具意义的在于“某一个线程内部而言则只拥有一个共享的实例”这一点,而非多线程并发控制。
0 请登录后投票
   发表时间:2007-05-29  
eway 写道
ThreadLocal本身的作用是保证任何一个线程都拥有属于自己的实例,...


这个正是楼主错误的观点,
如果一个类中定义了一个static的ThreadLocal,一个共享对象可以通过该ThreadLocal的set设置到多个线程的ThreadLocalMap中,但是这多个线程的ThreadLocalMap中存着的仅仅是该对象的引用,指向那个共享对象,而不是什么副本,通过ThreadLocal的get方法取到的是就是那个共享对象本身,共享访问安全问题还是要靠其他方法来解决。

ThreadLocalMap在每个线程中有一个,而不是存在于ThreadLocal中,ThreadLocal更多是作为一个工具类,里面只包含一个int threadLocalHashCode,而不包含其他任何数据,数据是放在每个线程的ThreadLocalMap中的,里面存放的是你要通过ThreadLocal进行set和get的对象(引用),threadLocalHashCode相当于这个Map的key。

如果一个类中定义了多个ThreadLocal,那么这些个ThreadLocal中的threadLocalHashCode值是不同的,也就是key不同,所以可以用来将不同的多个对象放到线程中。

考虑一个类的多线程环境,对于该类中的static的某个ThreadLocal对象,在多个线程中是同一个对象,同一个threadLocalHashCode值,也就是同一个key,但是不同的是每个线程中的ThreadLocalMap,每个线程都有自己的ThreadLocalMap,所以相同的key可以对应不同的对象。

说到底,ThreadLocal的作用就是将经常要用到的对象的引用放到属于线程自己的一个存储空间中,在该线程的执行过程中,可以通过类的静态的ThreadLocal来方便的获取到这个对象,而不用通过参数的形式传来传去。
0 请登录后投票
   发表时间:2007-05-30  
lujh99 写道
eway 写道
ThreadLocal本身的作用是保证任何一个线程都拥有属于自己的实例,...


这个正是楼主错误的观点,
如果一个类中定义了一个static的ThreadLocal,一个共享对象可以通过该ThreadLocal的set设置到多个线程的ThreadLocalMap中,但是这多个线程的ThreadLocalMap中存着的仅仅是该对象的引用,指向那个共享对象,而不是什么副本,通过ThreadLocal的get方法取到的是就是那个共享对象本身,共享访问安全问题还是要靠其他方法来解决。
[/b]

不知道你说的共享对象是指什么,如果是线程之间的共享对象,那么其引用根本没有必要放在线程中,需要同步,而如果是线程本身在多个方法栈之间共享的对象,需要放到线程中(这种情况下确实保证了任何一个线程都拥有属于自己的实例),但根本没有什么共享访问的安全问题。所以你说的这种情况根本不存在
0 请登录后投票
   发表时间:2007-05-30  
这种情况确实没有必要存在,但是如果非要制造出这种情况也是可能的。

比如Spring应用中的service类是单例的,action类是多例的,service被注入到action中。如果service类中有一个成员对象A(纯粹举例子,实际不会这么用),action类中有个static的ThreadLocal。
那么有多个request的话就有多个线程在运行,在线程中可以将对象A通过ThreadLocal的set方法放到线程中,通过ThreadLocal的get方法取出来,难道你说放到多个线程中的对象A不是同一个对象吗?取出来的不是同一个对象吗?实际放进去的就是一个引用而已。怎么能说“保证了任何一个线程都拥有属于自己的实例”呢?

以上例子仅仅为了说法这个说法是不对的,实际不会这样使用。跟action类是不是多例也没有太大关系。

另:小伙怎么跑到上海去了
0 请登录后投票
   发表时间:2007-05-30  
知道ls举这个例子的意思,
但是违反了Serivce类是immutable的原则。不太好。
0 请登录后投票
论坛首页 Java企业应用版

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