設計模式之建立型 1 單例模式

2021-09-08 20:26:37 字數 1680 閱讀 1310

定義:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

三種寫法:

(1)懶漢式

public class singletonlazy 

public static singletonlazy getinstance()

return instance;

}}

優點:使用時才建立,節約資源

缺點: 執行緒不安全,因為多執行緒環境下,new singletonlazy()可能會執行多次。

改進1:給getinstance()方法加鎖。

public class singletonlazy 

public synchronized static singletonlazy getinstance()

return instance;

}}

問題:多執行緒環境下,雖然能保證單例,但是每個執行緒進入getinstance() 方法時,都會掛起其他的執行緒,即便singletonlazy已經被例項化了,方法也不是立即返回,而synchronzized是有時間代價的,所以效率不高。

改進2:雙重檢查

public class singletondoublecheck 

public static singletondoublecheck getinstance()

}return instance;

}}

優點:多執行緒環境下

1. 執行getinstance()方法時,不需要阻塞,如果singletondoublecheck已經被建立,則方法迅速返回物件例項。這是第一層檢查的的作用。

2. 只在singletondoublecheck未被初始化的時候才加鎖,這是比「改進1」效率高的地方。第二層檢查的作用是保證單例。

問題:new singletondoublecheck()不是乙個「原子操作」,就是說這個操作需要n步才能完成,這裡涉及乙個jvm的話題——指令重排序,這就可能導致先修改了instance的值,再執行真正的構造方法。所以,還是有可能出現乙個執行緒未出這個語句塊時,另乙個執行緒進入。(筆者對這個地方,還不太能解釋清楚,先做個標記,後面完善)

改進3:加volatile

public class singletondoublecheck 

public static singletondoublecheck getinstance()

}return instance;

}}

(2)餓漢式

public class singletonhungry 

public static singletonhungry getinstance()

}

優點:執行緒安全,由jvm load機制保證

缺點:過早浪費資源 

(3) 靜態內部類式(推薦使用)

public class singleton 

private singleton() {}

private static class singletonholder

}

優點:在使用時才建立例項物件,jvm機制。

建立型設計模式(1) 單例模式

動機 有時候只有乙個類的例項是很重要的。比如,乙個系統應該只有乙個視窗管理例項。單例模式是最簡單設計模式 類負責例項化自己,確保只有乙個例項,並且提供乙個訪問這個例項的入口。目的 1.確保只有乙個例項被建立。2.提供訪問這個例項的入口。實現 使用final確保被建立一次,private的建構函式確保...

設計模式 建立型 單例模式 1

有的 寫過,不再想起 有的 複製貼上後,還將回首。上個專案已經進入收尾,利用年前的閒暇,對設計模式進行乙個較為完整的學習。ok,let s go!建立型 單例模式 如果我們需要保證系統內對於某個類最多只能存在乙個例項的時候,我們就會使用單例模式。例如快取池,資料連線池,執行緒池等。在多執行緒環境下,...

設計模式之單例模式(建立型)

單例模式的核心,就是全域性只有乙個例項。下面就每一種建立方式分析其優缺點。1.餓漢式 餓漢式 public class personhungry public static personhungry getinstance 2.靜態 塊public class person private pers...