單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。java
這種模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。設計模式
注意:安全
描述:最基本的實現方式,在外部調用時纔會加載,線程不安全線程
public class LazySingleton { private static LazySingleton intstance; public LazySingleton(){} public static LazySingleton getInstance(){ if (intstance == null){ intstance = new LazySingleton(); } return intstance; } }
描述:線程安全,必須加鎖 synchronized 才能保證單例,但加鎖會影響效率設計
public class LazySingleton { private static LazySingleton intstance; private LazySingleton(){} public static synchronized LazySingleton getInstance(){ if (intstance == null){ intstance = new LazySingleton(); } return intstance; } }
描述:在類加載時就初始化建立對象,線程安全,但無論是否使用都建立對象可能會浪費內存code
public class HungrySingleton { private static HungrySingleton intstance = new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return intstance; } }
描述:使用volatile以及多重檢查來減少鎖範圍,提高效率對象
public class DoubleCheckSingleton { private DoubleCheckSingleton(){} private volatile static DoubleCheckSingleton instance; public static DoubleCheckSingleton getInstance(){ if (instance == null){ synchronized (DoubleCheckSingleton.class){ if (instance == null){ instance = new DoubleCheckSingleton(); } } } return instance; } }
描述:同時解決餓漢式的內存浪費問題和懶漢式的線程安全問題內存
public class StaticSingleton { private StaticSingleton(){} private static class StaticClass{ public static final StaticSingleton instance = new StaticSingleton(); } public static StaticSingleton getInstance(){ return StaticClass.instance; } }
描述: Effective Java 做者 Josh Bloch 提倡的方式,不只能防止反序列化從新建立新的對象,絕對防止屢次實例化,也能防止反射破解單例的問題get
public enum EnumSingleton { INSTANCE; }