# ThreadLocal é¢è¯å®ï¼äºè§£ThreadLocalåï¼ç¨è¿ThreadLocalåï¼ æï¼äºè§£è¿ï¼å®æ¯è¿æ ·çï¼å妿³å®ç°æ¯ä¸ä¸ªçº¿ç¨é½æèªå·±çä¸å±æ¬å°åé该å¦ä½è§£å³å¢ï¼ JDK䏿ä¾ç`ThreadLocal`ç±»æ£æ¯ä¸ºäºè§£å³è¿æ ·çé®é¢ã **`ThreadLocal`类主è¦è§£å³çå°±æ¯è®©æ¯ä¸ªçº¿ç¨ç»å®èªå·±çå¼ï¼å¯ä»¥å°`ThreadLocal`ç±»å½¢è±¡çæ¯å»æåæ¾æ°æ®ççåï¼çåä¸å¯ä»¥å卿¯ä¸ªçº¿ç¨çç§ææ°æ®ã**å¦æä½ å建äºä¸ä¸ª`ThreadLocal`åéï¼é£ä¹è®¿é®è¿ä¸ªåéçæ¯ä¸ªçº¿ç¨é½ä¼æè¿ä¸ªåéçæ¬å°å¯æ¬ï¼è¿ä¹æ¯`ThreadLocal`åéåçç±æ¥ãä»ä»¬å¯ä»¥ä½¿ç¨ `getï¼ï¼` å `setï¼ï¼` æ¹æ³æ¥è·åé»è®¤å¼æå°å ¶å¼æ´æ¹ä¸ºå½åçº¿ç¨æåç坿¬çå¼ï¼ä»èé¿å äºçº¿ç¨å®å ¨é®é¢ã ## åºå±åç é¢è¯å®ï¼ä½ ç¥éåºå±åçåï¼ æï¼ç¥é é¦å çï¼ç»æ ```java public class Thread implements Runnable { ...... //䏿¤çº¿ç¨æå ³çThreadLocalå¼ãç±ThreadLocalç±»ç»´æ¤ ThreadLocal.ThreadLocalMap threadLocals = null; ...... } // ç±æºç å¯è§ï¼ThreadLocalåå¨çåéåå¨ThreadçThreadLocalMapä¸ // å¯ç解为ThreadLocalMapæ¯ä¸é¨å®å¶çä¸ç§Map ``` å ¶æ¬¡çsetågetæ¹æ³ ```java // set public void set(T value) { // è·åå½åçº¿ç¨ Thread t = Thread.currentThread(); // æ¿å°å®å¶çThreadLocalMapçmap ThreadLocalMap map = getMap(t); if (map != null) //ä¸ä¸ºç©ºï¼åç»å® map.set(this, value); else // å¦åå建 createMap(t, value); } // getMap è¿åçå°±æ¯threadLocals ThreadLocalMap getMap(Thread t) { return t.threadLocals; } // get public T get() { // ä¾ç¶è·åå½åçº¿ç¨ Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { // è·åå½åEntry ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") // 妿ä¸ä¸ºç©ºï¼åè¿å T result = (T)e.value; return result; } } return setInitialValue(); } ``` **æç»çå鿝æ¾å¨äºå½å线ç¨ç `ThreadLocalMap` ä¸ï¼å¹¶ä¸æ¯åå¨ `ThreadLocal` ä¸ï¼ThreadLocal å¯ä»¥çè§£ä¸ºåªæ¯ThreadLocalMapçå°è£ ï¼ä¼ éäºåéå¼ã** **æ¯ä¸ªThreadä¸é½å ·å¤ä¸ä¸ªThreadLocalMapï¼èThreadLocalMapå¯ä»¥åå¨ä»¥ThreadLocal为keyçé®å¼å¯¹ã** æ¯å¦æä»¬å¨åä¸ä¸ªçº¿ç¨ä¸å£°æäºä¸¤ä¸ª `ThreadLocal` 对象çè¯ï¼ä¼ä½¿ç¨ `Thread`å é¨é½æ¯ä½¿ç¨ä» æé£ä¸ª`ThreadLocalMap` åæ¾æ°æ®çï¼`ThreadLocalMap`ç key å°±æ¯ `ThreadLocal`对象ï¼value å°±æ¯ `ThreadLocal` 对象è°ç¨`set`æ¹æ³è®¾ç½®çå¼ã`ThreadLocal` æ¯ mapç»ææ¯ä¸ºäºè®©æ¯ä¸ªçº¿ç¨å¯ä»¥å ³èå¤ä¸ª `ThreadLocal`åéãè¿ä¹å°±è§£éäºThreadLocal声æçåé为ä»ä¹å¨æ¯ä¸ä¸ªçº¿ç¨é½æèªå·±çä¸å±æ¬å°åéã ## å åæ³æ¼ é¢è¯å®ï¼ç¥éå åæ³é²åï¼ æï¼ç¥éï¼`ThreadLocalMap` ä¸ä½¿ç¨ç key 为 `ThreadLocal` çå¼±å¼ç¨,è value æ¯å¼ºå¼ç¨ãæä»¥ï¼å¦æ `ThreadLocal` 没æè¢«å¤é¨å¼ºå¼ç¨çæ åµä¸ï¼å¨åå¾åæ¶çæ¶åä¼ key ä¼è¢«æ¸ çæï¼è value ä¸ä¼è¢«æ¸ çæãè¿æ ·ä¸æ¥ï¼`ThreadLocalMap` ä¸å°±ä¼åºç°key为nullçEntryãå妿们ä¸å任使ªæ½çè¯ï¼value æ°¸è¿æ æ³è¢«GC åæ¶ï¼è¿ä¸ªæ¶åå°±å¯è½ä¼äº§çå åæ³é²ãThreadLocalMapå®ç°ä¸å·²ç»èèäºè¿ç§æ åµï¼å¨è°ç¨ `set()`ã`get()`ã`remove()` æ¹æ³çæ¶åï¼ä¼æ¸ çæ key 为 null çè®°å½ã使ç¨å® `ThreadLocal`æ¹æ³å æå¥½æå¨è°ç¨`remove()`æ¹æ³ã