設計模式之單例模式

2021-08-14 18:49:56 字數 1931 閱讀 4453

什麼是單例模式?

在我們生活中,有很多物件是只能存在的乙個的,比如,世界上只有乙個太陽,乙個國家只能有乙個正的主席(**),乙個公司只有乙個正的董事長、ceo。這些都是單例模式在我們生活中的體現。單例模式讓我們的這個對從頭到尾都是同乙個,保證了屬性不變,這樣可以節約資源,不用花費多餘的空間去新建物件。

單例模式的特性

1、單例類只能有乙個例項。

2、單例類必須自己建立自己的唯一例項。

3、單例類必須給所有其他物件提供這一例項。

單例模式的實現形式有很多種,下面我們乙個乙個的介紹!

懶漢式,執行緒不安全

public class singleton 

public static singleton getinstance()

return instance;

}}

懶漢式,執行緒安全

public class singleton 

public static synchronized singleton getinstance()

return instance;

}}

對比上面的兩個單例模式的寫法,後面乙個相對於前面加了乙個同步,保證了在同一時刻,只有乙個執行緒能夠訪問這個程式,保證了執行緒的安全。但是上面這個雖然保證了執行緒的安全,解決了多個例項的問題,但是它的效率並不高。因為在任何時候只能有乙個執行緒呼叫getinstance()方法。但是同步只需要第一次呼叫時才被需要,即第一次建立單例物件時。這就引出了雙重檢驗鎖。

雙重檢驗鎖,執行緒安全

public class singleton 

public static singleton getinstance() }}

return instance;

}}

雙重鎖保證了當多個執行緒進入同步塊外的if,經過二次檢測,保證最後只有乙個執行緒進入內部。第一句加的volatile保證各原子性,因為在執行 instance= new singleton()這句時,jvm做了一下三件事:

1、給instance分配記憶體;

2、呼叫singleton的建構函式來初始化成員變數;

3、將instance物件指向分配的記憶體空間(執行完這一步instance就不是null了)

餓漢式

public class singleton

public static singleton getinstance()

}

這種方法簡單粗暴,猶如名字,在剛開始的時候我就把你初始化,即使你還沒有呼叫getinstance()方法;這樣導致它在某些場合是無法使用的,比如說建立例項需要依賴引數或者配置檔案,那就無法使用了。

靜態內部類

public class singleton   

private singleton (){}

public static final singleton getinstance()

}

這種寫法仍然使用jvm本身機制保證了執行緒安全問題;由於singletonholder 是私有的,除了 getinstance() 之外沒有辦法訪問它,因此它是懶漢式的;同時讀取例項的時候不會進行同步,沒有效能缺陷;也不依賴 jdk 版本。

列舉

public enum singleton  

}

這種方法我第一眼看到就喜歡上了,面試的時候,寫出這玩意兒太容易了!它自動支援序列化機制,絕對防止多次例項化。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...