锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
=TEXT((C4/1000+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss")
鍏朵腑C4鍗曞厓鏍兼墍瀛樼殑鏁版嵁涓簃s鍥犳闇瑕侀櫎浠?000
杞崲鍚庣殑緇撴灉濡備笅錛?/p>
1. 鍓嶈█
鍗曚緥(Singleton)搴旇鏄紑鍙戣呬滑鏈鐔熸倝鐨勮璁℃ā寮忎簡錛屽茍涓斿ソ鍍忎篃鏄渶瀹規槗瀹炵幇鐨?#8212;—鍩烘湰涓婃瘡涓紑鍙戣呴兘鑳藉闅忔墜鍐欏嚭——浣嗘槸錛岀湡鐨勬槸榪欐牱鍚楋紵
浣滀負涓涓狫ava寮鍙戣咃紝涔熻浣犺寰楄嚜宸卞鍗曚緥妯″紡鐨勪簡瑙e凡緇忚凍澶熷浜嗐傛垜騫朵笉鎯沖嵄璦鑰稿惉璇翠竴瀹氳繕鏈変綘涓嶇煡閬撶殑——姣曠珶鎴戣嚜宸辯殑浜嗚В涔熺殑紜湁闄愶紝浣嗙┒绔熶綘鑷繁浜嗚В鐨勭▼搴﹀埌搴曟庢牱鍛紵寰涓嬬湅錛屾垜浠竴璧鋒潵鑱婅亰鐪媬
2. 浠涔堟槸鍗曚緥錛?/p>
鍗曚緥瀵硅薄鐨勭被蹇呴』淇濊瘉鍙湁涓涓疄渚嬪瓨鍦?#8212;—榪欐槸緇村熀鐧劇涓婂鍗曚緥鐨勫畾涔夛紝榪欎篃鍙互浣滀負瀵規剰鍥懼疄鐜板崟渚嬫ā寮忕殑浠g爜榪涜媯楠岀殑鏍囧噯銆?/p>
瀵瑰崟渚嬬殑瀹炵幇鍙互鍒嗕負涓ゅぇ綾?#8212;—鎳掓眽寮忓拰楗挎眽寮忥紝浠栦滑鐨勫尯鍒湪浜庯細
鎳掓眽寮忥細鎸囧叏灞鐨勫崟渚嬪疄渚嬪湪絎竴嬈¤浣跨敤鏃舵瀯寤恒?/p>
楗挎眽寮忥細鎸囧叏灞鐨勫崟渚嬪疄渚嬪湪綾昏杞芥椂鏋勫緩銆?/p>
浠庡畠浠殑鍖哄埆涔熻兘鐪嬪嚭鏉ワ紝鏃ュ父鎴戜滑浣跨敤鐨勮緝澶氱殑搴旇鏄噿姹夊紡鐨勫崟渚嬶紝姣曠珶鎸夐渶鍔犺澆鎵嶈兘鍋氬埌璧勬簮鐨勬渶澶у寲鍒╃敤鍢泘
3. 鎳掓眽寮忓崟渚?/p>
鍏堟潵鐪嬩竴涓嬫噿姹夊紡鍗曚緥鐨勫疄鐜版柟寮忋?/p>
3.1 綆鍗曠増鏈?/p>
鐪嬫渶綆鍗曠殑鍐欐硶Version 1錛?/p>
// Version 1 public class Single1 { private static Single1 instance; public static Single1 getInstance() { if (instance == null) { instance = new Single1(); } return instance; } }
鎴栬呭啀榪涗竴姝ワ紝鎶婃瀯閫犲櫒鏀逛負縐佹湁鐨勶紝榪欐牱鑳藉闃叉琚閮ㄧ殑綾昏皟鐢ㄣ?/p>
// Version 1.1 public class Single1 { private static Single1 instance; private Single1() {} public static Single1 getInstance() { if (instance == null) { instance = new Single1(); } return instance; } }
鎴戜豢浣涜寰楀綋鍒濆鏍$殑鏁欑涔﹀氨鏄繖涔堟暀鐨勶紵—— 姣忔鑾峰彇instance涔嬪墠鍏堣繘琛屽垽鏂紝濡傛灉instance涓虹┖灝眓ew涓涓嚭鏉ワ紝鍚﹀垯灝辯洿鎺ヨ繑鍥炲凡瀛樺湪鐨刬nstance銆?/p>
榪欑鍐欐硶鍦ㄥぇ澶氭暟鐨勬椂鍊欎篃鏄病闂鐨勩傞棶棰樺湪浜庯紝褰撳綰跨▼宸ヤ綔鐨勬椂鍊欙紝濡傛灉鏈夊涓嚎紼嬪悓鏃惰繍琛屽埌if (instance == null)錛岄兘鍒ゆ柇涓簄ull錛岄偅涔堜袱涓嚎紼嬪氨鍚勮嚜浼氬垱寤轟竴涓疄渚?#8212;—榪欐牱涓鏉ワ紝灝變笉鏄崟渚嬩簡銆?/p>
3.2 synchronized鐗堟湰
閭f棦鐒跺彲鑳戒細鍥犱負澶氱嚎紼嬪鑷撮棶棰橈紝閭d箞鍔犱笂涓涓悓姝ラ攣鍚э紒
淇敼鍚庣殑浠g爜濡備笅錛岀浉瀵逛簬Version1.1錛屽彧鏄湪鏂規硶絳懼悕涓婂鍔犱簡涓涓猻ynchronized錛?/p>
// Version 2 public class Single2 { private static Single2 instance; private Single2() {} public static synchronized Single2 getInstance() { if (instance == null) { instance = new Single2(); } return instance; } }
OK錛屽姞涓妔ynchronized鍏抽敭瀛椾箣鍚庯紝getInstance鏂規硶灝變細閿佷笂浜嗐傚鏋滄湁涓や釜綰跨▼錛圱1銆乀2錛夊悓鏃舵墽琛屽埌榪欎釜鏂規硶鏃訛紝浼氭湁鍏朵腑涓涓嚎紼婽1鑾峰緱鍚屾閿侊紝寰椾互緇х畫鎵ц錛岃屽彟涓涓嚎紼婽2鍒欓渶瑕佺瓑寰咃紝褰撶T1鎵ц瀹屾瘯getInstance涔嬪悗錛堝畬鎴愪簡null鍒ゆ柇銆佸璞″垱寤恒佽幏寰楄繑鍥炲間箣鍚庯級錛孴2綰跨▼鎵嶄細鎵ц鎵ц銆?#8212;—鎵浠ヨ繖绔唬鐮佷篃灝遍伩鍏嶄簡Version1涓紝鍙兘鍑虹幇鍥犱負澶氱嚎紼嬪鑷村涓疄渚嬬殑鎯呭喌銆?/p>
浣嗘槸錛岃繖縐嶅啓娉曚篃鏈変竴涓棶棰橈細緇檊itInstance鏂規硶鍔犻攣錛岃櫧鐒朵細閬垮厤浜嗗彲鑳戒細鍑虹幇鐨勫涓疄渚嬮棶棰橈紝浣嗘槸浼氬己鍒墮櫎T1涔嬪鐨勬墍鏈夌嚎紼嬬瓑寰咃紝瀹為檯涓婁細瀵圭▼搴忕殑鎵ц鏁堢巼閫犳垚璐熼潰褰卞搷銆?/p>
3.3 鍙岄噸媯鏌ワ紙Double-Check錛夌増鏈?/p>
Version2浠g爜鐩稿浜嶸ersion1d浠g爜鐨勬晥鐜囬棶棰橈紝鍏跺疄鏄負浜嗚В鍐?%鍑犵巼鐨勯棶棰橈紝鑰屼嬌鐢ㄤ簡涓涓?00%鍑虹幇鐨勯槻鎶ょ浘銆傞偅鏈変竴涓紭鍖栫殑鎬濊礬錛屽氨鏄妸100%鍑虹幇鐨勯槻鎶ょ浘錛屼篃鏀逛負1%鐨勫嚑鐜囧嚭鐜幫紝浣夸箣鍙嚭鐜板湪鍙兘浼氬鑷村涓疄渚嬪嚭鐜扮殑鍦版柟銆?/p>
——鏈夋病鏈夎繖鏍風殑鏂規硶鍛紵褰撶劧鏄湁鐨勶紝鏀硅繘鍚庣殑浠g爜Vsersion3濡備笅錛?/p>
// Version 3 public class Single3 { private static Single3 instance; private Single3() {} public static Single3 getInstance() { if (instance == null) { synchronized (Single3.class) { if (instance == null) { instance = new Single3(); } } } return instance; } }
榪欎釜鐗堟湰鐨勪唬鐮佺湅璧鋒潵鏈夌偣澶嶆潅錛屾敞鎰忓叾涓湁涓ゆif (instance == null)鐨勫垽鏂紝榪欎釜鍙仛銆庡弻閲嶆鏌?Double-Check銆忋?/p>
絎竴涓猧f (instance == null)錛屽叾瀹炴槸涓轟簡瑙e喅Version2涓殑鏁堢巼闂錛屽彧鏈塱nstance涓簄ull鐨勬椂鍊欙紝鎵嶈繘鍏ynchronized鐨勪唬鐮佹——澶уぇ鍑忓皯浜嗗嚑鐜囥?/p>
絎簩涓猧f (instance == null)錛屽垯鏄窡Version2涓鏍鳳紝鏄負浜嗛槻姝㈠彲鑳藉嚭鐜板涓疄渚嬬殑鎯呭喌銆?/p>
—— 榪欐浠g爜鐪嬭搗鏉ュ凡緇忓畬緹庢棤鐟曚簡銆?/p>
……
……
……
—— 褰撶劧錛屽彧鏄庣湅璧鋒潵銆忥紝榪樻槸鏈夊皬姒傜巼鍑虹幇闂鐨勩?/p>
榪欏紕娓呮涓轟粈涔堣繖閲屽彲鑳藉嚭鐜伴棶棰橈紝棣栧厛錛屾垜浠渶瑕佸紕娓呮鍑犱釜姒傚康錛氬師瀛愭搷浣溿佹寚浠ら噸鎺掋?/p>
鐭ヨ瘑鐐癸細浠涔堟槸鍘熷瓙鎿嶄綔錛?/p>
綆鍗曟潵璇達紝鍘熷瓙鎿嶄綔錛坅tomic錛夊氨鏄笉鍙垎鍓茬殑鎿嶄綔錛屽湪璁$畻鏈轟腑錛屽氨鏄寚涓嶄細鍥犱負綰跨▼璋冨害琚墦鏂殑鎿嶄綔銆?/p>
姣斿錛岀畝鍗曠殑璧嬪兼槸涓涓師瀛愭搷浣滐細
m = 6; // 榪欐槸涓師瀛愭搷浣?/span>
鍋囧m鍘熷厛鐨勫間負0錛岄偅涔堝浜庤繖涓搷浣滐紝瑕佷箞鎵ц鎴愬姛m鍙樻垚浜?錛岃涔堟槸娌℃墽琛宮榪樻槸0錛岃屼笉浼氬嚭鐜拌濡俶=3榪欑涓棿鎬?#8212;—鍗充嬌鏄湪騫跺彂鐨勭嚎紼嬩腑銆?/p>
鑰岋紝澹版槑騫惰祴鍊煎氨涓嶆槸涓涓師瀛愭搷浣滐細
int n = 6; // 榪欎笉鏄竴涓師瀛愭搷浣?/span>
瀵逛簬榪欎釜璇彞錛岃嚦灝戞湁涓や釜鎿嶄綔錛?/p>
①澹版槑涓涓彉閲弉
②緇檔璧嬪間負6
——榪欐牱灝變細鏈変竴涓腑闂寸姸鎬侊細鍙橀噺n宸茬粡琚0鏄庝簡浣嗘槸榪樻病鏈夎璧嬪肩殑鐘舵併?/p>
——榪欐牱錛屽湪澶氱嚎紼嬩腑錛岀敱浜庣嚎紼嬫墽琛岄『搴忕殑涓嶇‘瀹氭э紝濡傛灉涓や釜綰跨▼閮戒嬌鐢╩錛屽氨鍙兘浼氬鑷翠笉紼沖畾鐨勭粨鏋滃嚭鐜般?/p>
鐭ヨ瘑鐐癸細浠涔堟槸鎸囦護閲嶆帓錛?/p>
綆鍗曟潵璇達紝灝辨槸璁$畻鏈轟負浜嗘彁楂樻墽琛屾晥鐜囷紝浼氬仛鐨勪竴浜涗紭鍖栵紝鍦ㄤ笉褰卞搷鏈緇堢粨鏋滅殑鎯呭喌涓嬶紝鍙兘浼氬涓浜涜鍙ョ殑鎵ц欏哄簭榪涜璋冩暣銆?/p>
姣斿錛岃繖涓孌典唬鐮侊細
姝e父鏉ヨ錛屽浜庨『搴忕粨鏋勶紝鎵ц鐨勯『搴忔槸鑷笂鍒頒笅錛屼篃鍗?234銆?/p>
浣嗘槸錛岀敱浜庢寚浠ら噸鎺掔殑鍘熷洜錛屽洜涓轟笉褰卞搷鏈緇堢殑緇撴灉錛屾墍浠ワ紝瀹為檯鎵ц鐨勯『搴忓彲鑳戒細鍙樻垚3124鎴栬?324銆?/p>
鐢變簬璇彞3鍜?娌℃湁鍘熷瓙鎬х殑闂錛岃鍙?鍜岃鍙?涔熷彲鑳戒細鎷嗗垎鎴愬師瀛愭搷浣滐紝鍐嶉噸鎺掋?/p>
——涔熷氨鏄錛屽浜庨潪鍘熷瓙鎬х殑鎿嶄綔錛屽湪涓嶅獎鍝嶆渶緇堢粨鏋滅殑鎯呭喌涓嬶紝鍏舵媶鍒嗘垚鐨勫師瀛愭搷浣滃彲鑳戒細琚噸鏂版帓鍒楁墽琛岄『搴忋?/p>
OK錛屼簡瑙d簡鍘熷瓙鎿嶄綔鍜屾寚浠ら噸鎺掔殑姒傚康涔嬪悗錛屾垜浠啀緇х畫鐪媀ersion3浠g爜鐨勯棶棰樸?/p>
涓嬮潰榪欐璇濈洿鎺ヤ粠闄堢殦鐨勬枃绔?娣卞叆嫻呭嚭鍗曞疄渚婼INGLETON璁捐妯″紡)涓鍒惰屾潵錛?/p>
涓昏鍦ㄤ簬singleton = new Singleton()榪欏彞錛岃繖騫墮潪鏄竴涓師瀛愭搷浣滐紝浜嬪疄涓婂湪 JVM 涓繖鍙ヨ瘽澶ф鍋氫簡涓嬮潰 3 浠朵簨鎯呫?/p>
1. 緇?singleton 鍒嗛厤鍐呭瓨
2. 璋冪敤 Singleton 鐨勬瀯閫犲嚱鏁版潵鍒濆鍖栨垚鍛樺彉閲忥紝褰㈡垚瀹炰緥
3. 灝唖ingleton瀵硅薄鎸囧悜鍒嗛厤鐨勫唴瀛樼┖闂達紙鎵ц瀹岃繖姝?singleton鎵嶆槸闈?null 浜嗭級
浣嗘槸鍦?JVM 鐨勫嵆鏃剁紪璇戝櫒涓瓨鍦ㄦ寚浠ら噸鎺掑簭鐨勪紭鍖栥備篃灝辨槸璇翠笂闈㈢殑絎簩姝ュ拰絎笁姝ョ殑欏哄簭鏄笉鑳戒繚璇佺殑錛屾渶緇堢殑鎵ц欏哄簭鍙兘鏄?1-2-3 涔熷彲鑳芥槸 1-3-2銆傚鏋滄槸鍚庤咃紝鍒欏湪 3 鎵ц瀹屾瘯銆? 鏈墽琛屼箣鍓嶏紝琚嚎紼嬩簩鎶㈠崰浜嗭紝榪欐椂 instance 宸茬粡鏄潪 null 浜嗭紙浣嗗嵈娌℃湁鍒濆鍖栵級錛屾墍浠ョ嚎紼嬩簩浼氱洿鎺ヨ繑鍥?instance錛岀劧鍚庝嬌鐢紝鐒跺悗欏虹悊鎴愮珷鍦版姤閿欍?/p>
鍐嶇◢寰В閲婁竴涓嬶紝灝辨槸璇達紝鐢變簬鏈変竴涓巌nstance宸茬粡涓嶄負null浣嗘槸浠嶆病鏈夊畬鎴愬垵濮嬪寲銆忕殑涓棿鐘舵侊紝鑰岃繖涓椂鍊欙紝濡傛灉鏈夊叾浠栫嚎紼嬪垰濂借繍琛屽埌絎竴灞俰f (instance == null)榪欓噷錛岃繖閲岃鍙栧埌鐨刬nstance宸茬粡涓嶄負null浜嗭紝鎵浠ュ氨鐩存帴鎶婅繖涓腑闂寸姸鎬佺殑instance鎷垮幓鐢ㄤ簡錛屽氨浼氫駭鐢熼棶棰樸?/p>
榪欓噷鐨勫叧閿湪浜?#8212;—綰跨▼T1瀵筰nstance鐨勫啓鎿嶄綔娌℃湁瀹屾垚錛岀嚎紼婽2灝辨墽琛屼簡璇繪搷浣溿?/p>
3.4 緇堟瀬鐗堟湰錛歷olatile
瀵逛簬Version3涓彲鑳藉嚭鐜扮殑闂錛堝綋鐒惰繖縐嶆鐜囧凡緇忛潪甯稿皬浜嗭紝浣嗘瘯绔熻繕鏄湁鐨勫槢~錛夛紝瑙e喅鏂規鏄細鍙渶瑕佺粰instance鐨勫0鏄庡姞涓妚olatile鍏抽敭瀛楀嵆鍙紝Version4鐗堟湰錛?/p>
// Version 4 public class Single4 { private static volatile Single4 instance; private Single4() {} public static Single4 getInstance() { if (instance == null) { synchronized (Single4.class) { if (instance == null) { instance = new Single4(); } } } return instance; } }
volatile鍏抽敭瀛楃殑涓涓綔鐢ㄦ槸紱佹鎸囦護閲嶆帓錛屾妸instance澹版槑涓簐olatile涔嬪悗錛屽瀹冪殑鍐欐搷浣滃氨浼氭湁涓涓唴瀛樺睆闅滐紙浠涔堟槸鍐呭瓨灞忛殰錛燂級錛岃繖鏍鳳紝鍦ㄥ畠鐨勮祴鍊煎畬鎴愪箣鍓嶏紝灝變笉鐢ㄤ細璋冪敤璇繪搷浣溿?/p>
娉ㄦ剰錛歷olatile闃繪鐨勪笉singleton = new Singleton()榪欏彞璇濆唴閮╗1-2-3]鐨勬寚浠ら噸鎺掞紝鑰屾槸淇濊瘉浜嗗湪涓涓啓鎿嶄綔錛圼1-2-3]錛夊畬鎴愪箣鍓嶏紝涓嶄細璋冪敤璇繪搷浣滐紙if (instance == null)錛夈?/p>
——涔熷氨褰誨簳闃叉浜哣ersion3涓殑闂鍙戠敓銆?/p>
——濂戒簡錛岀幇鍦ㄥ交搴曟病浠涔堥棶棰樹簡鍚э紵
……
……
……
濂戒簡錛屽埆绱у紶錛岀殑紜病闂浜嗐傚ぇ鍚嶉紟榧庣殑EventBus涓紝鍏跺叆鍙f柟娉旹ventBus.getDefault()灝辨槸鐢ㄨ繖縐嶆柟娉曟潵瀹炵幇鐨勩?/p>
……
……
……
涓嶈繃錛岄潪瑕佹寫鐐瑰埡鐨勮瘽榪樻槸鑳芥寫鍑烘潵鐨勶紝灝辨槸榪欎釜鍐欐硶鏈変簺澶嶆潅浜嗭紝涓嶅浼橀泤銆佺畝媧併?/p>
4. 楗挎眽寮忓崟渚?/p>
涓嬮潰鍐嶈亰浜嗚В涓涓嬮タ姹夊紡鐨勫崟渚嬨?/p>
濡備笂鎵璇達紝楗挎眽寮忓崟渚嬫槸鎸囷細鎸囧叏灞鐨勫崟渚嬪疄渚嬪湪綾昏杞芥椂鏋勫緩鐨勫疄鐜版柟寮忋?/p>
鐢變簬綾昏杞界殑榪囩▼鏄敱綾誨姞杞藉櫒錛圕lassLoader錛夋潵鎵ц鐨勶紝榪欎釜榪囩▼涔熸槸鐢盝VM鏉ヤ繚璇佸悓姝ョ殑錛屾墍浠ヨ繖縐嶆柟寮忓厛澶╁氨鏈変竴涓紭鍔?#8212;—鑳藉鍏嶇柅璁稿鐢卞綰跨▼寮曡搗鐨勯棶棰樸?/p>
4.1 楗挎眽寮忓崟渚嬬殑瀹炵幇鏂瑰紡
楗挎眽寮忓崟渚嬬殑瀹炵幇濡備笅錛?/p>
//楗挎眽寮忓疄鐜?/span> public class SingleB { private static final SingleB INSTANCE = new SingleB(); private SingleB() {} public static SingleB getInstance() { return INSTANCE; } }
瀵逛簬涓涓タ姹夊紡鍗曚緥鐨勫啓娉曟潵璇達紝瀹冨熀鏈笂鏄畬緹庣殑浜嗐?/p>
鎵浠ュ畠鐨勭己鐐逛篃灝卞彧鏄タ姹夊紡鍗曚緥鏈韓鐨勭己鐐規墍鍦ㄤ簡——鐢變簬INSTANCE鐨勫垵濮嬪寲鏄湪綾誨姞杞芥椂榪涜鐨勶紝鑰岀被鐨勫姞杞芥槸鐢盋lassLoader鏉ュ仛鐨勶紝鎵浠ュ紑鍙戣呮湰鏉ュ浜庡畠鍒濆鍖栫殑鏃舵満灝卞緢闅懼幓鍑嗙‘鎶婃彙錛?/p>
鍙兘鐢變簬鍒濆鍖栫殑澶棭錛岄犳垚璧勬簮鐨勬氮璐?/p>
濡傛灉鍒濆鍖栨湰韜緷璧栦簬涓浜涘叾浠栨暟鎹紝閭d箞涔熷氨寰堥毦淇濊瘉鍏朵粬鏁版嵁浼氬湪瀹冨垵濮嬪寲涔嬪墠鍑嗗濂姐?/p>
褰撶劧錛屽鏋滄墍闇鐨勫崟渚嬪崰鐢ㄧ殑璧勬簮寰堝皯錛屽茍涓斾篃涓嶄緷璧栦簬鍏朵粬鏁版嵁錛岄偅涔堣繖縐嶅疄鐜版柟寮忎篃鏄緢濂界殑銆?/p>
鐭ヨ瘑鐐癸細浠涔堟椂鍊欐槸綾昏杞芥椂錛?/p>
鍓嶉潰鎻愬埌浜嗗崟渚嬪湪綾昏杞芥椂琚疄渚嬪寲錛岄偅絀剁珶浠涔堟椂鍊欐墠鏄庣被瑁呰澆鏃躲忓憿錛?/p>
涓嶄弗鏍肩殑璇達紝澶ц嚧鏈夎繖涔堝嚑涓潯浠朵細瑙﹀彂涓涓被琚姞杞斤細
1. new涓涓璞℃椂
2. 浣跨敤鍙嶅皠鍒涘緩瀹冪殑瀹炰緥鏃?/p>
3. 瀛愮被琚姞杞芥椂錛屽鏋滅埗綾昏繕娌¤鍔犺澆錛屽氨鍏堝姞杞界埗綾?/p>
4. jvm鍚姩鏃舵墽琛岀殑涓葷被浼氶鍏堣鍔犺澆
5. 涓浜涘叾浠栫殑瀹炵幇鏂瑰紡
5.1 Effective Java 1 —— 闈欐佸唴閮ㄧ被
銆奅ffective Java銆嬩竴涔︾殑絎竴鐗堜腑鎺ㄨ崘浜嗕竴涓腑鍐欐硶錛?/p>
// Effective Java 絎竴鐗堟帹鑽愬啓娉?/span> public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
榪欑鍐欐硶闈炲父宸у錛?/p>
瀵逛簬鍐呴儴綾籗ingletonHolder錛屽畠鏄竴涓タ姹夊紡鐨勫崟渚嬪疄鐜幫紝鍦⊿ingletonHolder鍒濆鍖栫殑鏃跺欎細鐢盋lassLoader鏉ヤ繚璇佸悓姝ワ紝浣縄NSTANCE鏄竴涓湡·鍗曚緥銆?/p>
鍚屾椂錛岀敱浜嶴ingletonHolder鏄竴涓唴閮ㄧ被錛屽彧鍦ㄥ閮ㄧ被鐨凷ingleton鐨刧etInstance()涓浣跨敤錛屾墍浠ュ畠琚姞杞界殑鏃舵満涔熷氨鏄湪getInstance()鏂規硶絎竴嬈¤璋冪敤鐨勬椂鍊欍?/p>
——瀹冨埄鐢ㄤ簡ClassLoader鏉ヤ繚璇佷簡鍚屾錛屽悓鏃跺張鑳借寮鍙戣呮帶鍒剁被鍔犺澆鐨勬椂鏈恒備粠鍐呴儴鐪嬫槸涓涓タ姹夊紡鐨勫崟渚嬶紝浣嗘槸浠庡閮ㄧ湅鏉ワ紝鍙堢殑紜槸鎳掓眽寮忕殑瀹炵幇銆?/p>
綆鐩存槸紲炰箮鍏舵妧銆?/p>
5.2 Effective Java 2 —— 鏋氫婦
浣犱互涓哄埌榪欏氨綆楀畬浜嗭紵涓嶏紝騫舵病鏈夛紝鍥犱負鍘夊鐨勫ぇ紲炲張鍙戠幇浜嗗叾浠栫殑鏂規硶銆?/p>
銆奅ffective Java銆嬬殑浣滆呭湪榪欐湰涔︾殑絎簩鐗堝張鎺ㄨ崘浜嗗彟澶栦竴縐嶆柟娉曪紝鏉ョ洿鎺ョ湅浠g爜錛?/p>
// Effective Java 絎簩鐗堟帹鑽愬啓娉?/span> public enum SingleInstance { INSTANCE; public void fun1() { // do something } } // 浣跨敤 SingleInstance.INSTANCE.fun1();
鐪嬪埌浜嗕箞錛熻繖鏄竴涓灇涓劇被鍨?#8230;…榪瀋lass閮戒笉鐢ㄤ簡錛屾瀬綆銆?/p>
鐢變簬鍒涘緩鏋氫婦瀹炰緥鐨勮繃紼嬫槸綰跨▼瀹夊叏鐨勶紝鎵浠ヨ繖縐嶅啓娉曚篃娌℃湁鍚屾鐨勯棶棰樸?/p>
浣滆呭榪欎釜鏂規硶鐨勮瘎浠鳳細
榪欑鍐欐硶鍦ㄥ姛鑳戒笂涓庡叡鏈夊煙鏂規硶鐩歌繎錛屼絾鏄畠鏇寸畝媧侊紝鏃犲伩鍦版彁渚涗簡搴忓垪鍖栨満鍒訛紝緇濆闃叉瀵規瀹炰緥鍖栵紝鍗充嬌鏄湪闈㈠澶嶆潅鐨勫簭鍒楀寲鎴栬呭弽灝勬敾鍑葷殑鏃跺欍傝櫧鐒惰繖涓柟娉曡繕娌℃湁騫挎硾閲囩敤錛屼絾鏄崟鍏冪礌鐨勬灇涓劇被鍨嬪凡緇忔垚涓哄疄鐜癝ingleton鐨勬渶浣蟲柟娉曘?/p>
鏋氫婦鍗曚緥榪欑鏂規硶闂笘涓浜涳紝璁稿鍒嗘瀽鏂囩珷閮界О瀹冩槸瀹炵幇鍗曚緥鐨勬渶瀹岀編鏂規硶——鍐欐硶瓚呯駭綆鍗曪紝鑰屼笖鍙堣兘瑙e喅澶ч儴鍒嗙殑闂銆?/p>
涓嶈繃鎴戜釜浜鴻涓鴻繖縐嶆柟娉曡櫧鐒跺緢浼樼錛屼絾鏄畠浠嶇劧涓嶆槸瀹岀編鐨?#8212;—姣斿錛屽湪闇瑕佺戶鎵跨殑鍦烘櫙錛屽畠灝變笉閫傜敤浜嗐?/p>
6. 鎬葷粨
OK錛岀湅鍒拌繖閲岋紝浣犺繕浼氳寰楀崟渚嬫ā寮忔槸鏈綆鍗曠殑璁捐妯″紡浜嗕箞錛熷啀鍥炲ご鐪嬩竴涓嬩綘涔嬪墠浠g爜涓殑鍗曚緥瀹炵幇錛岃寰楁槸鏃犳噲鍙嚮鐨勪箞錛?/p>
鍙兘鎴戜滑鍦ㄥ疄闄呯殑寮鍙戜腑錛屽鍗曚緥鐨勫疄鐜板茍娌℃湁閭d箞涓ユ牸鐨勮姹傘傛瘮濡傦紝鎴戝鏋滆兘淇濊瘉鎵鏈夌殑getInstance閮芥槸鍦ㄤ竴涓嚎紼嬬殑璇濓紝閭e叾瀹炵涓縐嶆渶綆鍗曠殑鏁欑涔︽柟寮忓氨澶熺敤浜嗐傚啀姣斿錛屾湁鏃跺欙紝鎴戠殑鍗曚緥鍙樻垚浜嗗渚嬩篃鍙兘瀵圭▼搴忔病浠涔堝お澶у獎鍝?#8230;…
浣嗘槸錛屽鏋滄垜浠兘浜嗚В鏇村鍏朵腑鐨勭粏鑺傦紝閭d箞濡傛灉鍝ぉ紼嬪簭鍑轟簡浜涢棶棰橈紝鎴戜滑璧風爜鑳藉涓涓帓鏌ラ棶棰樼殑鐐廣傛棭鐐硅В鍐抽棶棰橈紝灝辮兘鏃╃偣鍥炲鍚冮キ……
—— 榪樻湁錛屽畬緹庣殑鏂規鏄笉瀛樺湪錛屼換浣曟柟寮忛兘浼氭湁涓涓庡害銆忕殑闂銆傛瘮濡傦紝浣犵殑瑙夊緱浠g爜宸茬粡鏃犳噲鍙嚮浜嗭紝浣嗘槸鍥犱負浣犵敤鐨勬槸JAVA璇█錛屽彲鑳紺lassLoader鏈変簺BUG鍟?#8230;…浣犵殑浠g爜璋佽繍琛屽湪JVM涓婄殑錛屽彲鑳絁VM鏈韓鏈塀UG鍟?#8230;…浣犵殑浠g爜榪愯鍦ㄦ墜鏈轟笂錛屽彲鑳芥墜鏈虹郴緇熸湁闂鍟?#8230;…浣犵敓媧誨湪榪欎釜瀹囧畽閲岋紝鍙兘瀹囧畽鏈韓鏈変簺BUG鍟?#8230;…
鎵浠ワ紝灝藉姏鍋氬埌鑳藉仛鍒扮殑鏈濂藉氨琛屼簡銆?/p>
—— 鎰熻阿浣犺姳璐逛簡涓嶅皯鏃墮棿鐪嬪埌榪欓噷錛屼絾鎰夸綘娌℃湁瑙夊緱铏氬害銆?/p>
浣跨敤@RequestParam鏃訛紝URL鏄繖鏍風殑錛歨ttp://host:port/path?鍙傛暟鍚?鍙傛暟鍊?br style="margin: 0px; padding: 0px;" />
浣跨敤@PathVariable鏃訛紝URL鏄繖鏍風殑錛歨ttp://host:port/path/鍙傛暟鍊?br style="margin: 0px; padding: 0px;" />
渚嬪錛?/p>
涓婇潰涓や釜鏂規硶錛岃闂礬寰勫垎鍒涓嬶細
浠g爜濡備笅錛?/p>
public Map<Long, String> getIdNameMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername)); }
浠g爜濡備笅錛?/p>
public Map<Long, Account> getIdAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account)); }
account -> account鏄竴涓繑鍥炴湰韜殑lambda琛ㄨ揪寮忥紝鍏跺疄榪樺彲浠ヤ嬌鐢‵unction鎺ュ彛涓殑涓涓粯璁ゆ柟娉曚唬鏇匡紝浣挎暣涓柟娉曟洿綆媧佷紭闆咃細
public Map<Long, Account> getIdAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity())); }
浠g爜濡備笅錛?/p>
public Map<String, Account> getNameAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity())); }
榪欎釜鏂規硶鍙兘鎶ラ敊錛?strong style="margin: 0px; padding: 0px;">java.lang.IllegalStateException: Duplicate key錛夛紝鍥犱負name鏄湁鍙兘閲嶅鐨勩?strong style="margin: 0px; padding: 0px;">toMap鏈変釜閲嶈澆鏂規硶錛屽彲浠ヤ紶鍏ヤ竴涓悎騫剁殑鍑芥暟鏉ヨВ鍐砶ey鍐茬獊闂錛?/p>
public Map<String, Account> getNameAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2)); }
榪欓噷鍙槸綆鍗曠殑浣跨敤鍚庤呰鐩栧墠鑰呮潵瑙e喅key閲嶅闂銆?/p>
toMap榪樻湁鍙︿竴涓噸杞芥柟娉曪紝鍙互鎸囧畾涓涓狹ap鐨勫叿浣撳疄鐜幫紝鏉ユ敹闆嗘暟鎹細
public Map<String, Account> getNameAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new)); }
浠g爜濡備笅錛?/p>
public Map<Long, String> getIdNameMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername)); }
浠g爜濡備笅錛?/p>
public Map<Long, Account> getIdAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account)); }
account -> account鏄竴涓繑鍥炴湰韜殑lambda琛ㄨ揪寮忥紝鍏跺疄榪樺彲浠ヤ嬌鐢‵unction鎺ュ彛涓殑涓涓粯璁ゆ柟娉曚唬鏇匡紝浣挎暣涓柟娉曟洿綆媧佷紭闆咃細
public Map<Long, Account> getIdAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity())); }
浠g爜濡備笅錛?/p>
public Map<String, Account> getNameAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity())); }
榪欎釜鏂規硶鍙兘鎶ラ敊錛?strong style="margin: 0px; padding: 0px;">java.lang.IllegalStateException: Duplicate key錛夛紝鍥犱負name鏄湁鍙兘閲嶅鐨勩?strong style="margin: 0px; padding: 0px;">toMap鏈変釜閲嶈澆鏂規硶錛屽彲浠ヤ紶鍏ヤ竴涓悎騫剁殑鍑芥暟鏉ヨВ鍐砶ey鍐茬獊闂錛?/p>
public Map<String, Account> getNameAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2)); }
榪欓噷鍙槸綆鍗曠殑浣跨敤鍚庤呰鐩栧墠鑰呮潵瑙e喅key閲嶅闂銆?/p>
toMap榪樻湁鍙︿竴涓噸杞芥柟娉曪紝鍙互鎸囧畾涓涓狹ap鐨勫叿浣撳疄鐜幫紝鏉ユ敹闆嗘暟鎹細
public Map<String, Account> getNameAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new)); }
妤間富鎴戜篃鏄嫤鎬濊壇涔咃紝涓嶇粡鎰忛棿鐪嬪埌浜嗗悗鍙扮殑鏃ュ織錛屾墠鍙戠幇鏄痵pring鎼炵殑楝箋?/span>
鎶ラ敊淇℃伅錛?span style="box-sizing: border-box; margin: 0px; padding: 0px; color: #ff0000;"><No mapping found for HTTP request with URI [/sandDemo001/images/1.jpg] in DispatcherServlet with name 'spring'>
瑙e喅鏂規硶1錛?span style="box-sizing: border-box; margin: 0px; padding: 0px; font-size: 14px;">鍦╯pring鐨勯厤緗慨鏀?/strong>web.xml涓嬪spring鐨?/strong>DispatcherServlet璇鋒眰url鏄犲皠鐨勯厤緗紝鍏堟潵鐪嬬湅鍘熼厤緗?/strong>錛?/span>
瑙e喅鏂規硶2錛?span style="box-sizing: border-box; margin: 0px; padding: 0px; color: #000000; font-size: 14px;">鍦╯pring鐨勯厤緗枃浠朵腑娣誨姞濡備笅涓琛岋細
<mvc:default-servlet-handler/>
娉ㄦ剰錛岄渶瑕佹槸spring3.0.5浠ヤ笂鐗堟湰