乾貨!ThreadLocal 使用場景

本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!前端

今天是我在掘金的第二篇文章,感謝閱讀,並但願之後持續關注,我會輸出更多技術乾貨,咱們共同進步!面試

之後可能會分爲幾大專題,相似於併發專題,源碼專題,面試專題等(只會分享乾貨)。redis

請出今天的主角: ThreadLocal後端

見字如面

ThreadLocal 很好理解:Thread(線程)、local(本地)緩存

那麼你大概就明白了,這個東西是屬於本地線程。能夠理解map本地緩存之類的,可是這裏面有thread,並不是共享數據,而是每一個線程都有本身的一個空間,互不影響。那麼接下來經過具體業務場景瞭解其背後的用法:安全

場景介紹

  • ThreadLocal 用做保存每一個線程獨享的對象,爲每一個線程都建立一個副本,這樣每一個線程均可以修改本身所擁有的副本, 而不會影響其餘線程的副本,確保了線程安全。

該場景的具體分析能夠點擊查看:ThreadLocal 使用場景02markdown

image.png

  • 用做每一個線程內須要獨立保存信息,以便供其餘方法更方便地獲取該信息的場景。每一個線程獲取到的信息可能都是不同的,前面執行的方法保存了信息後,後續方法能夠經過 ThreadLocal 直接獲取到,避免了傳參,相似於全局變量的概念。該場景在業務中應用可能更普遍些,本篇文章主要介紹該場景的使用,第一種場景的連接爲:ThreadLocal 使用場景02。接下來經過一副圖深刻了解 :

image.png

接下來看代碼演示併發

代碼演示

/**
 * 變量存儲
 * @author yn
 * @date 2021/7/11
 */
public class LocalContext {
    //初始化 ThreadLocal 將用戶信息裝進Local
    private static final ThreadLocal<Node> LOCAL = new InheritableThreadLocal<Node>(){
    @Override
    protected Node initialValue() {
      return new Node();
    }
  };
  
  /**
   * 將userID裝進本地緩存
   * @param userId
   */
  public static void setUserId(Integer userId){
    LOCAL.get().setUserId(userId);
  }
  
   /**
   * 獲取用戶
   * @param userId
   */
  public static Integer getUserId(){
    return LOCAL.get().getUserId();
  }
  
  
   /**
   * 清除本地變量
   */
  public static void remove(){
    LOCAL.remove();
  }

  ....省略其餘信息
}


/**
 * 定義用戶
 * @author yn
 * @date 2021/7/11
 */
@Data
public static class Node {
    private Integer userId;
    private String openId;
    private String mobile;
    private String appId;

    public Node(){
      this.userId = 0;
      this.openId = "";
      this.mobile = "";
      this.appId = "";
    }
 }
 
 
複製代碼

以上就是操做ThreadLocal的一個簡單工具類,是否是感受有點像redis、map之類。app

簡單原理描述

首先 ThreadLocal 是一個泛型類,保證能夠接受任何類型的對象。ide

由於一個線程內能夠存在多個 ThreadLocal 對象,因此實際上是 ThreadLocal 內部維護了一個 Map ,這個 Map 不是直接使用的 HashMap ,而是 ThreadLocal 實現的一個叫作 ThreadLocalMap 的靜態內部類。而咱們使用的 get()、set() 方法其實都是調用了這個ThreadLocalMap類對應的 get()、set() 方法。

更深的咱們先不討論,後面我會把它放到源碼專題作出詳細討論。感謝你們的閱讀,但願對你有幫助。歡迎你們點贊、評論、轉發。

弦外之音

最近全國大部門地區暴雨來襲,但願你們出門帶好雨具,注意安全。話說回來,北京說好的暴雨呢,各類防範措施都已就緒,怎麼還不見下呢。

相關文章
相關標籤/搜索