ThreadLocal變量
是java裏特殊的變量
他是一個線程級別的變量,每個線程都有一個ThreadLocal,就是每個線程都擁有了自己獨立的一個變量,競爭條件被消除,在併發模式下是絕對安全的變量。
示例:
//會自動在每個線程創建一個T的副本,副本之間相互獨立,互不影響
ThreadLocal<T> var = new ThreadLocal<T>();
可以簡單理解爲:JVM維護了一個Map<Thread,T>,每個線程要用到T時,用當前線程去Map裏取,僅供理解。
使用場景
在實際分佈式項目中ThreadLocal變量經常不可獲缺,我們經常需要去當前請求者的信息,一般都會放在上下文中,通過ThreadLocal變量進行存儲。然後rpc過程中傳遞ThreadLocal變量。
public class Sessioner {
/** 上下文 */
private static final ThreadLocal<Session> cxt = ThreadLocal.withInitial(Session::new);
public static void clear() {
CTX.remove();
}
public static Session context() {
return cxt.get();
}
public static void init(Session session) {
CTX.set(session);
}
}