ThreadLocal在其他线程中get不到set的变量

牛客网项目中用spring boot做的图书管理系统中,

private static ThreadLocal host = new ThreadLocal<>();

public static User getHost() {
    return host.get();
}

public static void setHost(User user) {
    host.set(user);
}
在LoginBiz类中ConcurrentUtils.setHost(user);后面调用getHost()能获取user

在BookController类中ConcurrentUtils.getHost();user为null

这是什么原因,怎么解决呢。。

项目中有两个controller,一个bookcontroller,一个logincontroller,在logincontroller的@RequestMapping(path = {"/users/register/do"},method = {RequestMethod.POST})中sethost(user),然后在bookcontroller中@RequestMapping(path = {"/index"}, method = {RequestMethod.GET}) gethost();这应该是不同线程的吧,我用System.out.println(Thread.currentThread());也显示是不同的线程。
weixin_44775117
coldlessboy 找到原因了,这个项目讲解文档顺序问题,后面设置的拦截器HostInfoInterceptor中在每一次请求中都从Cookie中提取ticket然后去数据库查询用户将用户setHost到ThreadLocal中了。
10 个月之前 回复

3个回答

你这描述太混乱了
在LoginBiz类中ConcurrentUtils.setHost(user);后面调用getHost()能获取user

在BookController类中ConcurrentUtils.getHost();user为null

这个是跟线程有关,又不是跟类有关。
你需要保证这两个操作发生在同一个线程
举个例子
线程A setHost userA
线程B setHost userB
对应的线程去set 才能得到对应的user

va_jav
va_jav 回复coldlessboy: 对的,你都2个controller,肯定是2个请求,每个请求一个线程,肯定是不同线程,你非要获取的话,按照你的描述,可以放在session、cookie里
10 个月之前 回复
weixin_44775117
coldlessboy 好的谢谢,确实说的比较混乱,项目中有两个controller,一个bookcontroller,一个logincontroller,在logincontroller的@RequestMapping(path = {"/users/register/do"},method = {RequestMethod.POST})中sethost(user),然后在bookcontroller中@RequestMapping(path = {"/index"}, method = {RequestMethod.GET}) gethost();这应该是不同线程的吧,我用System.out.println(Thread.currentThread());也显示是不同的线程。
10 个月之前 回复

那在别的线程肯定拿不到的呀,这个ThreadLocal本来就是本线程使用的

weixin_44775117
coldlessboy 好的,谢谢
10 个月之前 回复

你对线程可能是有什么误解,举个栗子,你是用户A(线程A),去银行存钱,相当于你代码中的set,我是用户B(线程B)去银行取钱,相当于你代码中的get,我能取你的钱吗?线程A set的值能被线程B直接get到吗?

weixin_41763995
_鹿慕溪水 回复coldlessboy: 只看你copy的这段代码确实是两个不相关的线程,但是架构方面是不是做了其他的事情,来使这个对象在线程间共享了呢?
10 个月之前 回复
weixin_44775117
coldlessboy 谢谢,项目中有两个controller,一个bookcontroller,一个logincontroller,在logincontroller的@RequestMapping(path = {"/users/register/do"},method = {RequestMethod.POST})中sethost(user),然后在bookcontroller中@RequestMapping(path = {"/index"}, method = {RequestMethod.GET}) gethost();这应该是不同线程的吧,我用System.out.println(Thread.currentThread());也显示是不同的线程。如果是不同线程我也不知道源码中为什么这样写了- -
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐