Java單例模式

2021-09-18 05:06:35 字數 1644 閱讀 6283

單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

實現單例模式的思路是:乙個類能返回物件乙個引用(永遠是同乙個)和乙個獲得該例項的方法(必須是靜態方法,通常使用getinstance這個名稱);當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用;同時我們還將該類的建構函式定義為私有方法,這樣其他處的**就無法通過呼叫該類的建構函式來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項。

單例模式在多執行緒的應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。

public class singleton 

public static getsingleton()

}

餓漢法線程不安全,且無法做到延遲建立物件

public class singleton 

//在第一次獲取例項時建立物件,可能有多個執行緒同時進入if語句,執行緒不安全。

public static singleton getsingleton()

}

public class singleton 

public static singleton getsingleton()

}return singleton;

}

}

public class singleton 

public static singleton getsingleton()}}

return singleton;

}

}

singleton = new singleton();**的執行分為三個步驟:

為singleton分配記憶體空間

初始化singleton

將singleton指向分配的記憶體位址

但是由於jvm指令重排的特性,有可能先執行3再執行2,這樣可能導致乙個執行緒獲得還未初始化的例項。使用volatile可以禁止指令重排,在多執行緒下正常執行。

public class singleton 

private singleton(){}

public static singleton getsingleton()

}

使用靜態內部類,當singleton類載入時,靜態內部類沒有被載入進記憶體。只有當呼叫getsingleton()方法從而觸發holder.singleton時,holder才會被載入。此時初始化例項,實現了懶載入(延遲初始化)且jvm提供了執行緒安全的支援。

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的靜態方法,可...

Java單例模式

單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...