棣栧厛鐪嬫渶鍘熷鐨勫崟渚嬫ā寮忋?br />聽1聽package聽xylz.study.singleton;
聽2聽
聽3聽public聽class聽Singleton聽{
聽4聽
聽5聽聽聽聽聽private聽static聽Singleton聽instance聽=聽null;
聽6聽
聽7聽聽聽聽聽private聽Singleton()聽{
聽8聽聽聽聽聽}
聽9聽
10聽聽聽聽聽public聽static聽Singleton聽getInstance()聽{
11聽聽聽聽聽聽聽聽聽if聽(instance聽==聽null)聽{
12聽聽聽聽聽聽聽聽聽聽聽聽聽instance聽=聽new聽Singleton();
13聽聽聽聽聽聽聽聽聽}
14聽聽聽聽聽聽聽聽聽return聽instance;
15聽聽聽聽聽}
16聽}
17聽
鏄劇劧榪欎釜鍐欐硶鍦ㄥ崟綰跨▼鐜涓嬮潪甯稿ソ錛屼絾鏄綰跨▼浼氬鑷村涓疄渚嬪嚭鐜幫紝榪欎釜澶у閮借兘鐞嗚В銆?br />鏈綆鍗曠殑鏀歸犳柟寮忔槸娣誨姞涓涓悓姝ラ攣銆?br />聽1聽package聽xylz.study.singleton;
聽2聽
聽3聽public聽class聽SynchronizedSingleton聽{
聽4聽
聽5聽聽聽聽聽private聽static聽SynchronizedSingleton聽instance聽=聽null;
聽6聽
聽7聽聽聽聽聽private聽SynchronizedSingleton()聽{
聽8聽聽聽聽聽}
聽9聽
10聽聽聽聽聽public聽static聽synchronized聽SynchronizedSingleton聽getInstance()聽{
11聽聽聽聽聽聽聽聽聽if聽(instance聽==聽null)聽{
12聽聽聽聽聽聽聽聽聽聽聽聽聽instance聽=聽new聽SynchronizedSingleton();
13聽聽聽聽聽聽聽聽聽}
14聽聽聽聽聽聽聽聽聽return聽instance;
15聽聽聽聽聽}
16聽}
17聽
鏄劇劧涓婇潰鐨勬柟娉曢伩鍏嶄簡騫跺彂鐨勯棶棰橈紝浣嗘槸鐢變簬鎴戜滑鍙槸鍦ㄧ涓嬈℃瀯閫犲璞$殑鏃跺欐墠闇瑕佸悓姝ワ紝浠ュ悗灝變笉鍐嶉渶瑕佸悓姝ワ紝鎵浠ヨ繖閲屼笉鍙伩鍏嶇殑鏈夋ц兘寮閿銆備簬鏄皢閿佸幓鎺夐噰鐢ㄩ潤鎬佺殑灞炴ф潵瑙e喅鍚屾閿佺殑闂銆?br />聽1聽package聽xylz.study.singleton;
聽2聽
聽3聽public聽class聽StaticSingleton聽{
聽4聽
聽5聽聽聽聽聽private聽static聽StaticSingleton聽instance聽=聽new聽StaticSingleton();
聽6聽
聽7聽聽聽聽聽private聽StaticSingleton()聽{
聽8聽聽聽聽聽}
聽9聽
10聽聽聽聽聽public聽static聽StaticSingleton聽getInstance()聽{
11聽聽聽聽聽聽聽聽聽return聽instance;
12聽聽聽聽聽}
13聽}
14聽
涓婇潰鐨勬柟娉曟棦娌℃湁閿佸張瑙e喅浜嗘ц兘闂錛岀湅璧鋒潵宸茬粡婊¤凍闇姹備簡銆備絾鏄拷姹傗滃畬緹庘濈殑紼嬪簭鍛樻兂寤舵椂鍔犺澆瀵硅薄錛屽笇鏈涘湪絎竴嬈¤幏鍙栫殑鏃跺欐墠鏋勯犲璞★紝浜庢槸澶у闈炲父鑱槑鐨勮繘琛屾敼閫狅紝涔熷嵆闈炲父鍑哄悕鐨勫弻閲嶆鏌ラ攣鏈哄埗鍑烘潵浜嗐?br />聽1聽package聽xylz.study.singleton;
聽2聽
聽3聽public聽class聽DoubleLockSingleton聽{
聽4聽
聽5聽聽聽聽聽private聽static聽DoubleLockSingleton聽instance聽=聽null;
聽6聽
聽7聽聽聽聽聽private聽DoubleLockSingleton()聽{
聽8聽聽聽聽聽}
聽9聽
10聽聽聽聽聽public聽static聽DoubleLockSingleton聽getInstance()聽{
11聽聽聽聽聽聽聽聽聽if聽(instance聽==聽null)聽{
12聽聽聽聽聽聽聽聽聽聽聽聽聽synchronized聽(DoubleLockSingleton.class)聽{
13聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(instance聽==聽null)聽{
14聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽instance聽=聽new聽DoubleLockSingleton();
15聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}
16聽聽聽聽聽聽聽聽聽聽聽聽聽}
17聽聽聽聽聽聽聽聽聽}
18聽聽聽聽聽聽聽聽聽return聽instance;
19聽聽聽聽聽}
20聽}
21聽
鍙岄噸閿佹満鍒剁湅璧鋒潵闈炲父宸у鐨勯伩鍏嶄簡涓婇潰鐨勯棶棰樸備絾鏄湡鐨勬槸榪欐牱鐨勫悧錛熸枃绔犮?a target="_blank">鍙岄噸媯鏌ラ攣瀹氬強鍗曚緥妯″紡銆嬩腑璋堝埌浜嗛潪甯稿婕斿彉鐨勫弻閲嶉攣鏈哄埗甯︽潵鐨勯棶棰橈紝鍖呮嫭姣旇緝闅句互鐞嗚В鐨勬寚浠ら噸鎺掑簭鏈哄埗絳夈傛諱箣灝辨槸鍙岄噸媯鏌ラ攣鏈哄埗浠嶇劧瀵瑰鑷撮敊璇棶棰樿屼笉鏄ц兘闂銆?br />浜庢槸緇х畫鏀歸狅紝鏌愪釜鐗涗漢鍒╃敤JVM鐨勭壒鎬ф潵瑙e喅涓婅堪闂錛屽叿浣撳摢涓墰浜烘垜蹇樿浜嗭紝浣嗘槸涓嶆槸涓嬮潰鏂囩珷鐨勪綔鑰呫?br />錛?錛夈?a target="_blank">Java theory and practice: Fixing the Java Memory Model, Part 2銆?br />錛?錛夈?a target="_blank">Initialize-On-Demand Holder Class and Singletons銆?br />聽1聽package聽xylz.study.singleton;
聽2聽
聽3聽public聽class聽HolderSingleton聽{
聽4聽
聽5聽聽聽聽聽private聽static聽class聽HolderSingletonHolder聽{
聽6聽
聽7聽聽聽聽聽聽聽聽聽static聽HolderSingleton聽instance聽=聽new聽HolderSingleton();
聽8聽聽聽聽聽}
聽9聽
10聽聽聽聽聽private聽HolderSingleton()聽{
11聽聽聽聽聽聽聽聽聽//maybe聽throw聽an聽Exception聽when聽doing聽something聽
12聽聽聽聽聽}
13聽
14聽聽聽聽聽public聽static聽HolderSingleton聽getInstance()聽{
15聽聽聽聽聽聽聽聽聽return聽HolderSingletonHolder.instance;
16聽聽聽聽聽}
17聽}
18聽
涓婅堪浠g爜鐪嬭搗鏉ヨВ鍐充簡涓婇潰鍗曚緥妯″紡閬囧埌鐨勬墍鏈夐棶棰橈紝鑰屼笖瀹為檯涓婂伐浣滅殑寰堝ソ錛屾病鏈変粈涔堥棶棰樸備絾鏄嵈鏈変竴涓嚧鍛界殑闂錛屽鏋滅11琛屾姏鍑轟簡涓涓紓甯革紝涔熷氨鏄涓嬈℃瀯閫犲嚱鏁板け璐ュ皢瀵艱嚧姘歌繙鏃犳硶鍐嶆寰楀埌鏋勫緩瀵硅薄鐨勬満浼氥?br />浣跨敤涓嬮潰鐨勪唬鐮佹祴璇曚笅銆?br />聽1聽package聽xylz.study.singleton;
聽2聽
聽3聽public聽class聽HolderSingletonTest聽{
聽4聽
聽5聽聽聽聽聽private聽static聽class聽HolderSingletonHolder聽{
聽6聽
聽7聽聽聽聽聽聽聽聽聽static聽HolderSingletonTest聽instance聽=聽new聽HolderSingletonTest();
聽8聽聽聽聽聽}
聽9聽
10聽聽聽聽聽private聽static聽boolean聽init聽=聽false;
11聽聽聽聽聽
12聽聽聽聽聽private聽HolderSingletonTest()聽{
13聽聽聽聽聽聽聽聽聽//maybe聽throw聽an聽Exception聽when聽doing聽something聽
14聽聽聽聽聽聽聽聽聽if(!init)聽{
15聽聽聽聽聽聽聽聽聽聽聽聽聽init=true;
16聽聽聽聽聽聽聽聽聽聽聽聽聽throw聽new聽RuntimeException("fail");
17聽聽聽聽聽聽聽聽聽}
18聽聽聽聽聽}
19聽
20聽聽聽聽聽public聽static聽HolderSingletonTest聽getInstance()聽{
21聽聽聽聽聽聽聽聽聽return聽HolderSingletonHolder.instance;
22聽聽聽聽聽}
23聽聽聽聽聽public聽static聽void聽main(String[]聽args)聽{
24聽聽聽聽聽聽聽聽聽for(int聽i=0;i<3;i++)聽{
25聽聽聽聽聽聽聽聽聽聽聽聽聽try聽{
26聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.out.println(HolderSingletonTest.getInstance());
27聽聽聽聽聽聽聽聽聽聽聽聽聽}聽catch聽(Exception聽e)聽{
28聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.err.println("one->"+i);
29聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽e.printStackTrace();
30聽聽聽聽聽聽聽聽聽聽聽聽聽}catch(ExceptionInInitializerError聽err)聽{
31聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.err.println("two->"+i);
32聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽err.printStackTrace();
33聽聽聽聽聽聽聽聽聽聽聽聽聽}catch(Throwable聽t)聽{
34聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.err.println("three->"+i);
35聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽t.printStackTrace();
36聽聽聽聽聽聽聽聽聽聽聽聽聽}
37聽聽聽聽聽聽聽聽聽}
38聽聽聽聽聽}
39聽}
40聽
寰堜笉騫稿皢寰楀埌浠ヤ笅杈撳嚭錛?br />聽1聽
two->0
聽2聽
java.lang.ExceptionInInitializerError
聽3聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.getInstance(HolderSingletonTest.java:21)
聽4聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.main(HolderSingletonTest.java:26)
聽5聽
Caused聽by:聽java.lang.RuntimeException:聽fail
聽6聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.<init>(HolderSingletonTest.java:16)
聽7聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.<init>(HolderSingletonTest.java:12)
聽8聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest$HolderSingletonHolder.<clinit>(HolderSingletonTest.java:7)
聽9聽
聽聽聽聽
聽2聽more
10聽
three->1
11聽
java.lang.NoClassDefFoundError:聽Could聽not聽initialize聽class聽xylz.study.singleton.HolderSingletonTest$HolderSingletonHolder
12聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.getInstance(HolderSingletonTest.java:21)
13聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.main(HolderSingletonTest.java:26)
14聽
three->2
15聽
java.lang.NoClassDefFoundError:聽Could聽not聽initialize聽class聽xylz.study.singleton.HolderSingletonTest$HolderSingletonHolder
16聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.getInstance(HolderSingletonTest.java:21)
17聽
聽聽聽聽at聽xylz.study.singleton.HolderSingletonTest.main(HolderSingletonTest.java:26)
18聽
寰堟樉鐒舵垜浠兂鐫絎竴嬈″姞杞藉け璐ョ浜屾鑳藉鍔犺澆鎴愬姛錛岄潪甯鎬笉騫革紝JVM涓鏃﹀姞杞芥煇涓被澶辮觸灝嗚涓烘綾葷殑瀹氫箟鏈夐棶棰橈紝灝嗘潵涓嶅啀鍔犺澆錛岃繖鏍峰氨瀵艱嚧鎴戜滑娌℃湁鏈轟細鍐嶅姞杞姐傜洰鍓嶇湅璧鋒潵娌℃湁鍔炴硶閬垮厤姝ら棶棰樸傚鏋滆浣跨敤JVM鐨勭被鍔犺澆鐗規у氨蹇呴』淇濊瘉綾誨姞杞戒竴瀹氭紜紝鍚﹀垯姝ら棶棰樺皢姣斿茍鍙戝拰鎬ц兘鏇翠弗閲嶃傚鏋滄垜浠殑綾婚渶瑕佸垵濮嬭瘽閭d箞灝遍渶瑕佹兂鍏跺畠鍔炴硶閬垮厤鍦ㄦ瀯閫犲嚱鏁頒腑瀹屾垚銆傜湅璧鋒潵鍍忔槸鍙堝洖鍒頒簡鑰佸湴鏂癸紝闅鵑亾涓嶆槸涔堬紵
鎬諱箣錛岀粨璁烘槸鐩墠娌℃湁涓涓崄鍏ㄥ崄緹庣殑鍗曚緥妯″紡錛岃屽ぇ澶氭暟鎯呭喌涓嬫垜浠彧闇瑕佹弧瓚蟲垜浠殑闇姹傚氨琛岋紝娌″繀鏈夌壒鎰忚拷姹傛渶鈥滃畬緹庘濊В鍐蟲柟妗堛?br />鍘熸枃[http://www.imxylz.cn/p/177.html]
]]>