zoukankan      html  css  js  c++  java
  • Java 单线程代码ThreadLocal串值问题

    ThreadLocal

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

    代码

     1 @RestController
     2 public class ThreadLocalController {
     3     private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);
     4     @GetMapping("bad")
     5     public Map doBad(@RequestParam("uid") String uid) {
     6         String before = currentUid.get();
     7         currentUid.set(uid);
     8         String after = currentUid.get();
     9         Map result = new HashMap();
    10         result.put("before", before);
    11         result.put("after", after);
    12         return result;
    13     }
    14 }

    在application中做一下tomcat的配置

    server.tomcat.max-threads=1

    运行结果

    第一次

    第二次

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

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

    修复

     1 @RestController
     2 public class ThreadLocalController {
     3     private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);
     4     @GetMapping("good")
     5     public Map doGood(@RequestParam("uid") String uid) {
     6 
     7         try {
     8             String before = currentUid.get();
     9             currentUid.set(uid);
    10             String after = currentUid.get();
    11             Map result = new HashMap();
    12             result.put("before", before);
    13             result.put("after", after);
    14             return result;
    15         } finally {
    16             currentUid.remove();
    17         }
    18     }
    19 }

    Key

    tomcat线程池。

  • 相关阅读:
    JAVA读取PROPERTIES文件方式一
    JAVA时间工具类用法
    webservice
    SPRING+JPA+Hibernate配置方法
    Spring Boot,Spring Data JPA多数据源支持配置
    mybatis---实现关联表查询
    CXF WebService整合SpringMVC的maven项目
    ISO8583报文协议
    服务器换了一组硬盘后,读取不到硬盘数据,开不了机
    Ubuntu server12.04安装JDK+Tomcat+mysql
  • 原文地址:https://www.cnblogs.com/Brake/p/12694666.html
Copyright © 2011-2022 走看看