zoukankan      html  css  js  c++  java
  • 线程复用时Threadlocal的坑

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

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

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

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

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

    解决方案:

    1、保证每次都用新的值覆盖线程变量;

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

  • 相关阅读:
    GDB的Breakpoint, Watchpoint和Catchpoint
    sed初学
    比较两个文本不同的行/比较两个文本相同的行
    sprintf()函数基本用法
    vim不用鼠标复制粘贴
    SQL基础-语法
    SQL基础-简介
    XPath学习笔记
    jQuery选择器
    Ubuntu常用命令
  • 原文地址:https://www.cnblogs.com/qingchun-com/p/8367557.html
Copyright © 2011-2022 走看看