单例模式之懒汉式/饿汉式/结合二者之优的模式
單例模式主要用來產生一個對象的具體實例,它可以確保系統中一個類只產生一個實例。
兩個好處:
- 對于頻繁使用的對象,可以省略new操作花費的時間
- new的次數少了,對系統內存的使用頻率就小了,那么GC壓力就會降低,縮短了GC停頓時間
餓漢式單例模式:
public class Singleton {private Singleton() {System.out.println("Singleton iscreate");}private static Singleton instance = new Singleton();private static Singleton getInstance() {return instance;} }私有化構造方法的作用:不能new這個類的實例,從而避免該類被錯誤的創建
因此要想獲取這個對象,只能調用getInstance()工廠方法,構造方法被私有化,要想這個方法可以被調用,所以這個方法必須用static修飾,調用方式:類.方法名
從而instance也必須用static修飾。
好處:性能非常好,getInstance()方法只是簡單的返回instance,并沒有任何鎖操作,所以在并行程序中它會有很好的表現
壞處:Singleton構造函數或者說Singleton實例在什么時候創建是不受控制的,對于靜態成員instance,它會在類第一次初始化的時候被創建,并不是第一次調用getInstance()方法的時候被創建的
延伸一點:static修飾的成員變量所屬類被加載的時候,變量間會被分配空間,及就會被創建
懶漢式單例模式:
public class LazySingleton {private LazySingleton() {System.out.println("LazySingleton is create");}private static LazySingleton instance = null;private static synchronized LazySingleton getInstance() {if (instance == null)instance = new LazySingleton();return instance;} }私有化構造方法的作用:不能new這個類的實例,從而避免該類被錯誤的創建
只有當調用getInstance()方法時才會創建單例對象,為了防止對象被多次創建,還須要使用synchronized進行方法同步
好處:充分利用了延遲加載,只有在真正需要時才會創建對象
壞處:并發環境下加鎖,競爭激烈的場合對性能會產生一定影響
另外還有一種,雙重判斷加雙同步(安全又高效):
public class SingleTon {private static volatile SingleTon singleTon = null;private SingleTon() {}public static SingleTon getInstance() {if (singleTon == null) {synchronized (SingleTon.class) {if (singleTon == null) {singleTon = new SingleTon();}}}return singleTon;} } 為什么雙重判斷: 如果單層if判斷,在服務器允許的情況下,假設有一百個線程,耗費的時間為100*(同步判斷時間+if判斷時間),而如果雙重if判斷,100的線程可以同時if判斷,理論消耗的時間只有一個if判斷的時間。 所以如果面對高并發的情況,而且采用的是懶漢模式,最好的選擇就是雙重判斷加同步的方式。轉載于:https://www.cnblogs.com/java-spring/p/9075670.html
總結
以上是生活随笔為你收集整理的单例模式之懒汉式/饿汉式/结合二者之优的模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows版本jenkins部署dj
- 下一篇: 217. Contains Duplic