欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java單線程ThreadLocal串值問題解決方案

 更新時(shí)間:2020年04月18日 09:32:00   作者:iBrake  
這篇文章主要介紹了Java單線程ThreadLocal串值問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

ThreadLocal

ThreadLocal 適用于變量在線程間隔離,而在方法或類間共享的場(chǎng)景。

代碼

@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

運(yùn)行結(jié)果第一次

第二次

按理說before總是null才對(duì),為什么第二次運(yùn)行卻讀取到了第一次的值呢?

只是因?yàn)槲覀兊膖ocat會(huì)開啟一個(gè)線程來調(diào)用我們的程序,而tomcat本身是有線程池的,會(huì)出現(xiàn)線程復(fù)用的情況。所以導(dǎo)致了問題。

修復(fù)

@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線程池。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論