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线程池。

  • 相关阅读:
    VS2010导入DLL的总结
    [转]C#事件简单示例
    VS2010中实现TreeView和Panel的动态更新
    【JZOJ1282】打工
    【NOIP2016提高A组五校联考2】tree
    【NOIP2016提高A组五校联考2】running
    【NOIP2016提高A组五校联考2】string
    8月~9月学习总结
    NOIP2016提高A组五校联考2总结
    NOIP2016提高A组五校联考1总结
  • 原文地址:https://www.cnblogs.com/Brake/p/12694666.html
Copyright © 2011-2022 走看看