單例模式的五種實現

2021-09-24 21:41:27 字數 2021 閱讀 6310

1.1懶漢式,執行緒不安全

/*

* 單例模式在多執行緒的 應用場合下必須小心使用。

* 如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從

* 而同時各自建立了乙個例項, 這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。

* 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。

* */

public class singleton

//提供獲取單例的方法

public static singleton getinstance()

return instance;

}}

這種寫法是明顯的lazy loading,當不需要用到單例物件的時候,不會例項化物件。但是致命的缺點是在多執行緒環境下不能正常工作。 

1.2懶漢式,執行緒安全。

public class singleton 

//提供獲取單例的方法

public static synchronized singleton getinstance()

return instance;

}}

這種寫法既能夠在多執行緒環境中很好的工作,而且看起來它也具備很好的lazy loading,但是,遺憾的是,效率很低,99%情況下不需要同步。

在開發中,如果某個例項的建立需要消耗很多系統資源,那麼我們通常會使用惰性載入機制,也就是說只有當使用到這個例項的時候才會建立這個例項,這個好處在單例模式中得到了廣泛應用。這個機制在single-threaded環境下的實現非常簡單,然而在multi-threaded環境下卻存在隱患。本文重點介紹惰性載入機制以及其在多執行緒環境下的使用方法

2、餓漢式(基於classloader機制,但不能懶載入)

/**

* 餓漢模式實現單例模式,不能實現懶載入

* 在類載入階段就進行了例項化

* @author hp

* */

public class singletonehan

//靜態工廠模式例項化物件

public static singletonehan getinstance()

}

3、靜態內部類實現

/**

* 通過靜態內部類實現單例模式,可以實現懶載入

* @author hp

* */

public class singletoninnerclass

public singletoninnerclass()

public static singletoninnerclass getinstance()

}

4、列舉類實現(最佳方法)

/**

* 通過列舉實現的單例模式

* 不僅能實現多執行緒的同步

* 還能防止反序列化建立不同的例項

* 目前認為的最佳實現單例模式的方法

* 列舉類內部實現了public static final

* 並預設呼叫了私有無參構造器

* @author hp

* */

public enum singtonmeiju

}

5、雙重檢查鎖(dcl)

/**

* 雙重檢查鎖實現單例模式

* @author hp

* */

public class singtondcl

public static singtondcl getinstance()

}} return instance;

}}

值得一看:

五種單例模式實現

public class hunger private final static hunger hunger newhunger public static hunger getinstance 多個執行緒安全,但無法進行懶載入,如果類成員很多,則占用的資源比較多 public class lazy...

單例模式的五種實現方式

1.最容易想到的方式 public class singleton public static singleton getinstance public static void main string args 優點是 簡單 缺點是 無論用沒用到instsnce,都會進行初始化。2.延遲載入 laz...

單例模式的五種實現方式

單例模式 無論在什麼時候,該類只有乙個例項。實現單例模式的要點就是提供乙個私有的無參建構函式。一 餓漢單例模式public class singleobject public static singleobject getinstance 二 懶漢單例模式 懶漢的意思就是慢悠悠的,不著急,也就是在呼...