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

  • 相关阅读:
    C# 动态加载控件 (转)
    SQL 周月时间段
    js调用xml数据显示div层上下滚动的公告
    使用半透明的DIV实现禁用页面功能(转)
    学习jQuery第一天"Hello!How are you!"
    HTML生成类
    从无限畅想转来的
    SQL递归查询子类型
    js 图片缩显
    2020年统计用区划代码和城乡划分代码:安徽省乡镇编码
  • 原文地址:https://www.cnblogs.com/Brake/p/12694666.html
Copyright © 2011-2022 走看看