本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!前端
今天是我在掘金的第二篇文章,感謝閱讀,並但願之後持續關注,我會輸出更多技術乾貨,咱們共同進步!面試
之後可能會分爲幾大專題,相似於併發專題,源碼專題,面試專題等(只會分享乾貨)。redis
請出今天的主角: ThreadLocal後端
ThreadLocal 很好理解:Thread(線程)、local(本地)緩存
那麼你大概就明白了,這個東西是屬於本地線程。能夠理解map本地緩存之類的,可是這裏面有thread,並不是共享數據,而是每一個線程都有本身的一個空間,互不影響。那麼接下來經過具體業務場景瞭解其背後的用法:安全
該場景的具體分析能夠點擊查看:ThreadLocal 使用場景02markdown
接下來看代碼演示併發
/**
* 變量存儲
* @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() 方法。
更深的咱們先不討論,後面我會把它放到源碼專題作出詳細討論。感謝你們的閱讀,但願對你有幫助。歡迎你們點贊、評論、轉發。
最近全國大部門地區暴雨來襲,但願你們出門帶好雨具,注意安全。話說回來,北京說好的暴雨呢,各類防範措施都已就緒,怎麼還不見下呢。