ThreadLocal是什麼
ThreadLocal是一個關於創建線程局部變量的類。是線程私有的。通常情況下,我們創建的變量是可以被任何一個線程訪問並修改的。而使用ThreadLocal創建的變量只能被當前線程訪問,其他線程則無法訪問和修改。
雖然ThreadLocal並不在java.util.concurrent包中而在java.lang包中,但更傾向於把它當作是一種併發容器(雖然真正存放數據的是ThreadLoclMap)進行歸類。從ThreadLocal這個類名可以顧名思義的進行理解,表示線程的“本地變量”,即每個線程都擁有該變量副本,達到人手一份的效果,各用各的這樣就可以避免共享資源的競爭。
在實際項目中我們需要將一些信息放到單個線程裏,比如,前端傳過來的token等。
用法
(1)ThreadLocal是支持泛型的,首先創建存儲的對象(若存儲的是基本數據類型,則不需要創建)
public class BaseSignatureRequest {
private String token;
private String userId;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
(2)創建ThreadLocal變量
public class ThreadLocalCache {
public static ThreadLocal<BaseSignatureRequest>
baseSignatureRequestThreadLocal = new ThreadLocal<>();
}
(3)設置值
//token放入threadLocal
BaseSignatureRequest baseSignatureRequest = new BaseSignatureRequest();
baseSignatureRequest.setToken(String.valueOf(result.getData()));
baseSignatureRequest.setUserId(userId);
ThreadLocalCache.baseSignatureRequestThreadLocal.set(baseSignatureRequest);
(4)獲取值(用完後刪除,防止內存溢出)
BaseSignatureRequest baseSignatureRequest = ThreadLocalCache.baseSignatureRequestThreadLocal.get();
//使用後清理ThreadLocal
ThreadLocalCache.baseSignatureRequestThreadLocal.remove();
原理
參考:http://con.zhangjikai.com/ThreadLocal.html
https://juejin.im/post/5aeeb22e6fb9a07aa213404a
https://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/