线程复用时Threadlocal的坑

Threadlocal为每一个使用该变量的线程提供独立的变量副本。tomcat

使用的状况:对每个线程都必须持有一个类的实例,并且这个类是可变的(不可变的就是线程安全的,所有线程使用一个就能够了),例如hibernate对session的处理。安全

 

问题场景:用户登陆时,token保存在ThreadLocal里,可是常常偶现 token失效(在tonken在有效时间里)session

产生缘由:使用线程池或有复用线程时,复用同一个线程时,每次请求结束后ThreadLoca的值l没有清空,致使第二次使用时ThreadLocal的token仍是上次遗留一下的token,以至tonken失效。hibernate

 

tomcat默认使用线程池,因此一个线程的生命周期不能对等于一个请求的生命周期,线程池中的线程是能够被复用的。线程

解决方案:token

一、保证每次都用新的值覆盖线程变量;生命周期

二、保证在每一个请求结束后清空线程变量。io

相关文章
相关标签/搜索