tomcat 是一个请求产生一个线程吗?如果不是那ThreadLocal不是有问题

我研究了半天也没有解决,请问一个请求时会产生一个线程吗?(我之前一直这么以为的)...但我去获取线程id或name时候发现不是的。然后网上也有些人说不是的,因为有线程池,他在服务器启动的时候就会先创建几个线程。那我就是有迷茫了,那我们之前用的ThreadLocal,如果不是每次请求都会产生一个线程,有些可能不同的请求用的是同一个线程,那ThreadLocal不是失去它的意义了????求解

必须在请求结束前remove()掉,否则对于上一个请求处理的数据,一旦在线程结束前因某些原因没有销毁掉Threadlocal,新请求复用此线程时,会直接取到之前Threadlocal里的值。

一个请求过来,如果线程池里面有空闲的线程,那么会在线程池里面取一个线程来处理该请求,一旦该线程当前在处理请求,其他请求就不会被分配到该线程上,直到该请求处理完成。请求处理完成后,会将该线程重新加入线程池。

如之前回答所说,ThreadLocal是与线程对象绑定的,经过测试可以看出来确实存在楼主说的情况,出现ThreadLocal被复用的情况,因此对于请求情况下ThreadLocal的使用要谨慎,如果用于暂存数据一定要记得移除,当然这只能证明楼主的顾虑确实存在,不能否定ThreadLocal的其他作用
测试代码

    private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 10;//每个线程中局部变量的初始值为10
        }
    };

    @ApiOperation(value = "登陆之后返回token")
    @GetMapping("/thread/test")
    public void testThread(){

        threadLocal.set(threadLocal.get()+10);
        System.out.println(threadLocal.get());

    }

测试结果

img

img

我不是很明白楼主的意思,我的理解是tomcat在用户每次请求一个web资源的时候,servlet或者是jsp页面,tomcat都会创建一个新的线程或者使用线程池中已有空闲的线程,在该线程中调用service方法或者doGet,doPost方法,如果在一个servlet中声明了一个成员变量。而且多个线程对其操作,ThreadLocal就有必要了。

我曾经研究过tomcate的源码,它的确是维护了一个线程池来处理客户端的请求的,但是这跟ThreadLocal有什么关系呢?
ThreadLocal是以线程对象为key来维护对象的,每个线程都保留了一份自己的数据的。哪个线程设置的threadLocal成员变量的值,取得就是设置时的值,这样可以保证自己用自己的,所以Threadlocal修饰的变量是线程安全的。
可以参考;http://blog.csdn.net/wojiushiwo945you/article/details/44979285

使用threadlocal.set存放数据,就算两次使用同一个线程,set进去的数据应该是不一样的。举个例子,threadlocal存放用户数据,一个线程两次放进去的用户数据应该是不一样的……我是这样理解的,不知道可对……

多个线程访问同一个变量的情况还是存在的,所以ThreadLocal肯定有它存在的意义