博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadLocal使用出现的问题
阅读量:6540 次
发布时间:2019-06-24

本文共 954 字,大约阅读时间需要 3 分钟。

hot3.png

有三个系统A,B,C;A,B需要通过调用C的接口c1,C在接口中针对A,B传给接口的companyCode会拿到公司companyId放入到ThreadLocal,companyId作为mybatis拦截器中参数会在所有的sql操作的where条件中加上,假如C有个c2接口也会使用ThreadLocal变量,这是应该获取不到这个变量,但实际下来c2接口也会拿到值,这是为什么?

通知一个请求会是一个线程,也就说A,B调用c1会各自线程处理,c2被调用也会有自己的线程处理,ThreadLocal按理说应该取不到,因为ThreadLocal以当前线程做为Map key来存储和使用对象的,源码实现如下

public void set(T value) {    Thread t = Thread.currentThread();    ThreadLocalMap map = getMap(t);    if (map != null)        map.set(this, value);    else        createMap(t, value);}

 

public T get() {    Thread t = Thread.currentThread();    ThreadLocalMap map = getMap(t);    if (map != null) {        ThreadLocalMap.Entry e = map.getEntry(this);        if (e != null) {            @SuppressWarnings("unchecked")            T result = (T)e.value;            return result;        }    }    return setInitialValue();}

取到了说明c2和c1接口共用了一个线程,这与一个请求生成一个线程相悖,后来查可能与tomcat线程池有关系,也就是c2与c1使用了tomcat线程池的同一个线程。

转载于:https://my.oschina.net/tomzhao2014/blog/1554209

你可能感兴趣的文章
探讨:java中删除数组中重复元素
查看>>
Linux下firefox安装
查看>>
C语言经典---结构体
查看>>
C#应用教程之SQLServer基础应用开发
查看>>
ADO.NET 事务处理
查看>>
Java基础 javassist
查看>>
Dubbo 拦截器和监听器
查看>>
CentOS系统搭建-网络环境
查看>>
案例 - optimize table 的一些坑
查看>>
linux安全配置
查看>>
我的友情链接
查看>>
Yii框架官方教程增补篇2——开始:安装Yii框架
查看>>
定期从Oracle导数据至MySQL
查看>>
OC 自动释放池&ARC
查看>>
简单一步开启你的wordpress Gzip压缩,提高网页浏览速度
查看>>
编译器 cc、gcc、g++、CC 的区别
查看>>
[置顶] 关于我
查看>>
我的友情链接
查看>>
eclipse web项目目录结构
查看>>
Java程序员从笨鸟到菜鸟之(九十七)深入java虚拟机(六)——类加载的父亲委托机制...
查看>>