论坛首页 Java企业应用论坛

ThreadLocal与synchronized

浏览 107338 次
精华帖 (8) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-23  
klyuan 写道
magice 写道
那如果当前有2000个用户登陆,那么就会有2000个变量副本吧,如果不是存放什么大的对象到是没什么问题,要是存放大的对象,该怎么办呢?


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



并发大的话: ThreadLocal(request) + NIO(connection)

存放大的对象这种需求一般不存在或可用其它方案代替.
0 请登录后投票
   发表时间:2007-05-23  
精华帖 (7) :: 良好帖 (12) :: 新手帖 (26) :: 隐藏帖 (0)
为什么26票就变成入门讨论了?
0 请登录后投票
   发表时间:2007-05-23  
klyuan 写道
竟然被评了19个新手贴!!!没天理啊

可以申诉一下,这个帖子好像不应该被投新手。
0 请登录后投票
   发表时间:2007-05-23  
shaucle 写道
ThreadLocal是同线程的单例

TransactionSynchronizationManager(ThreadLocal)和java线程中的synchronized是两码事.

文章好长...


呵呵 楼主说的是多线程中解决 资源共享的问题 sync 和 threadlocal 是两种思路 一个是把单一资源加锁 一种是把资源做成副本。
0 请登录后投票
   发表时间:2007-05-23  
感觉楼主有误导之嫌。虽然写的字很多,但是评19个新手贴也不算冤枉。
0 请登录后投票
   发表时间:2007-05-24  
magice 写道
那如果当前有2000个用户登陆,那么就会有2000个变量副本吧,如果不是存放什么大的对象到是没什么问题,要是存放大的对象,该怎么办呢?


服务器一般都有线程池,线程资源可以重复利用的,你2000个用户在线,不见得能又200个用户同时访问,再说,只要对象不是太大,我宁愿用200个拷贝,也不想让用户在这个200个任务的队列里等待。
ThreadLocal在线程内共享资源,是个不错的方法。ww就是用这个存储请求信息,一下子就明朗多了,不像struts1那样参数一堆一堆的。

投了个良好,平衡一下:)
0 请登录后投票
   发表时间:2007-05-24  
首先请楼主明确,你想说的是java.lang.ThreadLocal的实现和使用,还是你自己写了一个ThreadLocal类?

如果是说java.lang.ThreadLocal,那么比如我们使用java.lang.ThreadLocal保存数据库连接java.sql.Connection对象,以使每个线程对数据库的访问不会混杂。此时每个线程中的Connection对象又是什么变量的副本呢?

在Java语言中”变量的副本“这个概念本身就有点含义不清。Java中所有的变量都是对对象的引用,那么”变量的副本“到底是指”被引用的对象的副本“还是”引用本身的副本“呢?

例子程序中,每个线程拿到的都是不同的Student对象,此时根本不存在并发访问的问题。就算不是用new Student,而是用Student.clone,拿到同一个对象的拷贝,这样某个线程对这个拷贝的修改别的线程是看不到的。ThreadLocal可以使多个线程读取同一个对象(或拷贝),但不能使多个线程修改同一个对象。而如果多个线程只是同时读一个对象的情况,本来就不需要用synchronized。

所以,能够用ThreadLocal的情况,不需要synchronized。需要用synchronized, ThreadLocal也用不上。这两个并不是互相替代的关系。
0 请登录后投票
   发表时间:2007-05-24  
其实两个本来就没有关系,我想楼主只是想说如何在多线程中活用ThreadLocal。

ThreadLocal的实现本来就比较简单,只是用线程来作为key来寻找本线程中所使用的一个实例,它解决的最主要的问题应该就是减少参数的传递。
0 请登录后投票
   发表时间:2007-05-24  
发现这个贴被评为良好了。这文章中有不少不说错误,至少也是含糊不清的说法,
比如:

引用

synchronized和ThreadLocal都是用来解决多线程并发访问的问题。

变量的副本

ThreadLocal和Synchonized都用于解决多线程并发访问。

可见,使用ThreadLocal后,我们不需要任何同步代码,却能够保证我们线程间数据的安全。

使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。


总之,作者一再说”ThreadLocal......用于解决多线程并发访问“。但是如果程序确实需要多线程并发访问,则不能使用ThreadLocal,而如果不需要多线程并发访问,那么ThreadLocal就是解决了一个并不存在的问题。

另外,作者说:
引用
我们把第一个例子用ThreadLocal来实现,但是我们需要些许改变。

但是前后两个程序所实现的功能是完全不一样的。

这样的帖子就算不隐藏,也绝不应该评为良好,否则误导多多。
0 请登录后投票
   发表时间:2007-05-24  
BirdGu 写道
首先请楼主明确,你想说的是java.lang.ThreadLocal的实现和使用,还是你自己写了一个ThreadLocal类?

如果是说java.lang.ThreadLocal,那么比如我们使用java.lang.ThreadLocal保存数据库连接java.sql.Connection对象,以使每个线程对数据库的访问不会混杂。此时每个线程中的Connection对象又是什么变量的副本呢?

在Java语言中”变量的副本“这个概念本身就有点含义不清。Java中所有的变量都是对对象的引用,那么”变量的副本“到底是指”被引用的对象的副本“还是”引用本身的副本“呢?

例子程序中,每个线程拿到的都是不同的Student对象,此时根本不存在并发访问的问题。就算不是用new Student,而是用Student.clone,拿到同一个对象的拷贝,这样某个线程对这个拷贝的修改别的线程是看不到的。ThreadLocal可以使多个线程读取同一个对象(或拷贝),但不能使多个线程修改同一个对象。而如果多个线程只是同时读一个对象的情况,本来就不需要用synchronized。

所以,能够用ThreadLocal的情况,不需要synchronized。需要用synchronized, ThreadLocal也用不上。这两个并不是互相替代的关系。


我想就没必要咬文嚼字了。相信你说的这些概念大家都明白。
或许楼主用词不准确,但是相信大家还是能够分辨。例子可能也不是很好,这里主要是为了展示一个现象。
synchronized, ThreadLocal是可以用来解决某些类似问题的。关键在于如何设计。当能也不是完全可替换的方案。还在于程序员自己去取舍。


weiqingfei 写道
其实两个本来就没有关系,我想楼主只是想说如何在多线程中活用ThreadLocal。

ThreadLocal的实现本来就比较简单,只是用线程来作为key来寻找本线程中所使用的一个实例,它解决的最主要的问题应该就是减少参数的传递。


说句没有意义的话,事实上。ThreadLocal实现中,作为key的不是线程,而是ThreadLocal本身。
0 请登录后投票
论坛首页 Java企业应用版

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