銆婁綘鐔熸倝璁捐妯″紡鍚楋紵銆嬧€滄垜鏈€鐔熸倝鐨勬槸鍗曚緥妯″紡銆傗€濅綘寮犲紑鍢达紝鑷俊鍦板拞鍝紝鐒曞彂鍏夊僵馃寛浣犳病鍚冭繃鐚倝锛屼絾涔熻杩囩尓璺戯紝鐭ヨ劯涓嶇煡蹇冦€傝鍒拌璁℃ā寮忥紝灏卞皯涓嶄簡鍗曚緥妯″紡銆傚崟渚嬫ā寮忥細淇濊瘉涓€涓被鍙湁涓€涓疄渚嬶紝骞舵彁渚涗竴涓叏灞€鑺傜偣鏉ヨ闂瀹炰緥銆傜炕璇戯細鍒涘缓涓€涓敮涓€鐨勭被瀵硅薄锛屽苟淇濊瘉姣忔瀵瑰閮戒娇鐢ㄨ繖涓敮涓€鐨勫璞°€傜劧鍚庝綘鍐欏疄鐜颁唬鐮佽瘉鏄庝綘鈥済et鈥濆埌浜嗗崟渚嬶紝姣曠珶灏辨槸杩欎箞绠€鍗曪紒鍒涘缓涓€涓崟渚嬬被publicclassSingleObject{privatestaticSingleObjectinstance=newSingleObject();privateSingleObject(){}publicstaticSingleObjectgetInstance(){杩斿洖瀹炰緥锛泒publicvoidshowMessage(){System.out.println("HelloWorld!");}}闈欐€佷慨楗板彉閲忎細鍦ㄧ被鍔犺浇鏃跺垱寤猴紙璁颁綇杩欎竴鐐癸紝涓嬮潰浼氭彁鍒帮級锛屽唴瀛樹腑鍙湁涓€浠斤紝璇ョ被鐨勬墍鏈夊疄渚嬪湪浣跨敤鏃跺叡浜悓涓€涓潤鎬佸彉閲忋€傚嵆浣挎垜浠€氳繃object.static鍙橀噺鍚嶈闂紝铏界劧瀵硅薄鍐呭瓨涓嶅悓锛屼絾鏄闂殑闈欐€佸彉閲忔槸涓€鏍风殑锛屾墍浠ヨ繕鏄帹鑽愮被鍚?static鍙橀噺鍚嶆潵璁块棶鏇存柟渚裤€傚皢瀹炰緥璁剧疆涓簆rivate鐨勭洰鐨勬槸淇濊瘉涓嶈兘琚閮ㄧ洿鎺ヤ娇鐢紝闇€瑕侀€氳繃Get鏂规硶璁块棶銆傝幏鍙栧敮涓€瀵硅薄骞朵娇鐢ㄥ畠銆俻ublicclassSingletonDemo{publicstaticvoidmain(String[]args){SingleObjectobject=newSingleObject();//閿欒锛佸洜涓虹粨鏋勬槸绉佹湁鐨勶紝鎵€浠ョ紪璇戝櫒鎶ラ敊SingleObjectobject=SingleObject.getInstance();//姝g‘鐨刼bject.showMessage();}}涓婇潰鐨勪唬鐮佹槸鎴戜滑浼犵粺鐨勫疄鐜版柟寮忥紝涔熸槸鎴戜滑鏈€鐔熸倝鐨勯儴鍒嗐€傝繖涓疄鐜板彨鍋氣€滈タ浜嗕箞涓浗寮忦煃斺€濓紝涔嬫墍浠ュ彨楗夸簡涔堜腑鍥藉紡鏄洜涓篠ingleObjectinstance=newSingleObject();涓嶇鎴戜滑鏄惁浣跨敤瀹炰緥瀵硅薄锛屾瘡褰撳姞杞絊ingleObject绫绘椂锛屽畠閮戒細閫氳繃new鍏抽敭瀛楀垱寤轰竴涓璞¤繘琛屽唴瀛樺紑鍙戯紝灏卞儚楗夸簡鎬曠殑浜猴紝鍗充娇鍚冮ケ浜嗕篃瑕佸偍澶囧共绮互鍏嶄粬浠啀娆℃尐楗裤€傜湅鍒拌繖閲屾槸涓嶆槸瑙夊緱寰堟柊濂囷紝鏈€鐔熸倝鐨勫崟渚嬪彉寰楅檶鐢熶簡锛佹瘯绔燂紝鐔熸倝涓€涓汉鏄粠蹇冨紑濮嬬殑锛岀啛鎮夎璁℃ā寮忎篃鏄粠鍏垛€滃績鈥濆紑濮嬬殑銆傞噸鎷炬俯鏌旂殑鈥滃ス鈥濅笌楗挎眽寮忕浉姣旓紝鍔犺浇绫绘椂涓嶅紑鍐呭瓨锛屽彧鍦ㄤ娇鐢ㄥ璞℃椂鎵嶅垱寤哄疄渚嬨€傚畠琚О涓衡€滄噿姹夊紡鈥濓紝灏卞儚涓€涓汉鎳掓儼鑰屾劅鍒伴ゥ楗裤€傚悆銆侺azy馃挙Thread涓嶅畨鍏╬ublicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//绾跨▼闂instance=newSingleton();}杩斿洖瀹炰緥锛泒}浼犵粺鐨勬儼鎬ч鏍煎瓨鍦ㄧ嚎绋嬮棶棰樸€傚亣璁炬湁涓や釜绾跨▼T1鍜孴2锛屽悓鏃舵墽琛屼笂闈㈢殑浠g爜銆傚綋T1瀹屾垚鏃秈f(instance==null)浣嗕笉鍘籭nstance=newSingleton();绾跨▼鍏堜竴姝ユ墽琛宨nstance=newSingleton();鍒濆鍖栧疄渚嬨€傛鏃禩1绾跨▼缁х画鎵ц锛岄噸鏂板垵濮嬪寲瀹炰緥銆傚洜姝わ紝瀹炰緥浼氳鍒濆鍖栦袱娆★紝杩濊儗浜嗗崟渚嬫ā寮忕殑鎰忎箟銆傜嚎绋嬪畨鍏ㄧ殑publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(instance==null){instance=newSingleton();}杩斿洖瀹炰緥锛泒}閫氳繃synchronized绾跨▼瀹夊叏鏉ヤ繚璇侊紝浣嗘槸鐢变簬姣忎釜绾跨▼鍦ㄦ墽琛実etInstance鏂规硶鐨勬椂鍊欓兘瑕佺瓑寰呴攣鐨勯噴鏀撅紝浼氬奖鍝嶆€ц兘锛屾墍浠ュ氨鏈変簡double-check閿佺殑鏂瑰紡銆傚弻楠岃瘉閿侌煍掗敊璇弻楠岃瘉閿乸ublicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//Time1鍚屾(Singleton.class){//Time2if(instance==null){instance=newSingleton();//鎸囦护閲嶆帓}}}returnsingleton;}}绗竴涓猧f鍒ゆ柇瀹炰緥锛屽鏋滃垵濮嬪寲瀹屾垚锛屽嵆!=null锛屽垯鐩存帴杩斿洖銆傚鏋?=null缁х画鎵ц锛屽綋澶氫釜绾跨▼鎵ц鍒癟ime1鏃讹紝浼氱瓑寰呴攣鐨勯噴鏀俱€傚綋鎸佹湁閿佺殑绾跨▼琚噴鏀惧悗锛屽叾浠栫嚎绋嬩細鎶㈠埌閿侊紝鐒跺悗涓€涓嚎绋嬮噸鏂拌幏寰楅攣缁х画鎵ц锛屽苟鍦═ime2閲嶆柊鍒ゆ柇瀹炰緥鏄惁涓虹┖锛屽洜涓轰箣鍓嶇殑绾跨▼宸茬粡鍒濆鍖栦簡瀹炰緥锛屾墍浠ヨ繑鍥炵洿鎺ラ伩鍏嶉噸澶嶈祴鍊笺€備絾杩欐槸鐞嗘兂鐘舵€併€傚湪绯荤粺涓紝instance=newSingleton();鍒嗕负涓夋锛氬垎閰嶅唴瀛樼┖闂达紝鍒濆鍖栧璞★紝灏嗗璞℃寚鍚戞柊鍒嗛厤鐨勫唴瀛樼┖闂达紝浣嗘槸涓轰簡鎬ц兘鏈€澶у寲锛岀郴缁熶笉褰卞搷缁撴灉銆傛帴涓嬫潵锛屽皢涓婅堪姝ラ閲嶆柊鎺掑簭锛屽彲鑳芥槸锛氬垎閰嶅唴瀛樼┖闂达紝灏嗗璞℃寚鍚戞柊鍒嗛厤鐨勫唴瀛樼┖闂达紝鍒濆鍖栧璞★紝褰揟2绾跨▼鎵ц鍒癟ime2鏃讹紝姝ゆ椂T1绾跨▼鎵ц鈥滃皢瀵硅薄鎸囧悜鏂板垎閰嶇殑鍐呭瓨绌洪棿鈥濓紝瀵硅薄杩樻病鏈夊垵濮嬪寲锛屾湭鍒濆鍖栫殑鍐呭瓨绌洪棿鍙兘宸茬粡琚娇鐢ㄥ苟涓旀湁鍊硷紙鍏蜂綋鍊间笉娓呮锛夛紝姝ゆ椂T2缁х画鎵ц锛岃闂疄渚嬪垵濮嬪寲杩樻病鏈夊畬鎴愮殑瀵硅薄骞朵笖鍒ゆ柇瀹炰緥涓嶄负绌烘槸閿欒鐨勶紝鐒跺悗杩斿洖鏈垵濮嬪寲鐨勫璞°€傗潓姝g‘鐨勫弻閲嶆鏌ラ攣publicclassSingleton{privatevolatilestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){singleton=newSingleton();}}}杩斿洖鍗曚緥锛泒}缁欏彉閲忓姞涓妚olatile鍏抽敭瀛楋紝volatile鐨勪綔鐢ㄦ槸绂佹鎸囦护閲嶆帓锛屾墍浠ヤ笂闈㈢殑鎯呭喌灏卞緢濂介伩鍏嶄簡銆備笂闈㈢殑澶鏉備簡锛熷埆鐫€鎬ワ紝涓嬮潰缁欏ぇ瀹朵粙缁嶄竴涓洿绠€鍗曠殑瀹炵幇鍙岄噸楠岃瘉閿佸姛鑳界殑鏂规硶馃憞銆傞潤鎬佸唴閮ㄧ被馃尦publicclassSingleton{privatestaticclassSingletonHolder{privatestaticfinalSingletoninstacne=newSingleton();}privateSingleton(){}publicstaticfinalSingletongetInstance(){returnSingletonHolder.instacne;杩樿寰椾笂闈㈡垜璁╀綘璁颁綇鐨勪竴鍙ヨ瘽锛氣€滃姞杞界被鏃朵細鍒涘缓闈欐€佷慨楗板彉閲忊€濓紝閫氳繃闈欐€佸唴閮ㄧ被锛屽嵆浣垮姞杞戒簡澶栧眰鐨凷ingleton绫伙紝鍙鎴戜滑鍐呭眰鐨凷ingletonHolder绫绘湭琚富鍔ㄤ娇鐢紝鍒欏疄渚嬫湭鍒濆鍖栥€傚綋璋冪敤getInstance鏂规硶鏃讹紝濡係taticSingletonstaticSingleton=StaticSingleton.getInstance();锛屼細鍔犺浇SingletonHolder绫诲苟瀹炰緥鍖栧疄渚嬶紝閬垮厤鍐呭瓨娴垂銆傛湰鏂囦唬鐮佹潵鑷彍楦熸暀绋嬶紝浣滆€呯暐浣滄敼鍔紒鎴戞槸Haoo锛屼竴涓箰瑙傜殑鐮佸啘锛屽啓鍑烘湁瓒g殑鏂囩珷銆傚鏋滄湰鏂囧鎮ㄦ湁甯姪锛岃鏀惰棌猸愮偣璧烉煈嶅苟鍏虫敞馃憖锛屽叧娉ㄤ笉杩疯矾(馃尰鈼♀€库棥)
