Posted Java鎯呮姤灞€

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相关的知识,希望对你有一定的参考价值。


馃懆鈥嶐煉?瀵艰锛氣€?/span>

闈㈣瘯瀹橈細甯︾瑪浜嗗惂锛岄偅鍐欎袱绉嶅崟渚嬫ā寮忕殑瀹炵幇鏂规硶鍚?br>鐚垮竻锛氭矙娌欐矙鍒峰埛鍒穨~~ 鍐欏ソ浜?br>闈㈣瘯瀹橈細浣犺繖涓槸鎬庝箞淇濊瘉绾跨▼瀹夊叏鐨勶紝閭d綘鐭ラ亾锛寁olatile 鍏抽敭瀛? 绫诲姞杞藉櫒锛熼攣鏈哄埗锛燂紵锛燂紵

鈥?/span>

鍗曚緥妯″紡鈥斺€旂嫭涓€鏃犱簩鐨勫璞?/span>

鍗曚緥妯″紡锛屼粠鎴戠湅 銆奐ava 10鍒嗛挓鍏ラ棬銆嬮偅澶╁氨鍚繃鐨勪竴涓璁℃ā寮忥紝杩樿闈㈣瘯杩囧ソ鍑犳鐨勮璁℃ā寮忛棶棰橈紝浠婂ぉ涓€缃戞墦灏絶~

鏈変竴浜涘璞℃垜浠‘瀹炲彧闇€瑕佷竴涓紝姣斿锛岀嚎绋嬫睜銆佹暟鎹簱杩炴帴銆佺紦瀛樸€佹棩蹇楀璞$瓑锛屽鏋滄湁澶氫釜鐨勮瘽锛屼細閫犳垚绋嬪簭鐨勮涓哄紓甯革紝璧勬簮浣跨敤杩囬噺鎴栬€呬笉涓€鑷寸殑闂銆備綘涔熻浼氳锛岃繖绉嶆垜鐢ㄥ叏灞€鍙橀噺涓嶄篃鑳藉疄鐜板悧锛岃繕鏁翠釜鍗曚緥妯″紡锛屽ソ鍍忎綘寰堟祦寮婄殑鏍峰瓙锛屽鏋滃皢瀵硅薄璧嬪€肩粰涓€涓叏灞€鍙橀噺锛岄偅绋嬪簭鍚姩灏变細鍒涘缓濂藉璞★紝涓囦竴杩欎釜瀵硅薄寰堣€楄祫婧愶紝鎴戜滑杩樺彲鑳藉湪鏌愪簺鏃跺€欑敤涓嶅埌锛岃繖灏遍€犳垚浜嗚祫婧愮殑娴垂锛屼笉鍚堢悊锛屾墍浠ュ氨鏈変簡鍗曚緥妯″紡銆?/p>

鍗曚緥妯″紡鐨勫畾涔?/span>

鍗曚緥妯″紡纭繚涓€涓被鍙湁涓€涓疄渚嬶紝骞舵彁渚涗竴涓叏灞€鍞竴璁块棶鐐?/strong>

鍗曚緥妯″紡鐨勭被鍥?/span>

鍗曚緥妯″紡鈥斺€旂嫭涓€鏃犱簩鐨勫璞?> 
 </figure> 
 <h2 data-tool=鍗曚緥妯″紡鐨勫疄鐜?/span>

楗挎眽寮?/span>

  • static 鍙橀噺鍦ㄧ被瑁呰浇鐨勬椂鍊欒繘琛屽垵濮嬪寲
  • 澶氫釜瀹炰緥鐨?static 鍙橀噺浼氬叡浜悓涓€鍧楀唴瀛樺尯鍩?

鐢ㄨ繖涓や釜鐭ヨ瘑鐐瑰啓鍑虹殑鍗曚緥绫诲氨鏄タ姹夊紡浜嗭紝鍒濆鍖栫被鐨勬椂鍊欏氨鍒涘缓锛岄ゥ涓嶆嫨椋燂紝楗挎眽

public class Singleton {

//鏋勯€犵鏈夊寲锛岄槻姝㈢洿鎺ew
private Singleton(){}

//闈欐€佸垵濮嬪寲鍣紙static initializer锛変腑鍒涘缓瀹炰緥锛屼繚璇佺嚎绋嬪畨鍏?/span>
private static Singleton instance = new Singleton();

public static Singleton getInstance(){
return instance;
}
}

楗挎眽寮忔槸绾跨▼瀹夊叏鐨勶紝JVM鍦ㄥ姞杞界被鏃堕┈涓婂垱寤哄敮涓€鐨勫疄渚嬪璞★紝涓斿彧浼氳杞戒竴娆°€?/p>

Java 瀹炵幇鐨勫崟渚嬫槸涓€涓櫄鎷熸満鐨勮寖鍥达紝鍥犱负瑁呰浇绫荤殑鍔熻兘鏄櫄鎷熸満鐨勶紝鎵€浠ヤ竴涓櫄鎷熸満閫氳繃鑷繁鐨凜lassLoader 瑁呰浇楗挎眽寮忓疄鐜板崟渚嬬被鐨勬椂鍊欏氨浼氬垱寤轰竴涓被瀹炰緥銆傦紙濡傛灉涓€涓櫄鎷熸満閲屾湁澶氫釜ClassLoader鐨勮瘽锛屽氨浼氭湁澶氫釜瀹炰緥锛?/p>

鎳掓眽寮?/span>

鎳掓眽寮忥紝灏辨槸瀹炰緥鍦ㄧ敤鍒扮殑鏃跺€欐墠鍘诲垱寤猴紝姣旇緝鈥滄噿鈥?/p>

鍗曚緥妯″紡鐨勬噿姹夊紡瀹炵幇鏂瑰紡浣撶幇浜嗗欢杩熷姞杞界殑鎬濇兂锛堝欢杩熷姞杞戒篃绉版噿鍔犺浇Lazy Load锛屽氨鏄竴寮€濮嬩笉瑕佸姞杞借祫婧愭垨鏁版嵁锛岀瓑鍒拌浣跨敤鐨勬椂鍊欐墠鍔犺浇锛?/p>

鍚屾鏂规硶

public  class Singleton {
private static Singleton singleton;

private Singleton(){}

//瑙e喅浜嗙嚎绋嬩笉瀹夊叏闂锛屼絾鏄晥鐜囧お浣庝簡锛屾瘡涓嚎绋嬫兂鑾峰緱绫荤殑瀹炰緥鐨勬椂鍊欙紝閮介渶瑕佸悓姝ユ柟娉曪紝涓嶆帹鑽?/span>
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}

鍙岄噸妫€鏌ュ姞閿?/h4>
public class Singleton {

//volatitle鍏抽敭璇嶇‘淇濓紝澶氱嚎绋嬫纭鐞唖ingleton
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton ==null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}

Double-Check 姒傚康锛堣繘琛屼袱娆℃鏌ワ級鏄绾跨▼寮€鍙戜腑缁忓父浣跨敤鐨勶紝涓轰粈涔堥渶瑕佸弻閲嶆鏌ラ攣鍛紵鍥犱负绗竴娆℃鏌ユ槸纭繚涔嬪墠鏄竴涓┖瀵硅薄锛岃€岄潪绌哄璞″氨涓嶉渶瑕佸悓姝ヤ簡锛岀┖瀵硅薄鐨勭嚎绋嬬劧鍚庤繘鍏ュ悓姝ヤ唬鐮佸潡锛屽鏋滀笉鍔犵浜屾绌哄璞℃鏌ワ紝涓や釜绾跨▼鍚屾椂鑾峰彇鍚屾浠g爜鍧楋紝涓€涓嚎绋嬭繘鍏ュ悓姝ヤ唬鐮佸潡锛屽彟涓€涓嚎绋嬪氨浼氱瓑寰咃紝鑰岃繖涓や釜绾跨▼灏变細鍒涘缓涓や釜瀹炰緥鍖栧璞★紝鎵€浠ラ渶瑕佸湪绾跨▼杩涘叆鍚屾浠g爜鍧楀悗鍐嶆杩涜绌哄璞℃鏌ワ紝鎵嶈兘纭繚鍙垱寤轰竴涓疄渚嬪寲瀵硅薄銆?/p>

鍙岄噸妫€鏌ュ姞閿侊紙double checked locking锛夌嚎绋嬪畨鍏ㄣ€佸欢杩熷姞杞姐€佹晥鐜囨瘮杈冮珮

volatile锛歷olatile涓€鑸敤浜庡绾跨▼鐨勫彲瑙佹€э紝杩欓噷鐢ㄦ潵闃叉鎸囦护閲嶆帓锛堥槻姝ew Singleton鏃舵寚浠ら噸鎺掑簭瀵艰嚧鍏朵粬绾跨▼鑾峰彇鍒版湭鍒濆鍖栧畬鐨勫璞★級銆傝volatile 淇グ鐨勫彉閲忕殑鍊硷紝灏嗕笉浼氳鏈湴绾跨▼缂撳瓨锛屾墍鏈夊璇ュ彉閲忕殑璇诲啓閮芥槸鐩存帴鎿嶄綔鍏变韩鍐呭瓨锛屼粠鑰岀‘淇濆涓嚎绋嬭兘姝g‘鐨勫鐞嗚鍙橀噺銆?/p>

鎸囦护閲嶆帓

鎸囦护閲嶆帓鏄寚鍦ㄧ▼搴忔墽琛岃繃绋嬩腑, 涓轰簡鎬ц兘鑰冭檻, 缂栬瘧鍣ㄥ拰CPU鍙兘浼氬鎸囦护閲嶆柊鎺掑簭銆?/p>

Java涓垱寤轰竴涓璞★紝寰€寰€鍖呭惈涓変釜杩囩▼銆傚浜巗ingleton = new Singleton()锛岃繖涓嶆槸涓€涓師瀛愭搷浣滐紝鍦?JVM 涓寘鍚涓嬩笁涓繃绋嬨€?/p>

  1. 缁?singleton 鍒嗛厤鍐呭瓨
  2. 璋冪敤 Singleton 鐨勬瀯閫犲嚱鏁版潵鍒濆鍖栨垚鍛樺彉閲忥紝褰㈡垚瀹炰緥
  3. 灏唖ingleton瀵硅薄鎸囧悜鍒嗛厤鐨勫唴瀛樼┖闂达紙鎵ц瀹岃繖姝?singleton鎵嶆槸闈?null 浜嗭級

浣嗘槸锛岀敱浜嶫VM浼氳繘琛屾寚浠ら噸鎺掑簭锛屾墍浠ヤ笂闈㈢殑绗簩姝ュ拰绗笁姝ョ殑椤哄簭鏄笉鑳戒繚璇佺殑锛屾渶缁堢殑鎵ц椤哄簭鍙兘鏄?1-2-3锛屼篃鍙兘鏄?1-3-2銆傚鏋滄槸 1-3-2锛屽垯鍦?3 鎵ц瀹屾瘯锛? 鏈墽琛屼箣鍓嶏紝琚彟涓€涓嚎绋嬫姠鍗犱簡锛岃繖鏃?instance 宸茬粡鏄潪 null 浜嗭紙浣嗗嵈娌℃湁鍒濆鍖栵級锛屾墍浠ヨ繖涓嚎绋嬩細鐩存帴杩斿洖 instance锛岀劧鍚庝娇鐢紝閭h偗瀹氬氨浼氭姤閿欎簡锛屾墍浠ヨ鍔犲叆 volatile鍏抽敭瀛椼€?/p>

闈欐€佸唴閮ㄧ被

public class Singleton {

private Singleton(){}

private static class SingletonInstance{
private static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}

閲囩敤绫诲姞杞界殑鏈哄埗鏉ヤ繚璇佸垵濮嬪寲瀹炰緥鏃跺彧鏈変竴涓嚎绋嬶紱

闈欐€佸唴閮ㄧ被鏂瑰紡鍦⊿ingleton 绫昏瑁呰浇鐨勬椂鍊欏苟涓嶄細绔嬪嵆瀹炰緥鍖栵紝鑰屾槸鍦ㄨ皟鐢╣etInstance鐨勬椂鍊欙紝鎵嶅幓瑁呰浇鍐呴儴绫籗ingletonInstance ,浠庤€屽畬鎴怱ingleton鐨勫疄渚嬪寲

绫荤殑闈欐€佸睘鎬у彧浼氬湪绗竴娆″姞杞界被鐨勬椂鍊欏垵濮嬪寲锛屾墍浠ワ紝JVM甯垜浠繚璇佷簡绾跨▼鐨勫畨鍏ㄦ€э紝鍦ㄧ被鍒濆鍖栨椂锛屽叾浠栫嚎绋嬫棤娉曡繘鍏?/p>

浼樼偣锛氱嚎绋嬪畨鍏紝鍒╃敤闈欐€佸唴閮ㄧ被瀹炵幇寤惰繜鍔犺浇锛屾晥鐜囪緝楂橈紝鎺ㄨ崘浣跨敤

鏋氫妇

enum Singleton{
INSTANCE;
public void method(){}
}

鍊熷姪JDK5 娣诲姞鐨勬灇涓惧疄鐜板崟渚嬶紝涓嶄粎鍙互閬垮厤澶氱嚎绋嬪悓姝ラ棶棰橈紝杩樿兘闃叉鍙嶅簭鍒楀寲閲嶆柊鍒涘缓鏂扮殑瀵硅薄锛屼絾鏄湪鏋氫妇涓殑鍏朵粬浠讳綍鏂规硶鐨勭嚎绋嬪畨鍏ㄧ敱绋嬪簭鍛樿嚜宸辫礋璐c€傝繕鏈夐槻姝笂闈㈢殑閫氳繃鍙嶅皠鏈哄埗璋冪敤绉佺敤鏋勯€犲櫒銆備笉杩囷紝鐢变簬Java1.5涓墠鍔犲叆enum鐗规€э紝鎵€浠ヤ娇鐢ㄧ殑浜哄苟涓嶅銆?/p>

杩欑鏂瑰紡鏄€奅ffective Java銆?浣滆€匤osh Bloch 鎻愬€$殑鏂瑰紡銆?/p>

鍗曚緥妯″紡鍦↗DK 涓殑婧愮爜鍒嗘瀽

JDK 涓紝java.lang.Runtime 灏辨槸缁忓吀鐨勫崟渚嬫ā寮忥紙楗挎眽寮忥級

鍗曚緥妯″紡鈥斺€旂嫭涓€鏃犱簩鐨勫璞?> 
 </figure> 
 <h2 data-tool=鍗曚緥妯″紡娉ㄦ剰浜嬮」鍜岀粏鑺?/span>
  • 鍗曚緥妯″紡淇濊瘉浜嗙郴缁熷唴瀛樹腑璇ョ被鍙瓨鍦ㄤ竴涓璞★紝鑺傜渷浜嗙郴缁熻祫婧愶紝瀵逛簬涓€浜涢渶瑕侀绻佸垱寤洪攢姣佺殑瀵硅薄锛屼娇鐢ㄥ崟渚嬫ā寮忓彲浠ユ彁楂樼郴缁熸€ц兘
  • 褰撴兂瀹炰緥鍖栦竴涓崟渚嬬被鐨勬椂鍊欙紝蹇呴』瑕佽浣忎娇鐢ㄧ浉搴旂殑鑾峰彇瀵硅薄鐨勬柟娉曪紝鑰屼笉鏄娇 鐢╪ew
  • 鍗曚緥妯″紡浣跨敤鐨勫満鏅細闇€瑕侀绻佺殑杩涜鍒涘缓鍜岄攢姣佺殑瀵硅薄銆佸垱寤哄璞℃椂鑰楁椂杩囧鎴?鑰楄垂璧勬簮杩囧(鍗?閲嶉噺绾у璞?锛屼絾鍙堢粡甯哥敤鍒扮殑瀵硅薄銆佸伐鍏风被瀵硅薄銆侀绻佽闂暟 鎹簱鎴栨枃浠剁殑瀵硅薄(姣斿鏁版嵁婧愩€乻ession宸ュ巶绛?



END




鍗曚緥妯″紡鈥斺€旂嫭涓€鏃犱簩鐨勫璞? class=

寰€鏈熺簿褰╁洖椤?/p>

鈥斺€斿璁捐妯″紡鍓嶄綘瑕佺煡閬撹繖浜?/span>






以上是关于的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数