论坛首页 Java企业应用论坛

学习Spring必学的Java基础知识(6)----ThreadLocal

浏览 72606 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-06-19  
一群知识分子,顶,我是新成员,请多多指教!
0 请登录后投票
   发表时间:2012-06-20  
应该只适用多线程访问共享变量的场景,对多线程修改共享变量必须要采用同步吧?如果支持写操作,请问每个线程中的变量副本何时同步过去,到底按照哪个线程的为准?
0 请登录后投票
   发表时间:2012-06-20  
superysy 写道
stamen 写道
superysy 写道
那这么说spring采用了ThreadLocal,就不需要把bean设为prototype了??


Spring中的Bean很少需要设置为prototype的,至少我本人就没有碰到过这种情况。
但是不能说所有的Bean都不需要设置为prototype,还是要看具体的情况,所以理解原理才是更重要的。

我看项目中的action都设为prototype,理由是action是有状态的,一个action的话有可能会出现多线程并发访问action的问题,但这个问题ThreadLocal不是解决了么? 还有,DAO和Service层不也是有状态的么?


碰巧我也有楼上兄弟类似的问题,请教一下楼主哈~ 将action搞为prototype之后,Dao和Service还是单例的嘛。多线程访问时,不同的action还是可能会同时调用Service和Dao,那么Service和Dao还是存在并发问题撒,只是出现的几率相当小而已,因为在它们的入口(action)控制了一下,我是这样理解的。希望楼主纠正一下~
0 请登录后投票
   发表时间:2012-06-20  
niuzai 写道
superysy 写道
stamen 写道
superysy 写道
那这么说spring采用了ThreadLocal,就不需要把bean设为prototype了??


Spring中的Bean很少需要设置为prototype的,至少我本人就没有碰到过这种情况。
但是不能说所有的Bean都不需要设置为prototype,还是要看具体的情况,所以理解原理才是更重要的。

我看项目中的action都设为prototype,理由是action是有状态的,一个action的话有可能会出现多线程并发访问action的问题,但这个问题ThreadLocal不是解决了么? 还有,DAO和Service层不也是有状态的么?


碰巧我也有楼上兄弟类似的问题,请教一下楼主哈~ 将action搞为prototype之后,Dao和Service还是单例的嘛。多线程访问时,不同的action还是可能会同时调用Service和Dao,那么Service和Dao还是存在并发问题撒,只是出现的几率相当小而已,因为在它们的入口(action)控制了一下,我是这样理解的。希望楼主纠正一下~


回楼上:你理解有误;
struts2的action集成了MVC中的M(model)和C(control)两层,它的变量可以直接从页面获得数据,但这些变量都不是线程安全的变量 。会在下一次使用时会把值带过去。也就是说,bean是有状态的。在web状态下,请求是多线程的,全局变量可能会被不同的线程修改,尤其在并发时会带来意想不到的bug。

而service和dao层则基本没有数据变量,只是一直维护着一个连接,这就是spring中采用ThreadLocal的原因,既单实例,却又能在每一个用户不断的页面请求中维持同一个Connection。
没用过spring,只是看过一些代码,有错误理解,请指出,别误人子弟~
0 请登录后投票
   发表时间:2012-06-20  
niuzai 写道
应该只适用多线程访问共享变量的场景,对多线程修改共享变量必须要采用同步吧?如果支持写操作,请问每个线程中的变量副本何时同步过去,到底按照哪个线程的为准?


你理解错了,这些线程的变量是本地化的,不是全局的,每个线程都有自己独立的变量,不存在这个线程改后,要同步给其它线程看的问题。

就如Connection,A线程用一个Connection,B线程也用一个Connection(从线程池中取回),这两个Connection是独立的,并不是同一个Connection,所以称其为ThreadLocal。

如果是共用的变量,那么只能使用同步的方式进行访问了。

所以ThreadLocal并不能完全取代synchronized,只得取代那些变量可“本地化”的并发访问变量,化单变更并发访问的问题为每个线程各拥有一个独立的变量的无线程并发的问题。
0 请登录后投票
   发表时间:2012-06-20  
多谢LZ,我的意思就是指多个线程共用一个变量的场景。
0 请登录后投票
   发表时间:2012-06-20  
支持原创,分享知识,帮助他人,提升自己,楼主加油。
0 请登录后投票
   发表时间:2012-06-20  
感觉对ThreadLocal的理解不是很正确,感觉坛子里的这位兄弟说的比较正确一点。

http://www.iteye.com/topic/103804
0 请登录后投票
   发表时间:2012-06-24  
threadlocal为每个线程复制一个变量副本,如果每个线程都对该变量副本进行了修改操作,那么同步该变量的时候是以什么机制操作的.
0 请登录后投票
   发表时间:2012-06-25  
feiyu86 写道
感觉对ThreadLocal的理解不是很正确,感觉坛子里的这位兄弟说的比较正确一点。

http://www.iteye.com/topic/103804

确实。这个看源码分析的。
0 请登录后投票
论坛首页 Java企业应用版

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