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

  • 相关阅读:
    Python TCP服务器
    Python TCP客户端
    链接测试工具xenu link sleuth的使用
    nodejs & nodemailer
    node socket.io web
    簡單的爬蟲 二 ಥ_ಥ 爬一爬 一個博客的每篇文件的標題
    簡單的爬蟲 一 ಥ_ಥ(就是一個頁面)
    兩端對齊
    appframework(jqmobi) 3.0 设置
    sass mapsource --->gulp
  • 原文地址:https://www.cnblogs.com/Brake/p/12694666.html
Copyright © 2011-2022 走看看