單例(Singleton)模式的定義:指一個類只有一個實體,且該類能自行創建這個實體的一種模式;這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要實體化該類的物件,
核心代碼:構造方法私有化,private,提供一個靜態的公開對外獲取實體的方法
單例模式有 3 個特點:
- 單例類只有一個實體物件;
- 該單例物件必須由單例類自行創建;
- 單例類對外提供一個訪問該單例的全域訪問點,
單例模式的優點和缺點
單例模式的優點:
- 單例模式可以保證記憶體里只有一個實體,減少了記憶體的開銷,
- 可以避免對資源的多重占用,
- 單例模式設定全域訪問點,可以優化和共享資源的訪問,
單例模式的缺點:
- 單例模式一般沒有介面,擴展困難,如果要擴展,則除了修改原來的代碼,沒有第二種途徑,違背開閉原則,
- 在并發測驗中,單例模式不利于代碼除錯,在除錯程序中,如果單例中的代碼沒有執行完,也不能模擬生成一個新的物件,
- 單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則,
1.懶漢式
public class MyStringUtil {
private static MyStringUtil myStringUtil;
//私有化構造器
private MyStringUtil(){
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
if (myStringUtil == null){
myStringUtil = new MyStringUtil();
}
return myStringUtil;
}
}
懶漢式,就是實體在用到的時候才去創建,比較懶,直到用到的時候才去檢查有沒有創建,有執行緒安全問題,如果剛開始有多個執行緒同時呼叫則會被創建多次,可以加上synchronized,所有又分成了執行緒安全和執行緒不安全兩種寫法
2.餓漢式
public class MyStringUtil {
private static MyStringUtil myStringUtil = new MyStringUtil();
//私有化構造器
private MyStringUtil(){
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
return myStringUtil;
}
}
餓漢式,就是不管有沒有用到,啟動的時候先創建實體,比較勤奮,壞處就是浪費記憶體空間,好處就是沒有執行緒安全問題
3.雙檢鎖
public class MyStringUtil {
private static volatile MyStringUtil myStringUtil;
//私有化構造器
private MyStringUtil(){
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
if (myStringUtil == null){
synchronized (MyStringUtil.class){
if (myStringUtil == null){ //再次檢查有沒有創建
myStringUtil = new MyStringUtil();
}
}
}
return myStringUtil;
}
}
雙檢鎖結合了懶漢式和餓漢式,在創建的時候保證執行緒安全,這樣又保證了執行緒安全,比直接上鎖提高了效率,又節省了空間
4.靜態內部類
public class MyStringUtil {
//私有化構造器
private MyStringUtil(){
}
//沒有系結關系,而且只有被呼叫到時才會裝載,從而實作了延遲加載,
private static class SingletonMyStringUtil{
//靜態初始化器,由JVM來保證執行緒安全
private static MyStringUtil myStringUtil = new MyStringUtil();
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
return SingletonMyStringUtil.myStringUtil;
}
}
靜態內部類,靜態初始化器,由JVM來保證執行緒安全 ,只有被呼叫到時才會裝載,從而實作了延遲加載,
5.列舉
public enum UtilEnm {
StringUtil;
public boolean check(String o) {
return o != null&& "".equals(o);
}
}
列舉自動支持序列化機制,絕對防止多次實體化,
在實際的應用場景中一般用到的懶漢式和雙檢鎖比較多
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239174.html
標籤:其他
上一篇:Shiro安全框架快速入門
下一篇:多執行緒---執行緒死鎖
