锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
棣栧厛鐪嬫渶鍘熷鐨勫崟渚嬫ā寮忋?/span>
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
鏄劇劧榪欎釜鍐欐硶鍦ㄥ崟綰跨▼鐜涓嬮潪甯稿ソ錛屼絾鏄綰跨▼浼?xì)瀵艰嚧澶氫釜瀹炰緥鍑虹帋图寴q欎釜澶у閮借兘鐞嗚В銆?/span>
鏈綆鍗曠殑鏀歸犳柟寮忔槸娣誨姞涓涓悓姝ラ攣銆?/span>
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喅鍚屾閿佺殑闂銆?/span>
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喅浜嗘ц兘闂錛岀湅璧鋒潵宸茬粡婊¤凍闇姹備簡銆備絾鏄拷姹?/span>“瀹岀編”鐨勭▼搴忓憳鎯沖歡鏃跺姞杞藉璞★紝甯屾湜鍦ㄧ涓嬈¤幏鍙栫殑鏃跺欐墠鏋勯犲璞★紝浜庢槸澶у闈炲父鑱槑鐨勮繘琛屾敼閫狅紝涔熷嵆闈炲父鍑哄悕鐨勫弻閲嶆鏌ラ攣鏈哄埗鍑烘潵浜嗐?/span>
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
鍙岄噸閿佹満鍒剁湅璧鋒潵闈炲父宸у鐨勯伩鍏嶄簡涓婇潰鐨勯棶棰樸備絾鏄湡鐨勬槸榪欐牱鐨勫悧錛熸枃绔犮?/span>鍙岄噸媯鏌ラ攣瀹氬強(qiáng)鍗曚緥妯″紡銆嬩腑璋堝埌浜嗛潪甯稿婕斿彉鐨勫弻閲嶉攣鏈哄埗甯︽潵鐨勯棶棰橈紝鍖呮嫭姣旇緝闅句互鐞嗚В鐨勬寚浠ら噸鎺掑簭鏈哄埗絳夈傛諱箣灝辨槸鍙岄噸媯鏌ラ攣鏈哄埗浠嶇劧瀵瑰鑷撮敊璇棶棰樿屼笉鏄ц兘闂銆?/span>
浜庢槸緇х畫鏀歸狅紝鏌愪釜鐗涗漢鍒╃敤JVM鐨勭壒鎬ф潵瑙e喅涓婅堪闂錛屽叿浣撳摢涓墰浜烘垜蹇樿浜嗭紝浣嗘槸涓嶆槸涓嬮潰鏂囩珷鐨勪綔鑰呫?/span>
錛?/span>1錛夈?/span>Java theory and practice: Fixing the Java Memory Model, Part 2銆?/span>
錛?/span>2錛夈?/span>Initialize-On-Demand Holder Class and Singletons銆?/span>
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琛屾姏鍑轟簡涓涓紓甯革紝涔熷氨鏄涓嬈℃瀯閫犲嚱鏁板け璐ュ皢瀵艱嚧姘歌繙鏃犳硶鍐嶆寰楀埌鏋勫緩瀵硅薄鐨勬満浼?xì)銆?/span>
浣跨敤涓嬮潰鐨勪唬鐮佹祴璇曚笅銆?/span>
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
寰堜笉騫稿皢寰楀埌浠ヤ笅杈撳嚭錛?/span>
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涓鏃﹀姞杞芥煇涓被澶辮觸灝嗚涓烘綾葷殑瀹氫箟鏈夐棶棰橈紝灝嗘潵涓嶅啀鍔犺澆錛岃繖鏍峰氨瀵艱嚧鎴戜滑娌℃湁鏈轟細(xì)鍐嶅姞杞姐傜洰鍓嶇湅璧鋒潵娌℃湁鍔炴硶閬垮厤姝ら棶棰樸傚鏋滆浣跨敤JVM鐨勭被鍔犺澆鐗規(guī)у氨蹇呴』淇濊瘉綾誨姞杞戒竴瀹氭紜紝鍚﹀垯姝ら棶棰樺皢姣斿茍鍙戝拰鎬ц兘鏇翠弗閲嶃傚鏋滄垜浠殑綾婚渶瑕佸垵濮嬭瘽閭d箞灝遍渶瑕佹兂鍏跺畠鍔炴硶閬垮厤鍦ㄦ瀯閫犲嚱鏁頒腑瀹屾垚銆傜湅璧鋒潵鍍忔槸鍙堝洖鍒頒簡鑰佸湴鏂癸紝闅鵑亾涓嶆槸涔堬紵
鎬諱箣錛岀粨璁烘槸鐩墠娌℃湁涓涓崄鍏ㄥ崄緹庣殑鍗曚緥妯″紡錛岃屽ぇ澶氭暟鎯呭喌涓嬫垜浠彧闇瑕佹弧瓚蟲垜浠殑闇姹傚氨琛岋紝娌″繀鏈夌壒鎰忚拷姹傛渶“瀹岀編”瑙e喅鏂規(guī)銆?/span>