当前位置 : 主页 > 编程语言 > java >

Java单线程ThreadLocal串值问题解决方案

来源:互联网 收集:自由互联 发布时间:2021-05-10
ThreadLocal ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。 代码 @RestControllerpublic class ThreadLocalController { private static final ThreadLocalString currentUid = ThreadLocal.withInitial(() -

ThreadLocal

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

代码

@RestController
public class ThreadLocalController {
  private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);
  @GetMapping("bad")
  public Map doBad(@RequestParam("uid") String uid) {
    String before = currentUid.get();
    currentUid.set(uid);
    String after = currentUid.get();
    Map result = new HashMap();
    result.put("before", before);
    result.put("after", after);
    return result;
  }
}

在application中做一下tomcat的配置

server.tomcat.max-threads=1

运行结果第一次

第二次

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

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

修复

@RestController
public class ThreadLocalController {
  private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null);
  @GetMapping("good")
  public Map doGood(@RequestParam("uid") String uid) {

    try {
      String before = currentUid.get();
      currentUid.set(uid);
      String after = currentUid.get();
      Map result = new HashMap();
      result.put("before", before);
      result.put("after", after);
      return result;
    } finally {
      currentUid.remove();
    }
  }
}

Key

tomcat线程池。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

网友评论