91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

解決Java單線程ThreadLocal串值問題

發布時間:2020-08-03 09:42:59 來源:億速云 閱讀:258 作者:小豬 欄目:編程語言

這篇文章主要為大家展示了解決Java單線程ThreadLocal串值問題,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

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

運行結果第一次

解決Java單線程ThreadLocal串值問題

第二次

解決Java單線程ThreadLocal串值問題

按理說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線程池。

以上就是關于解決Java單線程ThreadLocal串值問題的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滁州市| 古交市| 宁乡县| 长治市| 屯门区| 九寨沟县| 韩城市| 井研县| 登封市| 安图县| 九龙城区| 保康县| 巍山| 内乡县| 永宁县| 金溪县| 泸溪县| 西畴县| 行唐县| 扶余县| 甘德县| 银川市| 阿瓦提县| 镇沅| 尼勒克县| 澳门| 黎平县| 军事| 迭部县| 青铜峡市| 攀枝花市| 南雄市| 于都县| 卢龙县| 三原县| 荔浦县| 怀安县| 金川县| 紫云| 海阳市| 赫章县|