銆銆ThreadLocal鏄粈涔?/STRONG>
銆銆ThreadLocal鏄粈涔堝憿錛熷叾瀹濼hreadLocal騫墮潪鏄竴涓嚎紼嬬殑鏈湴瀹炵幇鐗堟湰錛屽畠騫朵笉鏄竴涓猅hread錛岃屾槸thread local variable錛堢嚎紼嬪眬閮ㄥ彉閲忥級銆備篃璁告妸瀹冨懡鍚嶄負ThreadLocalVar鏇村姞鍚堥傘傜嚎紼嬪眬閮ㄥ彉閲忥紙ThreadLocal錛夊叾瀹炵殑鍔熺敤闈炲父綆鍗曪紝灝辨槸涓烘瘡涓涓嬌鐢ㄨ鍙橀噺鐨勭嚎紼嬮兘鎻愪緵涓涓彉閲忓肩殑鍓湰錛屾槸姣忎竴涓嚎紼嬮兘鍙互鐙珛鍦版敼鍙樿嚜宸辯殑鍓湰錛岃屼笉浼氬拰鍏跺畠綰跨▼鐨勫壇鏈啿紿併備粠綰跨▼鐨勮搴︾湅錛屽氨濂藉儚姣忎竴涓嚎紼嬮兘瀹屽叏鎷ユ湁璇ュ彉閲忋傜嚎紼嬪眬閮ㄥ彉閲忓茍涓嶆槸Java鐨勬柊鍙戞槑錛屽湪鍏跺畠鐨勪竴浜涜璦緙栬瘧鍣ㄥ疄鐜幫紙濡侷BM XL FORTRAN錛変腑錛屽畠鍦ㄨ璦鐨勫眰嬈℃彁渚涗簡鐩存帴鐨勬敮鎸併傚洜涓篔ava涓病鏈夋彁渚涘湪璇█灞傛鐨勭洿鎺ユ敮鎸侊紝鑰屾槸鎻愪緵浜嗕竴涓猅hreadLocal鐨勭被鏉ユ彁渚涙敮鎸侊紝鎵浠ワ紝鍦↗ava涓紪鍐欑嚎紼嬪眬閮ㄥ彉閲忕殑浠g爜鐩稿姣旇緝絎ㄦ嫏錛岃繖涔熻鏄嚎紼嬪眬閮ㄥ彉閲忔病鏈夊湪Java涓緱鍒板緢濂界殑鏅強鐨勪竴涓師鍥犲惂銆?BR>銆銆
銆銆ThreadLocal鐨勮璁?BR>銆銆
銆銆棣栧厛鐪嬬湅ThreadLocal鐨勬帴鍙o細
銆銆
銆銆Object get() ; // 榪斿洖褰撳墠綰跨▼鐨勭嚎紼嬪眬閮ㄥ彉閲忓壇鏈?protected Object initialValue(); // 榪斿洖璇ョ嚎紼嬪眬閮ㄥ彉閲忕殑褰撳墠綰跨▼鐨勫垵濮嬪?BR>銆銆void set(Object value); // 璁劇疆褰撳墠綰跨▼鐨勭嚎紼嬪眬閮ㄥ彉閲忓壇鏈殑鍊?BR>銆銆
銆銆ThreadLocal鏈?涓柟娉曪紝鍏朵腑鍊煎緱娉ㄦ剰鐨勬槸initialValue()錛岃鏂規硶鏄竴涓猵rotected鐨勬柟娉曪紝鏄劇劧鏄負浜嗗瓙綾婚噸鍐欒岀壒鎰忓疄鐜扮殑銆傝鏂規硶榪斿洖褰撳墠綰跨▼鍦ㄨ綰跨▼灞閮ㄥ彉閲忕殑鍒濆鍊鹼紝榪欎釜鏂規硶鏄竴涓歡榪熻皟鐢ㄦ柟娉曪紝鍦ㄤ竴涓嚎紼嬬1嬈¤皟鐢╣et()鎴栬卻et(Object)鏃舵墠鎵ц錛屽茍涓斾粎鎵ц1嬈°俆hreadLocal涓殑紜疄瀹炵幇鐩存帴榪斿洖涓涓猲ull錛?BR>銆銆
銆銆
protected Object initialValue() { return null; }
銆銆ThreadLocal鏄浣曞仛鍒頒負姣忎竴涓嚎紼嬬淮鎶ゅ彉閲忕殑鍓湰鐨勫憿錛熷叾瀹炲疄鐜扮殑鎬濊礬寰堢畝鍗曪紝鍦═hreadLocal綾諱腑鏈変竴涓狹ap錛岀敤浜庡瓨鍌ㄦ瘡涓涓嚎紼嬬殑鍙橀噺鐨勫壇鏈傛瘮濡備笅闈㈢殑紺轟緥瀹炵幇錛?BR>銆銆
銆銆
public class ThreadLocal
銆銆{
銆銆private Map values = Collections.synchronizedMap(new HashMap());
銆銆public Object get()
銆銆{
銆銆Thread curThread = Thread.currentThread();
銆銆Object o = values.get(curThread);
銆銆if (o == null && !values.containsKey(curThread))
銆銆{
銆銆o = initialValue();
銆銆values.put(curThread, o);
銆銆}
銆銆return o;
銆銆}
銆銆
銆銆public void set(Object newValue)
銆銆{
銆銆values.put(Thread.currentThread(), newValue);
銆銆}
銆銆
銆銆public Object initialValue()
銆銆{
銆銆return null;
銆銆}
銆銆}
銆銆褰撶劧錛岃繖騫朵笉鏄竴涓伐涓氬己搴︾殑瀹炵幇錛屼絾JDK涓殑ThreadLocal鐨勫疄鐜版諱綋鎬濊礬涔熺被浼間簬姝ゃ?BR>銆銆
銆銆ThreadLocal鐨勪嬌鐢?BR>銆銆
銆銆濡傛灉甯屾湜綰跨▼灞閮ㄥ彉閲忓垵濮嬪寲鍏跺畠鍊鹼紝閭d箞闇瑕佽嚜宸卞疄鐜癟hreadLocal鐨勫瓙綾誨茍閲嶅啓璇ユ柟娉曪紝閫氬父浣跨敤涓涓唴閮ㄥ尶鍚嶇被瀵筎hreadLocal榪涜瀛愮被鍖栵紝姣斿涓嬮潰鐨勪緥瀛愶紝SerialNum綾諱負姣忎竴涓被鍒嗛厤涓涓簭鍙鳳細
銆銆
銆銆
public class SerialNum
銆銆{
銆銆// The next serial number to be assigned
銆銆
銆銆private static int nextSerialNum = 0;
銆銆private static ThreadLocal serialNum = new ThreadLocal()
銆銆{
銆銆protected synchronized Object initialValue()
銆銆{
銆銆return new Integer(nextSerialNum++);
銆銆}
銆銆};
銆銆
銆銆public static int get()
銆銆{
銆銆return ((Integer) (serialNum.get())).intValue();
銆銆}
銆銆}
銆銆
銆
銆int serial = SerialNum.get();
銆銆鍗沖彲銆?BR>銆銆
銆銆鍦ㄧ嚎紼嬫槸媧誨姩鐨勫茍涓擳hreadLocal瀵硅薄鏄彲璁塊棶鐨勬椂錛岃綰跨▼灝辨寔鏈変竴涓埌璇ョ嚎紼嬪眬閮ㄥ彉閲忓壇鏈殑闅愬惈寮曠敤錛屽綋璇ョ嚎紼嬭繍琛岀粨鏉熷悗錛岃綰跨▼鎷ユ湁鐨勬墍浠ョ嚎紼嬪眬閮ㄥ彉閲忕殑鍓湰閮藉皢澶辨晥錛屽茍絳夊緟鍨冨溇鏀墮泦鍣ㄦ敹闆嗐?BR>銆銆
銆銆ThreadLocal涓庡叾瀹冨悓姝ユ満鍒剁殑姣旇緝
銆銆ThreadLocal鍜屽叾瀹冨悓姝ユ満鍒剁浉姣旀湁浠涔堜紭鍔垮憿錛烼hreadLocal鍜屽叾瀹冩墍鏈夌殑鍚屾鏈哄埗閮芥槸涓轟簡瑙e喅澶氱嚎紼嬩腑鐨勫鍚屼竴鍙橀噺鐨勮闂啿紿侊紝鍦ㄦ櫘閫氱殑鍚屾鏈哄埗涓紝鏄氳繃瀵硅薄鍔犻攣鏉ュ疄鐜板涓嚎紼嬪鍚屼竴鍙橀噺鐨勫畨鍏ㄨ闂殑銆傝繖鏃惰鍙橀噺鏄涓嚎紼嬪叡浜殑錛屼嬌鐢ㄨ繖縐嶅悓姝ユ満鍒墮渶瑕佸緢緇嗚嚧鍦板垎鏋愬湪浠涔堟椂鍊欏鍙橀噺榪涜璇誨啓錛屼粈涔堟椂鍊欓渶瑕侀攣瀹氭煇涓璞★紝浠涔堟椂鍊欓噴鏀捐瀵硅薄鐨勯攣絳夌瓑寰堝銆傛墍鏈夎繖浜涢兘鏄洜涓哄涓嚎紼嬪叡浜簡璧勬簮閫犳垚鐨勩俆hreadLocal灝變粠鍙︿竴涓搴︽潵瑙e喅澶氱嚎紼嬬殑騫跺彂璁塊棶錛孴hreadLocal浼氫負姣忎竴涓嚎紼嬬淮鎶や竴涓拰璇ョ嚎紼嬬粦瀹氱殑鍙橀噺鐨勫壇鏈紝浠庤岄殧紱諱簡澶氫釜綰跨▼鐨勬暟鎹紝姣忎竴涓嚎紼嬮兘鎷ユ湁鑷繁鐨勫彉閲忓壇鏈紝浠庤屼篃灝辨病鏈夊繀瑕佸璇ュ彉閲忚繘琛屽悓姝ヤ簡銆俆hreadLocal鎻愪緵浜嗙嚎紼嬪畨鍏ㄧ殑鍏變韓瀵硅薄錛屽湪緙栧啓澶氱嚎紼嬩唬鐮佹椂錛屽彲浠ユ妸涓嶅畨鍏ㄧ殑鏁翠釜鍙橀噺灝佽榪汿hreadLocal錛屾垨鑰呮妸璇ュ璞$殑鐗瑰畾浜庣嚎紼嬬殑鐘舵佸皝瑁呰繘ThreadLocal銆?BR>銆銆
銆銆鐢變簬ThreadLocal涓彲浠ユ寔鏈変換浣曠被鍨嬬殑瀵硅薄錛屾墍浠ヤ嬌鐢═hreadLocal get褰撳墠綰跨▼鐨勫兼槸闇瑕佽繘琛屽己鍒剁被鍨嬭漿鎹€備絾闅忕潃鏂扮殑Java鐗堟湰錛?.5錛夊皢妯$増鐨勫紩鍏ワ紝鏂扮殑鏀寔妯$増鍙傛暟鐨凾hreadLocal綾誨皢浠庝腑鍙楃泭銆備篃鍙互鍑忓皯寮哄埗綾誨瀷杞崲錛屽茍灝嗕竴浜涢敊璇鏌ユ彁鍓嶅埌浜嗙紪璇戞湡錛屽皢涓瀹氱▼搴﹀湴綆鍖朤hreadLocal鐨勪嬌鐢ㄣ?BR>銆銆
銆銆鎬葷粨
銆銆褰撶劧ThreadLocal騫朵笉鑳芥浛浠e悓姝ユ満鍒訛紝涓よ呴潰鍚戠殑闂棰嗗煙涓嶅悓銆傚悓姝ユ満鍒舵槸涓轟簡鍚屾澶氫釜綰跨▼瀵圭浉鍚岃祫婧愮殑騫跺彂璁塊棶錛屾槸涓轟簡澶氫釜綰跨▼涔嬮棿榪涜閫氫俊鐨勬湁鏁堟柟寮忥紱鑰孴hreadLocal鏄殧紱誨涓嚎紼嬬殑鏁版嵁鍏變韓錛屼粠鏍規湰涓婂氨涓嶅湪澶氫釜綰跨▼涔嬮棿鍏變韓璧勬簮錛堝彉閲忥級錛岃繖鏍峰綋鐒朵笉闇瑕佸澶氫釜綰跨▼榪涜鍚屾浜嗐傛墍浠ワ紝濡傛灉浣犻渶瑕佽繘琛屽涓嚎紼嬩箣闂磋繘琛岄氫俊錛屽垯浣跨敤鍚屾鏈哄埗錛涘鏋滈渶瑕侀殧紱誨涓嚎紼嬩箣闂寸殑鍏變韓鍐茬獊錛屽彲浠ヤ嬌鐢═hreadLocal錛岃繖灝嗘瀬澶у湴綆鍖栦綘鐨勭▼搴忥紝浣跨▼搴忔洿鍔犳槗璇匯佺畝媧併?nbsp;