亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

解決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

尚义县| 巴塘县| 临夏市| 阿克陶县| 筠连县| 房产| 遂昌县| 金华市| 肥城市| 北宁市| 定襄县| 乌审旗| 江华| 文昌市| 陆河县| 浦北县| 磐石市| 东乌| 山东省| 厦门市| 泸定县| 旺苍县| 依兰县| 北海市| 江山市| 独山县| 敖汉旗| 亳州市| 咸丰县| 瑞昌市| 剑河县| 正宁县| 秦皇岛市| 夏津县| 民权县| 天等县| 遵义县| 普格县| 淅川县| 阜阳市| 东丰县|