單件模式確保一個類只有一個實例,並提供一個全局訪問點。安全
要點:線程
延遲建立單件實例。code
線程不安全:get
/** * 單件類(懶漢式、線程不安全) */ public class Singleton { /** * 惟一單件實例 */ private static Singleton uniqueInstance; /** * 私有構造 */ private Singleton() {} /** * 獲取單件實例 */ public static Singleton getInstance() { if (uniqueInstance == null) { // 延遲建立單件實例 uniqueInstance = new Singleton(); } return uniqueInstance; } }
線程安全:同步
/** * 單件類(懶漢式、線程安全) */ public class Singleton { /** * 惟一單件實例 */ private static Singleton uniqueInstance; /** * 私有構造 */ private Singleton() {} /** * 獲取單件實例(同步方法) */ public static synchronized Singleton getInstance() { if (uniqueInstance == null) { // 延遲建立單件實例 uniqueInstance = new Singleton(); } return uniqueInstance; } }
「急切」建立單件實例。class
/** * 單件類(餓漢式) */ public class Singleton { /** * 惟一單件實例(「急切」建立單件實例) */ private static Singleton uniqueInstance = new Singleton(); /** * 私有構造 */ private Singleton() {} /** * 獲取單件實例 */ public static Singleton getInstance() { return uniqueInstance; } }
/** * 單件類(雙重檢查加鎖) */ public class Singleton { /** * 惟一單件實例 */ private volatile static Singleton uniqueInstance; /** * 私有構造 */ private Singleton() {} /** * 獲取單件實例 */ public static Singleton getInstance() { if (uniqueInstance == null) { synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
public class Test { public static void main(String[] args) { // 獲取單件實例 Singleton singleton = Singleton.getInstance(); System.out.println(singleton); Singleton singleton2 = Singleton.getInstance(); System.out.println(singleton2); } }