Java行业情景分析_Java 设计模式情景分析——单例模式
單例模式可以說是應用最廣的模式之一,在應用單例模式時,單例對象的類必須保證只有一個實例存在,而且可以自行實例化并向整個系統提供這個實例。一般在不能自由構造對象的情況下,就會使用單例設計模式,例如創建一個對象需要消耗資源過多,還有訪問 IO 和數據庫等資源的情況。
1.單例模式
單例模式
優點
1、在內存中只有一個實例,減少了內存開支和性能開銷;
2、可以避免對同一資源文件的同時寫操作;
3、可以在系統設置全局的訪問點,優化和共享資源訪問,例如可以設計一個單例類,負責所有數據表的映射處理;
缺點
1、一般沒有接口,擴展困難;
2、單例模式如果持有 Context,很容易引發內存泄漏,此時需要注意傳遞給單例對象的 Context 最好是 Application Context;
UML 類圖:
1.餓漢式單例
public class Singleton {
private static final Singleton instance = new Singleton(); // 句柄
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
2.懶漢式單例
優點是單例只有在使用時才會被實例化;缺點是第一次加載反應稍慢,每次調用 getInstance() 都進行同步,造成了不必要的同步開銷,一般不建議使用。
public class Singleton {
private static Singleton instance; // 句柄
private Singleton() {
}
public static synchronized Singleton getInstance() { // 有同步開銷
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.DCL單例
Double Check Lock 實現單例,優點是既能夠在需要時才初始化單例,又能夠保證線程安全,且單例對象初始化后調用 getInstance() 不進行同步鎖;缺點是第一次加載反應稍慢。
public class Singleton {
// volatile 禁止指令重排序優化
private volatile static Singleton instance = null; // 句柄
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) { // 避免不必要的同步
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
4.靜態內部類單例(推薦使用)
第一次加載不會初始化 Singleton,只有在第一次調用 Singleton 的 getInstance() 才會初始化,第一次調用會導致虛擬機加載 SingletonHolder 類,這種方式不僅能夠確保線程安全,也能夠保證單例對象的唯一性,同時也延遲了單例的實例化,推薦使用。
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
}
5.使用容器實現單例
在初始,將多種單例類型注入到一個統一的管理類中,在使用時根據 key 獲取對象對應類型的對象。可管理多種類型的單例,并且在使用時可以通過統一的接口進行獲取操作,降低了耦合度。
public class SingletonManager {
private static Map objMap = new HashMap<>();
private SingletonManager() {
}
public static void registerInstance(String key, Object instance) {
if (objMap.containsKey(key)) {
objMap.put(key, instance);
}
}
public static Object getInstance(String key) {
return objMap.get(key);
}
}
不管以何種形式實現單例模式,它們的核心原理都是將構造函數私有化,并且通過靜態方法獲取一個唯一的實例,在這個獲取的過程中必須保證線程安全、防止反序列化導致重新生成實例對象等問題,選擇何種取決于項目本身,并發環境是否復雜、單例對象等資源消耗等。
2.Spring源碼中的應用情景
總結
以上是生活随笔為你收集整理的Java行业情景分析_Java 设计模式情景分析——单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 磁盘组_有效管理 ASM 磁
- 下一篇: msgplus.exe是什么进程文件 有