线程池 与 ThreadLocal

今天在hhoj中改了一点代码。

之前应用中用ThreadLocal来保存该线程对应的用户UserinfoModel。在线程激活时从Usersession中获取然后放进ThreadLocal中。

今天想改成只在Session中保存用户名。线程激活时根据从数据库中获取最新的UserinfoModel。

于是问题就来了。

首先是,如果用户名为空,没有清空ThreadLocal。

导致的问题是,在未登录状态下,如果反复刷新,从线程池中复用了之前的线程,

那么之前的ThreadLocal中的UserinfoModel会被串到这个会话中,然后保存下来。

造成未登录状态下的用户刷新几次页面就变成登录状态了。。。

(╯°□°)╯︵ ┻━┻。。而第一个登录的往往都是管理员(也就是我)。。

而这个串线是会传染的。一个会话本次意外获得了一个Model会被写入其Session保存下来,

下一次遇到一个新的线程,又传染给下一个线程。

于是很快所有的线程里都有一个管理员的UserinfoModel。。。T.T....

 

在线程池有关的操作中,如果使用了ThreadLocal,或者其他以线程为key的结构,每次激活新线程,必须清空所有的ThreadLocal。。。

在线程池有关的操作中,如果使用了ThreadLocal,或者其他以线程为key的结构,每次激活新线程,必须清空所有的ThreadLocal。。。

在线程池有关的操作中,如果使用了ThreadLocal,或者其他以线程为key的结构,每次激活新线程,必须清空所有的ThreadLocal。。。

重要的事情说三遍。。。

 

posted @ 2015-06-14 22:34  qinhang3  阅读(467)  评论(0编辑  收藏  举报