精华帖 (8) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-23
klyuan 写道 magice 写道 那如果当前有2000个用户登陆,那么就会有2000个变量副本吧,如果不是存放什么大的对象到是没什么问题,要是存放大的对象,该怎么办呢?
一般情况下是不会存放大对象滴! 并发大的话: ThreadLocal(request) + NIO(connection) 存放大的对象这种需求一般不存在或可用其它方案代替. |
|
返回顶楼 | |
发表时间:2007-05-23
精华帖 (7) :: 良好帖 (12) :: 新手帖 (26) :: 隐藏帖 (0)
为什么26票就变成入门讨论了? |
|
返回顶楼 | |
发表时间:2007-05-23
klyuan 写道 竟然被评了19个新手贴!!!没天理啊
可以申诉一下,这个帖子好像不应该被投新手。 |
|
返回顶楼 | |
发表时间:2007-05-23
shaucle 写道 ThreadLocal是同线程的单例
TransactionSynchronizationManager(ThreadLocal)和java线程中的synchronized是两码事. 文章好长... 呵呵 楼主说的是多线程中解决 资源共享的问题 sync 和 threadlocal 是两种思路 一个是把单一资源加锁 一种是把资源做成副本。 |
|
返回顶楼 | |
发表时间:2007-05-23
感觉楼主有误导之嫌。虽然写的字很多,但是评19个新手贴也不算冤枉。
|
|
返回顶楼 | |
发表时间:2007-05-24
magice 写道 那如果当前有2000个用户登陆,那么就会有2000个变量副本吧,如果不是存放什么大的对象到是没什么问题,要是存放大的对象,该怎么办呢?
服务器一般都有线程池,线程资源可以重复利用的,你2000个用户在线,不见得能又200个用户同时访问,再说,只要对象不是太大,我宁愿用200个拷贝,也不想让用户在这个200个任务的队列里等待。 ThreadLocal在线程内共享资源,是个不错的方法。ww就是用这个存储请求信息,一下子就明朗多了,不像struts1那样参数一堆一堆的。 投了个良好,平衡一下:) |
|
返回顶楼 | |
发表时间: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也用不上。这两个并不是互相替代的关系。 |
|
返回顶楼 | |
发表时间:2007-05-24
其实两个本来就没有关系,我想楼主只是想说如何在多线程中活用ThreadLocal。
ThreadLocal的实现本来就比较简单,只是用线程来作为key来寻找本线程中所使用的一个实例,它解决的最主要的问题应该就是减少参数的传递。 |
|
返回顶楼 | |
发表时间:2007-05-24
发现这个贴被评为良好了。这文章中有不少不说错误,至少也是含糊不清的说法,
比如: 引用 synchronized和ThreadLocal都是用来解决多线程并发访问的问题。 变量的副本 ThreadLocal和Synchonized都用于解决多线程并发访问。 可见,使用ThreadLocal后,我们不需要任何同步代码,却能够保证我们线程间数据的安全。 使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。 总之,作者一再说”ThreadLocal......用于解决多线程并发访问“。但是如果程序确实需要多线程并发访问,则不能使用ThreadLocal,而如果不需要多线程并发访问,那么ThreadLocal就是解决了一个并不存在的问题。 另外,作者说: 引用 我们把第一个例子用ThreadLocal来实现,但是我们需要些许改变。 但是前后两个程序所实现的功能是完全不一样的。 这样的帖子就算不隐藏,也绝不应该评为良好,否则误导多多。 |
|
返回顶楼 | |
发表时间: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本身。 |
|
返回顶楼 | |