單例模式:確保一個類只有一個執行個體,並提供一個全域訪問點。單例模式的構造方法是私人的,所以不能從外部建立這個類,這樣很自然想到定義靜態方法返回這個類的執行個體的方式。
實現的方式:
1.線程同步方式:
public class Singleton {public static synchronized Singleton getInstance() {if (null == uniquesInstance) {uniquesInstance = new Singleton();}return uniquesInstance;}private Singleton() {}private static Singleton uniquesInstance;}
缺點:實際上只有第一次建立此對象時才需要進行線程同步,對象建立後同步就沒有了意義。
2.載入時建立
public class Singleton {public static Singleton getInstance() {return uniquesInstance;}private Singleton() {}private static Singleton uniquesInstance = new Singleton();}
JVM在載入這個類時馬上建立一個唯一的執行個體,JVM保證在任何線程訪問uniqueInstance靜態變數之前一定先建立此執行個體。
3.雙重檢查加鎖的方式
public class Singleton {public static Singleton getInstance() {if (null == uniquesInstance) {synchronized (this) {if (null == uniquesInstance) {uniquesInstance = new Singleton();}}}return uniquesInstance;}private Singleton() {}private volatile static Singleton uniquesInstance;}
如果執行個體沒有建立才進行同步,而不是第一種方式的每次都同步,此方式只需要同步一次。雙重檢查加鎖適用於JAVA5及以上的版本