單例就是該類只能返回乙個例項。 單例所具備的特點: 1.私有化的建構函式 2.私有的靜態的全域性變數 3.公有的靜態的方法 單例分為懶漢式、餓漢式和雙層鎖式
/**懶漢式比較懶,只有當呼叫getinstance的時候,才回去初始化這個單例
* @author dym
* @date 2020/12/20 16:07
*/public class lazy
; private static lazy lazy = null;
public static lazy getinstance(
)return lazy;
}}
執行結果
所謂懶漢式,就是程式比較懶,只有需要他的時候,才會建立物件,如果有了,就不在建立,這個類的建構函式一定是私有的。所以在建立物件時,需要進行檢查,所以這時候很慢,一旦物件完成建立,載入類時,速度很快。至於餓漢式,就是這個類時刻準備著,一旦載入這個類,立馬建立物件,所有類很多的時候,載入顯的程式執行緩慢,這個類的建構函式也是私有的。
/**餓漢式就是類一旦載入,就把單例初始化完成,保證getinstance的時候,單例是已經存在的了
* @author dym
* @date 2020/12/20 16:09
*/public class hungry
private static hungry hungry = new hungry();
public static hungry getinstance(
)}
執行結果:
1、執行緒安全:
餓漢式天生就是執行緒安全的,可以直接用於多執行緒而不會出現問題,
懶漢式本身是非執行緒安全的,為了實現執行緒安全有幾種寫法。(如雙層鎖模式)
/**雙層鎖
*是否 lazy 初始化:是
*是否多執行緒安全:是
*實現難度:易
*描述:這種方式具備很好的 lazy loading,能夠在多執行緒中很好的工作,但是,效率很低,99% 情況下不需要同步。
*優點:第一次呼叫才初始化,避免記憶體浪費。
*缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。
*getinstance(
) 的效能對應用程式不是很關鍵(該方法使用不太頻繁)。
* @author dym
* @date 2020/12/20 16:11
*/public class doublelock
private static doublelock doublelock ;
public static doublelock getinstance()}
}return doublelock;
}}
單例模式 懶漢式 和 餓漢式
單例模式三要素 a 私有構造方法 這樣外界就沒辦法建立物件 b 私有靜態引用指向自己例項 c 以自己例項為返回值的公有靜態方法 對外暴露介面獲取例項 在spring中建立的bean例項預設都是單例模式存在的。所謂 懶漢式 與 餓漢式 的區別,是在與建立單例物件的時間不同。懶漢式 是在你真正用到的時候...
單例模式 餓漢式和懶漢式
1.單例模式。singleton無論外界有多少物件都是乙個指向同乙個位址。節約空間。1 構造方法私有化 2 在本類中建立乙個static修飾的物件。3 所有的屬性必須私有化。4 通過乙個方法來把本類中建立的該物件返回。2.餓漢式 指全域性的單例例項在類裝載時構建。class people publi...
單例模式(餓漢式和懶漢式)
單例模式 餓漢式和懶漢式 餓漢式單例模式,static表變數會在裝載時初始化,不會涉及多個執行緒物件訪問該物件的問題,虛擬機器只會保證裝載一次該類,不會發生併發的問題,可以省略synchronized關鍵字 缺點 如果只是載入本類,而不是呼叫getinstance方法,永遠不呼叫,則會造成資源浪費的...