設計模式之單例

2021-08-15 02:28:20 字數 2038 閱讀 4348

1、概念

2、好處

4、餓漢模式

例項物件hungurysingleton mhuangurysingleton是靜態的,構造方法是私有的,返回物件的方法gethungurysingleton()是靜態的

缺點:無法對hungurysingleton物件進行延時載入,如果需要初始化的資料很多,則無法進行

5、懶漢模式

在多執行緒中建立該懶漢式的例項物件,列印出的hashcode值不一樣說明建立的不是同乙個物件

說明了懶漢式單例模式是失效的,最主要的原因是getinstance方法不是同步的

懶漢式執行緒安全的兩種方式

6、dcl模式,中文名是雙檢查模式

new dclsingleton()不是乙個原子操作,這意味著jvm在檢驗的時候,首先,給new instance分配記憶體,第二步會呼叫dclsingleton()構造方法來初始化變數,第三步會將建立的物件變數指向dclsingleton分配的記憶體空間。但是jvm有這樣乙個缺點,它在即時編譯器中,存在指令重排序的優化,也就是說以上說的三步,不會按照我們所說的順序執行,這時候就會造成執行緒不安全,也會造成報錯。解決方法就是將instance變數設定為volitile就可以了

volatile即可見性,它能保證執行緒在本地不會存有instance的副本,而每次都會到記憶體中去讀取,但事實上這種觀念是不全面的。

實際上,使用volatile這個關鍵字最主要的作用是禁止jvm指令的重排序優化。

volitile這個變數的的賦值操作,會有乙個記憶體屏障,讀操作的時候不會被重操作到記憶體屏障之前,也就是上面所說的步驟1、2、3,不會出現步驟1、3、2的情況

7、靜態內部類

節約jvm給我們的同步控制

通過static執行區塊初始化的控制,這時候就保證資料在記憶體中是獨乙份的

被final欄位修飾後,初始化後它的值就無法被修改,所以final欄位也是執行緒安全的

在內部類裡面建立物件的例項,這樣的話,只要我們的應用中不使用靜態內部類,jvm虛擬機器就不會去載入這個內部類,也就不會去建立我們要建立的單例物件。這時,就完成了懶漢式的延遲載入,同時又通過了static 靜態內部類完成了執行緒安全。

最主要是利用了類中靜態變數的唯一性。

synchronized實際上是非常消耗效能的,乙個執行緒讀取的時候,另乙個執行緒就不能讀取。而靜態內部類就不一樣,它可以同時讀取例項,這樣就提高了效能。

第三個,singleinstance這個類是私有的,除了staticinnersingleton這個類,其它類是訪問不到的

8、列舉類

在預設情況下,列舉類的建立是保證執行緒安全的。如果要在列舉類中新增自己的例項方法,一定要做好子執行緒安全操作,

9、10、安卓中單例的應用

設計模式之 單例設計模式

單例設計模式 單例設計模式概述 單例模式就是要確保類在記憶體中只有乙個物件,該例項必須自動建立,並且對外提供。優點 在系統記憶體中只存在乙個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的物件單例模式無疑可以提高系統的效能。缺點 沒有抽象層,因此擴充套件很難。職責過重,在一定程式上違背了單一...

設計模式之單例設計模式

singleton 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點 類初始化時,立即載入這個物件 沒有延時載入的優勢 載入類時,天然的是執行緒安全的!private static singletondemo1 instance new singletondemo1 private singlet...

設計模式之單例設計模式

目錄 1.到底什麼是設計模式?2.什麼是單例設計模式?3.單列設計模式的兩種實現方式 餓漢式懶漢式 執行緒不安全 4.執行緒安全的寫法 餓漢式懶漢式 執行緒安全 設計模式可以理解為別人成功的故事,通用的套路,前人的經驗,設計模式是一種思想,沒有具體的實現。打乙個比方 世界上只有乙個太陽,乙個月亮,單...