线程池 与 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。。。
重要的事情说三遍。。。