各種單例模式的對比分析

2022-08-14 07:03:11 字數 1057 閱讀 2048

先看乙個最簡單的單例模式

public

class

singlea

//獲得例項物件

public

static

singlea getinstance()

}

它的內部進行了三個操作:1.建構函式私有化  2.內部建立乙個類的例項物件  3.提供乙個獲得該類例項物件的方法。

該單例模式又稱為餓漢式,因為該類的例項物件是在程式執行剛開始就被建立出來了,即使程式中的其他地方還未使用到該物件。該種單例模式的缺點也正在此處,我們應該考慮如何讓類的例項在引用到的時候再建立出來,於是就有了另一種單例模式。如下:

public

class

singleb

public

singleb getinstance()

return

singleb;

}}

這種方法相較之前的優點是只會在使用到該類的例項物件時才建立它。但是該種單例模式還有乙個問題,它是執行緒不安全的,當兩個執行緒同時訪問該類的getinatance()方法,發現物件為空之後,都會建立例項物件,也就是說共建立了兩次物件。

當然也有對應的解決方法,一般我們是在getinstance()方法前或者方法內新增synchronized關鍵字來保證每次只會有乙個執行緒訪問,來保證執行緒的安全性。但是這種方法也有安全隱患,當兩個執行緒併發訪問時有可能會造成某個執行緒呼叫該方法返回的是乙個不完整物件的引用。此時可能會產生錯誤!

這時我們就可以考慮使用靜態內部類來實現單例模式:靜態內部類有乙個特點就是 只有在有引用了以後才會被裝載到記憶體中。所以我們可以這樣實現:

public

class

singlec

public

singlec getinstance()

private

static

class

singleholder

}

該種方法是更加完美的懶漢式單例模式。如果你既想要實時載入單例,又想要解決併發問題,就可以考慮這種實現方法。

PHP單例模式對比

user 海峽 date 2020 12 29 time 22 22 class database host dbname try catch pdoexception e 獲取當前容器單例 public static function getinstance config array return...

單例模式的各種姿勢

餓漢式 基於classloder機制避免了多執行緒的同步問題,不過,instance在類裝載時就例項化 public class singleton public singleton getinstance 懶漢式 public class singleton public static synch...

單例模式的各種寫法

1.餓漢式單例模式 classname hungerysingleton description 餓漢式單例模式 author ymj date 2020 07 10 21 55 version v1.0 public class hungerysingleton public static hun...