网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

解决Java单线程ThreadLocal串值问题

这篇文章主要为大家展示了解决Java单线程ThreadLocal串值问题,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

创新互联公司专注于网站建设|成都网站维护公司|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖广告推广等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身开发品质网站。

ThreadLocal

ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。

代码

@RestController
public class ThreadLocalController {
  private static final ThreadLocal currentUid = ThreadLocal.withInitial(() -> null);
  @GetMapping("bad")
  public Map doBad(@RequestParam("uid") String uid) {
    String before = currentUid.get();
    currentUid.set(uid);
    String after = currentUid.get();
    Map result = new HashMap();
    result.put("before", before);
    result.put("after", after);
    return result;
  }
}

在application中做一下tomcat的配置

server.tomcat.max-threads=1

运行结果第一次

解决Java单线程ThreadLocal串值问题

第二次

解决Java单线程ThreadLocal串值问题

按理说before总是null才对,为什么第二次运行却读取到了第一次的值呢?

只是因为我们的tocat会开启一个线程来调用我们的程序,而tomcat本身是有线程池的,会出现线程复用的情况。所以导致了问题。

修复

@RestController
public class ThreadLocalController {
  private static final ThreadLocal currentUid = ThreadLocal.withInitial(() -> null);
  @GetMapping("good")
  public Map doGood(@RequestParam("uid") String uid) {

    try {
      String before = currentUid.get();
      currentUid.set(uid);
      String after = currentUid.get();
      Map result = new HashMap();
      result.put("before", before);
      result.put("after", after);
      return result;
    } finally {
      currentUid.remove();
    }
  }
}

Key

tomcat线程池。

以上就是关于解决Java单线程ThreadLocal串值问题的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看到。


网站标题:解决Java单线程ThreadLocal串值问题
标题来源:http://bjjierui.cn/article/iiiopj.html

其他资讯