開發模式其實在平時的開發中有經常用到,但是自己平時也沒注意,會用但是不理解,這是很大的問題。
遇到面試或者這方面的問題,不能深入的剖析。
參考:單例就是只有乙個例項,就是對於某乙個類,整個工程中,只有乙個他的例項,並且這個類通過自行例項化,把這個物件向整個工程提供。
為什麼要使用單例呢? 或者這樣的好處是什麼?
1. 在工程中,有一些核心類用來控制資源,單例只有乙個manager,方便資源之間的互相通訊同時降低資源的損耗以及衝突。
如資料庫連線池的設計一般也是採用單例模式,因為資料庫連線是一種資料庫資源。資料庫軟體系統中使用資料庫連線池,主要是節省開啟或者關閉資料庫連線所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因此用單例模式資料庫的接連池都是一值存在於記憶體中,降低了開關的損耗。同時通過連線池可以管理其中的資料庫連線,可以避免一條資料庫連線同時被多個請求呼叫。
單例模式的效能追求
1.執行緒安全
2.呼叫效率
3.延遲載入
單例模式的實現方法:
1.構造私有
2.靜態例項
3.公開獲取例項的方法
單例模式實現方式
1.懶漢模式:
//懶漢模式簡單實現
public class singleton
//方法不是執行緒安全的
public static singleton getinstance()
return instance;
}}
2. 懶漢模式進化版(實現執行緒安全)
//懶漢模式高階版實現
public class singleton
//給整個getinstance方法加鎖,執行緒安全
public synchronized static singleton getinstance()
//但是如果不需要建立(跳過if語句),而是只需要呼叫instance,則此時還加鎖,效率較低
return instance;
}}
3. 懶漢模式究極版(提高效率)
//懶漢模式究極版實現
public class singleton
public static singleton getinstance()
}} return instance;
}}
但是其實雖然加鎖了還是會出現不安全的情況:
我們以a、b兩個執行緒為例:
a>a、b執行緒同時進入了第乙個if判斷
b>a首先進入synchronized塊,由於instance為null,所以它執行instance = new singleton();
c>由於jvm內部的優化機制,jvm先畫出了一些分配給singleton例項的空白記憶體,並賦值給instance成員(注意此時jvm沒有開始初始化這個例項),然後a離開了synchronized塊。
d>b進入synchronized塊,由於instance此時不是null,因此它馬上離開了synchronized塊並將結果返回給呼叫該方法的程式。
e>此時b執行緒打算使用singleton例項,卻發現它沒有被初始化,於是錯誤發生了。
所以程式還是有可能發生錯誤,其實程式在執行過程是很複雜的,從這點我們就可以看出,尤其是在寫多執行緒環境下的程式更有難度,有挑戰性
4. 餓漢模式
5. 靜態內部類模式//餓漢模式實現
public class singleton
//方法不需要加鎖,效率高
public static singleton getinstance()
}
//靜態內部類模式實現
public class singleton
//構造私有,外部無法通過
private singleton()
public static singleton getinstance()
}
6. 列舉實現單例
基於jvm底層實現,enum天然的就是單例並且執行緒安全。
優點缺點
餓漢式執行緒安全, 呼叫效率高
不能延遲載入
懶漢式執行緒安全, 可以延遲載入
呼叫效率不高
雙重檢測鎖
執行緒安全, 呼叫效率高, 可以延遲載入
-靜態內部類
執行緒安全, 呼叫效率高, 可以延遲載入-列舉
執行緒安全, 呼叫效率高
不能延遲載入
設計模式學習(Java) 單例模式
其實我們在程式設計過程中往往都用到了一些設計模式,只是不知道他們還有具體的名稱定義 翻閱了 設計模式之禪 後,覺得自己有必要系統地了解和學習一下程式設計的原則和一些常用的設計模式。為了加深自己的理解,在此記錄一下。單例模式 顧名思義,就是指某乙個類在程式中只會有乙個例項。為什麼使用單例模式?1 節省...
java單例模式
第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...
Java 單例模式
單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...