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

  • 相关阅读:
    130行C语言实现个用户态线程库(2)
    130行C语言实现个用户态线程库(1)
    用C语言模仿Python函数
    ES 2.4 bigdesk 安装失败解决方案.
    使用SqlBulkCopy, 插入整个DataTable中的所有数据到指定数据库中
    表A的数据减去表B ,最终得到表C
    关于把A表中的数据复制到B表中(整理)
    需求池整理
    app主流推广渠道
    流程图梳理
  • 原文地址:https://www.cnblogs.com/Brake/p/12694666.html
Copyright © 2020-2023  润新知