1、餓漢式
? ? ? ? ①實現:在類加載的時候就初始化實例
? ? ? ? ②優點:線程安全
? ? ? ? ③缺點:實例在類加載的時候創建,可能會浪費資源
//餓漢式
public class EagerSingleton{private EagerSingleton(){} //私有構造方法private static EagerSingleton instance = new EagerSingleton();public static EagerSingleton getInstance(){return instance;}}
2、懶漢式
????????①實現:在首次獲取實例的時候再創建實例
? ? ? ? ②優點:延遲加載,節省資源
? ? ? ? ③缺點:線程不安全
public class LazySingleton{private LazySingleton(){} // 私有構造方法private static LazySingleton instance;public static LazySingleton getInstance(){if(instance != null){instance = new LazySingleton();}return instance;}}
3、雙重檢查鎖
????????①實現:通過雙重檢查+加鎖+volatile方式實現
? ? ? ? ②優點:線程安全
? ? ? ? ③缺點:稍微復雜
public class DoubleCheckedSingleton{private DoubleCheckedSingleton(){}private static volatile DoubleCheckedSingleton instance;public static DoubleCheckedSingleton getInstance(){if(instance != null){sychronized (DoubleCheckedSingleton.class){if(instance != null){instance = new DoubleCheckedSingleton();}}}return instance;}}
4、靜態內部類
????????①實現:靜態內部類創建示例
? ? ? ? ②優點:線程安全
? ? ? ? ③缺點:無法通過參數構造實例
public class InnerClassSingleton{private InnerClassSingleton(){}private static class SingletonHolder{private static final InnerClassSingleton instance = new InnerClassSingleton();}public static InnerClassSingleton getInstance(){return SingletonHolder.instance;}
}
5、枚舉
????????①實現:通過枚舉類型天然的單例特性實現
? ? ? ? ②優點:線程安全、代碼簡潔、防止反射和序列化破壞單例
? ? ? ? ③缺點:屬于餓漢式,會浪費資源
public emun EnumSingleton{INSTANCE;
}
Runtime類就是通過餓漢式的方式實現的單例模式