threadLocal 和 线程池 问题记录
问题
在web应用中,获取用户的身份后,使用filter将身份信息采用putIfAbsent的形式放在了 threadLocal 中。循环请求servlet,发现用户身份没有变化。
解析
- 只有当ThreadLocal的生命周期受限于Task的生命周期时,在Thread Pool的Thread里使用ThreadLocal才有意义。
- 在线程池的线程中不应该使用ThreadLocal在任务之间传递值。
ThreadLocal的生命周期不等于一次request请求的生命周期,每个request请求的响应是tomcat从线程池中分配的线程,线程会被下个请求复用。所以请求结束后必须删除线程本地变量。
在使用ThreadLocal的时候管理它的创建、销毁,那么就可以用。