锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1銆乼hread-per-request 鐨勬柟寮忥紝榪欐牱浼氭湁鏇村綰跨▼緇存姢鍜屽垏鎹㈢殑緋葷粺寮閿錛屽悓鏃跺湪緋葷粺鎵╁睍鎬ф柟闈㈠彈鍒伴檺鍒躲?/span>
2銆侀拡瀵歸棶棰?錛屾垜浠彲浠ラ噰鐢ㄧ嚎紼嬫睜鐨勬柟寮忔潵鑺傜渷綰跨▼鍒涘緩銆佺淮鎶や互鍙婂垏鎹㈢殑寮閿錛屼絾鏄繖鏍蜂篃浼氶檺鍒剁郴緇熷彲浠ュ悓鏃跺鐞嗗鎴風鐨勬暟閲忥紝鑷沖皯瀵逛竴浜涢暱榪炴帴鍗忚鏉ヨ鏄繖鏍楓傛鏃跺鍔犵嚎紼嬫睜鐨勫ぇ灝忔槸涓嶈兘鍐嶆彁楂樼郴緇熸ц兘鐨勶紝鑰屽彧浼氬鍔犵郴緇熸洿澶氱殑綰跨▼寮閿銆?/span>
3銆佷紶緇熺殑socket鍦ㄨ/鍐欐暟鎹互鍙婂緩绔嬭繛鎺ヤ笂閮芥槸闃誨寮忕殑(娌℃湁鏁版嵁鍙鍙兘浼氶樆濉烇紱娌℃湁瓚沖絀洪棿緙撳瓨浼犺緭鐨勬暟鎹彲鑳介樆濉烇紱鏈嶅姟绔殑accept鏂規硶浠ュ強socket鏋勯犲嚱鏁伴兘浼氶樆濉炵瓑寰咃紝鐩村埌榪炴帴寤虹珛) 銆傝繖浜涚壒鎬т細闄嶄綆鏁翠釜緋葷粺瀵笴PU鐨勫埄鐢ㄧ巼浠ュ強緋葷粺鐨勬椿璺冩э紝闄嶄綆緋葷粺瀵瑰鎴瘋姹傜殑鍝嶅簲鎬у強鍝嶅簲鏃墮棿錛屽湪鏌愪簺鎯呭喌涓嬫槸涓嶅彲鎺ュ彈鐨勭敋鑷充細甯︽潵鐏鵑毦鎬х殑緇撴灉銆傚湪榪欐牱鐨勬儏褰笅錛屾垜浠瑙e喅cpu鍒╃敤鐜囥佺嚎紼嬫椿璺冩т互鍙婃彁楂樼郴緇熷悶鍚愰噺錛屾垜浠娍蹇呭仛寰堝棰濆鐨勫伐浣滀笖鐩稿綋澶嶆潅銆?/span>
4銆佺敱浜庝紶緇焥ocket鐨勯樆濉炵壒鎬э紝姣忎釜瀵圭瓑绔兘鍦ㄩ樆濉炵瓑寰呭彟澶栦竴绔畬鎴愮浉鍏沖鐞嗭紝榪欐牱鍔垮繀澧炲ぇ姝婚攣鐨勯闄┿?/span>
5銆佸綋鐒朵負浜嗘彁楂樼郴緇熺殑媧昏穬鎬э紝浼犵粺鐨剆ocket鍦╝ccept銆佹瀯閫爏ocket浠ュ強read鏂規硶涓婇兘澧炲姞浜嗚秴鏃舵帶鍒剁殑澶勭悊浠ュ強浣跨敤socket.close鏂規硶鏉ユ墦鏂竴浜涢樆濉炴搷浣滐紝鑰岀綉緇滄繪槸涓嶇‘瀹氱殑錛岃緗繖浜涜秴鏃舵椂闂寸殑璁劇疆鍦ㄥ叿浣撶殑涓婁笅鏂囩幆澧冧腑鐨勫彇鍊間篃鏄瘮杈冨鏉傜殑銆傜畝鑰岃█涔嬶紝涓轟簡鎻愰珮緋葷粺鐨勬椿璺冩т細澧炲ぇ緋葷粺鐨勫鏉傚害銆?/span>
閭d箞錛孞ava nio鐪熺殑灝辨槸Java socket緙栫▼瑙e喅浠ヤ笂鑻ュ共闂鐨勭伒涓瑰鑽悧?絳旀鏄惁瀹氱殑銆?/span>
nio鐨勯潪闃誨鐗規ф槸nio鏈澶х殑鐗圭偣錛屾墍璋撻潪闃誨鏃犻潪灝辨槸灝嗛氫俊鐨勪俊閬撹緗垚涓洪潪闃誨鐨勬儏鍐典笅錛屽璇ヤ俊閬撶殑鎵鏈夋搷浣滈兘鏄細绔嬪嵆榪斿洖鐨勩傚鏁版嵁璇誨彇錛屾病鏈夋暟鎹殑鏃跺欎細榪斿洖0鑰屼笉鏄樆濉炲湪淇¢亾涓娿傝繖鏍峰氨澧炲ぇ浜嗙郴緇熺殑媧昏穬鎬э紝浣垮緱緋葷粺涓嶅繀嫻垂璧勬簮鐨処/O鎿嶄綔涓婏紝緋葷粺鍙互鏇村ソ鐨勫埄鐢╟pu璧勬簮鍋氫竴浜涘叾瀹冨鐞嗭紝鍦ㄦ煇浜涘満鏅笅浼氭彁楂樼郴緇熺殑鍝嶅簲鎬т互鍙婂悶鍚愰噺銆?/span>
鍚屾椂nio鍦ㄧ綉緇滈氫俊鐨勪腑閲囩敤鐨勭綉緇淚/O浜嬩歡椹卞姩鐨勬柟寮忥紝鍗蟲搷浣滅郴緇熷鐢ㄦ埛鎰熷叴瓚g殑閫氫俊淇¢亾鍙婂叾涓婇潰鐨処/O浜嬩歡榪涜鐩戝惉騫墮氱煡搴旂敤紼嬪簭銆傝繖瀹為檯涓婁篃鏄瀵熻呮ā寮忕殑涓縐嶅簲鐢紝鍦ㄨ繖鏍風殑鑳屾櫙涓嬶紝闂4涓殑姝婚攣椋庨櫓鍑犱箮灝辨病鏈変簡銆?/span>
濡傛灉浣犲紑鍙戠殑鏈嶅姟绔笉鏄凱浠f湇鍔″櫒(欏哄簭鍖栧鐞嗘瘡涓鎴瘋姹?錛岄偅涔堝浜庨棶棰?銆?鍦╪io鏈嶅姟鍣ㄤ腑涔熸槸涓鏍風殑銆傛崲鍙ヨ瘽璇達紝鎴戜滑寮鍙戠殑騫跺彂澶勭悊鏈嶅姟鍣ㄤ負浜嗗疄鐜板鍚勭緗戠粶I/O浜嬩歡鐨勫鐞嗭紝騫跺姣忕鎴戜滑鎵鍏沖績鐨勭綉緇淚/O浜嬩歡榪涜鍙婃椂鍝嶅簲錛岄噰鐢╰hread-per-request鎴栬呯嚎紼嬫睜鐨勬柟寮忔槸鏃犳硶閬垮厤鐨勩傛墍浠ュ緢澶氫漢浼氭劅瑙塶io鐨勭綉緇滅紪紼嬬粨鏋勪笌闈瀗io鐨勭綉緇滅紪紼嬬粨鏋勫疄闄呮槸涓鏍風殑錛宎ccept鎹㈡垚浜唖elect錛岀洃鍚繛鎺ュ叆绔欑紪紼嬩簡鐩戝惉淇¢亾涓婃劅鍏磋叮鐨処/O浜嬩歡錛屼負浜嗘彁楂樼郴緇熺殑澶勭悊鑳藉姏錛岃繕鏄鍚姩寮傛鐨勭嚎紼嬫潵澶勭悊淇¢亾涓婄殑緗戠粶I/O浜嬩歡錛屽彧鏄叿浣撳疄鐜頒笉涓鏍瘋屽凡銆傝繖璇存槑nio騫舵病鏈夋敼鍙樻垜浠湇鍔$紼嬪簭緙栧啓鐨勬暣浣撶粨鏋勶紝鍙槸鍦╪io鐨勭幆澧冧笅錛屾垜浠殑紜彲浠ュ幓鎻愰珮緋葷粺鐨勬椿璺冩с佸搷搴旀у拰鍚炲悙閲忋俷io涓庨潪nio鍦ㄨ/鍐欑綉緇滄暟鎹互鍙婅繛鎺ュ緩绔嬬瓑緗戠粶鎿嶄綔涓婃槸娌℃湁澶氬ぇ鍖哄埆鐨勶紝榪欎簺鍥犵礌涓昏閮借繕鏄彇鍐充簬緗戠粶鐘跺喌銆佹搷浣滅郴緇熷崗璁爤瀹炵幇銆佸簲鐢ㄨ嚜韜鐞嗙綉緇滄暟鎹殑鏂瑰紡絳夊涓柟闈€傜敋鑷籌紝鎴戜滑鍦ㄤ韓鐢╪io鐨勫悓鏃跺湪涓瀹氱▼搴︿笂榪樹細澧炲ぇ浜嗙綉緇滅紪紼嬬殑澶嶆潅搴︼紝鍥犱負鏁版嵁鐨勮鍐欎互鍙婅繛鎺ョ殑寤虹珛絳夋搷浣滃彉寰楁洿鍔犱笉紜畾錛屽綋鐒舵渶緇堢綉緇滅紪紼嬬殑澶嶆潅榪樻槸鍙栧喅浜庡崗璁殑澶嶆潅搴︺?/p>
ThreadLocal寰堝鏄撹浣跨敤鑰呰瑙?浠ュ墠鎴戝氨璇В浜?錛屽洜涓哄湪榪欎釜綾諱腑瀹氫箟浜嗕竴涓潤鎬佺殑鍖呯駭鍙鐨勫唴閮ㄧ被ThreadLocalMap錛屽悓鏃禩hreadLocal瀵瑰鎻愪緵浜唃et鍜宻et鏂規硶銆傞偅涔坰et鐨勬椂鍊欏氨鏄妸褰撳墠綰跨▼瀵硅薄浣滀負ThreadLocalMap鐨刱ey錛屾妸浼犲叆set鏂規硶鐨勫間綔涓簐alue瀛樺偍璧鋒潵錛沢et鐨勬椂鍊欓氳繃鑾峰彇褰撳墠綰跨▼瀵硅薄錛岀劧鍚庡埌ThreadLocalMap涓彇寰楀搴旂殑value銆傝繖縐嶈璇嗘槸琛ㄩ潰鐨勫緢瀹規槗鐞嗚В鐨勬柟寮忥紝浣嗘槸涔熸槸閿欒鐨勭悊瑙c?/font>
姣忎釜Thread綾諱腑閮芥湁ThreadLocal.ThreadLocalMap鐨勪袱涓垚鍛橈紝鍒嗗埆鏄痶hreadlocals涓巌nheritableThreadLocals銆傚墠鑰呯敤鏉ュ瓨鍌ㄥ綋鍓嶇嚎紼嬬殑鐩稿叧鏁版嵁淇℃伅錛屽悗鑰呯敤鏉ュ瓨鍌ㄤ粠鐖剁嚎紼嬩腑緇ф壙鎴栬呰鎷瘋礉榪囨潵鐨勭浉鍏蟲暟鎹俊鎭傝繖涓や釜鍖哄煙涔熷氨鏄墠闈㈡彁鍒扮殑綰跨▼鐨勭壒鍒瓨鍌ㄥ尯鍩燂紝浣嗘槸濡備綍鎿嶄綔瀹冧滑錛烰DK涓殑璁捐騫朵笉鏄鐢ㄦ埛鐩存帴鎿嶄綔褰撳墠綰跨▼鏉ュ瓨鍙栨暟鎹紝鑰屾槸璁╃敤鎴鋒搷浣淭hreadLocal鏉ュ褰撳墠綰跨▼鐨勮繖涓や釜Map榪涜瀛樺彇(涓漢璁や負榪欐牱璁捐鏄嚭浜庡畨鍏ㄦт笌鏄撶敤鎬ц冭檻錛屼富瑕佹槸Map涓殑key鍊奸渶瑕佸浐瀹氭墠鑳藉彇鍒板悓涓瀵硅薄)錛屽悓鏃舵斁緗湪榪欎袱涓狹ap涓殑key鍊煎氨鏄疶hreadLocal瀵硅薄鑷韓錛寁alue鐢辯敤鎴蜂紶鍏ャ?/font>
ThreadLocal涓虹嚎紼嬬嫭鍗犳煇浜涘璞℃垨鑰呰祫婧愭彁渚涗簡鏂扮殑鎵嬫錛孴hreadLocal涓庣嚎紼嬪爢鏍堥兘鏄敤鏉ュ瓨鍙栫嚎紼嬬鏈夋暟鎹殑鍖哄煙錛屽埆鐨勭嚎紼嬫棤娉曡Е紕拌繖涓や釜鍖哄煙錛屼絾鏄簩鑰呯‘鏈変笉鍚岀殑鐢熷懡鍛ㄦ湡銆傝繖涓彲浠ヨ繖鏍風悊瑙o紝綰跨▼璺ㄥ涓柟娉曡皟鐢ㄧ殑鏃跺欙紝鏂規硶浣滀負Frame涓嶆柇鐨勮繘鏍堝拰鍑烘爤(鏂規硶鐨勮皟鐢ㄤ笌榪斿洖)錛屽悓鏃跺嚭鏍堢殑鏃跺欐柟娉曚腑鐨勪復鏃跺彉閲忔暟鎹細琚洖鏀訛紝鍦ㄨ繖涓嚎紼嬬殑鍫嗘爤涓秷澶憋紝鎵浠ユ柟娉曚腑鐨勫眬閮ㄥ彉閲忔槸鏃犳硶鍦ㄧ嚎紼嬭皟鐢ㄨ繃紼嬩腑絀塊忥紝闄ら潪鏄紶閫掑眬閮ㄧ殑寮曠敤綾誨瀷鍙橀噺錛屼絾鏄繖涔熸剰鍛崇潃鏂規硶鎺ュ彛閮借棰濆鎺ユ敹鏂扮殑鍙傛暟(鏃╂湡緋葷粺涓紶閫扟DBC鏁版嵁搴撹繛鎺ョ殑鏂瑰紡)銆傝孴hreadLocal涓嶅悓錛屽噯紜湴璇存槸綰跨▼涓殑ThreadLocalMap涓嶅悓錛岀嚎紼嬪璞′腑鐨凾hreadLocalMap瀵硅薄鏄即闅忔暣涓嚎紼嬪璞$敓鍛藉懆鏈熺殑錛岀嚎紼嬪彲浠ュ湪浠諱綍闇瑕佺殑鏃跺欓氳繃瀹冩潵鑾峰彇鐩稿叧鏁版嵁錛岃繖涓虹嚎紼嬬嫭鍗犳暟鎹彁渚涗簡涓縐嶆洿鍔犱紭闆呯殑鏂瑰紡銆傚彧涓嶈繃榪欎竴鍒囬兘鏄氳繃ThreadLocal鏉ユ搷浣滅殑鑰屽凡錛屽悓鏃禩hreadLocal鑷韓涔熶綔涓轟笉鍚岀嚎紼嬩腑鐨凾hreadLocalMap涓殑key鏉ユ槧灝勫瓨鍏ョ殑value銆?br />
public class ThreadWriter
{
private static final ThreadLocal<FileWriter> local = new
ThreadLocal<FileWriter>();
public void write(String s)
{
try
{
getFileWriter().write(s);
}
catch(IOException e)
{
//igore
}
}
private FileWriter getFileWriter()
{
FileWriter fw = local.get();
if (null == fw)
{
try
{
fw = new FileWriter(Thread.currentThread().getName() + "-info.txt", true);
local.set(fw);
}
catch(IOException e)
{
//igore
}
}
return fw;
}
} 榪欓噷璇存槑鍑犱釜闂錛?/font>
1銆?nbsp;ThreadLocal瀵硅薄鍙湁涓浠斤紝瀹冨皢浣滀負涓嶅悓綰跨▼涓殑ThreadLocalMap瀵硅薄鐨刱ey錛屾墍鏄犲皠鐨勫兼槸涓嶅悓鏂囦歡璺緞鐨凢ileWriter瀵硅薄銆傚彧涓嶈繃涓嶅悓 綰跨▼涓殑ThreadLocalMap涓殑key鍊奸兘涓鏍鳳紝浣嗘槸鍥犱負鍦ㄤ笉鍚岀殑ThreadLocalMap涓紝涓嶄細鏈変換浣曞獎鍝嶏紝鍙嶈岃繖鏍風殑鏂瑰紡涓烘瘡涓嚎紼嬩腑ThreadLocalMap瀵硅薄涓殑key鍊肩敓鎴愮渷鍘諱簡寰堝鍔熷か錛岃繖鏄竴涓緢綺懼鐨勮璁★紝鐢ㄦ埛鍦ㄩ棿鎺ヤ嬌鐢═hreadLocalMap鐨勬椂鍊欙紝涓嶉渶瑕佹劅鐭ey鏄粈涔堬紝灝卞彲浠ユ柟渚垮湴瀛樺彇銆?/font>
2銆?nbsp;涓浠絋hreadLocal瀵硅薄鍙兘鏄犲皠涓縐嶈祫婧愩傚闇瑕佹槧灝勫縐嶈祫婧愮殑璇濓紝瀹氫箟澶氫釜ThreadLocal鎴愬憳銆?/font>
3銆?local.set(fw); 榪欏彞浠g爜琛ㄧず灝唋ocal鑷韓浣滀負key錛宖w浣滀負value錛屽瓨鍌ㄥ湪璋冪敤榪欒浠g爜鐨勭嚎紼嬩腑鐨凾hreadLocalMap瀵硅薄涓?/font>
FileWriter fw = local.get(); 榪欏彞浠g爜琛ㄧず灝唋ocal鑷韓浣滀負key錛屼粠褰撳墠綰跨▼鐨凾hreadLocalMap瀵硅薄涓彇鍑哄睘浜庤嚜宸辯嫭鍗犵殑FileWriter瀵硅薄銆?/font>
ThreadLocal 榪涢樁
ThreadLocal 搴旂敤
]]>