設計模式系列(六)單例模式的五種實現

2021-09-24 06:04:11 字數 2232 閱讀 4845

參考:

對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務;乙個系統只能有乙個視窗管理器或檔案系統;乙個系統只能有乙個計時工具或id(序號)生成器。

單例模式可以使整個系統擁有乙個全域性的物件,方便資源的共享和系統行為的協調。

一:餓漢式

public class singleton 

public static getsignleton()

}

餓漢式是最簡單的,在類載入的時候就被建立,也沒有多執行緒的問題,

但是不能滿足延遲載入的需求

二:懶漢式:

public class singleton 

public void dosomething()

//加鎖

public static synchronized singleton getinstance()

return singleton;

}}

懶漢式在用的的時候才考慮第一次建立物件,但是這裡會有多執行緒的問題,多以用synchronized給方法加鎖,

但是這裡每次訪問的時候都是synchronized的,效能會有影響,所以有了第三種

三:雙重檢查鎖鎖(double checked locking)

public class singleton 

public void dosomething()

//加鎖

public static singleton getinstance() }}

return singleton;

}}

這裡面解釋一下:

1.為什麼synchronized內部就還要再檢查一次

因為在乙個執行緒進入synchronized內部的時候,另外乙個可能進了第一層if了,所以在鎖起來的**內部還要再判斷一次

2.為什麼要用volatile修飾singleton

volatile關鍵字可以保證有序性,如果不加這個關鍵字的話,可能乙個執行緒在synchronized內部new 但還沒執行完,另外乙個執行緒得到的例項雖然不為null,但是並沒有初始化

singleton = new singleton()  這條命令執行分為三部分

1.為物件分配記憶體

2.執行構造方法語句,初始化例項物件

3.把singleton的引用指向分配的記憶體空間

如果指令重拍為132,則多執行緒情況下就會有問題!

上面三種方式是傳統的單例模式實現方式

四:靜態內部類

public class singleton 

public void dosomething()

public static singleton getinstance()

private static class singletonholder

}

當外部類被載入時,其金泰內部類不會被載入,只有當呼叫singleton.getinstance()方法時,才會載入singletonholder並且初始化其成員變數。而類載入時是執行緒安全的。這樣既保證了延遲載入,也保證了執行緒安全,同時也簡化了**量。

五 列舉單例

參考:好處:

1.例項的建立執行緒安全,確保單例

2.防止被反射建立多個例項

3.沒有序列化的問題

/**

* 使用列舉的單例模式

* * @author yzl

* @see [相關類/方法](可選)

* @since [產品/模組版本] (可選)

*/public class enumsingleton

public static enumsingleton getinstance()

private static enum singleton

public enumsingleton getinstance()

}}

public static void main(string args)

(六)設計模式 單例模式

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。注意 head first 中提到單例模式的時候,類建構函式為私有 private 通過靜態方法建立例項。剛解放時,國家需要人,人多力量大,於是乙個老百姓可能生了很多娃,於是人口迅速暴增。後來實行了計畫生育,規定了一對夫婦最多只能生育一胎,並把...

設計模式系列 單例模式

單例模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。什麼情況下需要單例模式?一些類提供公共功能供別人呼叫,本身不會處理業務邏輯 類會被許多類和執行緒呼叫 單例模式的一些注意點 單例的生存期超長,會導致記憶體的持續占用。單例在多執行緒環境需要小心的處理執行緒互斥,進行資源保護。單例在類的繼承樹中...

設計模式系列 單例模式

單例模式就是指單例類在一定的生命週期內只能有乙個物件例項,單例類的建立必須是本身,並能給使用者提供自身。在現實世界中,每個生命體都可以被看做是乙個單例物件,唯一且具體,具有不可複製性。同樣的,在軟體開發領域中,有時我們需要保證客戶端在當前的客戶機上只能執行乙個例項這個時候,我們就應該考慮使用單例模式...