單例模式及面試

2022-05-07 04:54:07 字數 2235 閱讀 4718

指乙個類只有乙個例項

需要:

(1)私有的構造方法,使其不能在類的外部通過new關鍵字例項化該類物件。

(2)私有的靜態例項化物件,並且將其封裝為private static型別。

(3)對外提供乙個公共的訪問方法並返回該例項物件

第 1 種:餓漢式(立即載入):

餓漢式就是 使用類的時候已經將物件建立完畢(不管以後會不會使用到該例項化物件,先建立了再說。很著急的樣子,故又被稱為「餓漢模式」),常見的實現辦法就是直接new例項化

public

class

singleton

//靜態方法返回該例項

public

static

singleton getinstance()

}

「餓漢式」的優缺點:

優點:  

實現起來簡單,沒有多執行緒同步問題

缺點:

當類singleton被載入的時候,會初始化static的instance,靜態變數被建立並分配記憶體空間,從這以後,這個static的instance對象便一直佔著這段記憶體(即便你還沒有用到這個例項),當類被解除安裝時,靜態變數被摧毀,並釋放所占有的記憶體,因此在某些特定條件下會耗費記憶體。

第 2 種:懶漢式(延遲載入):

該模式的特點類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例

public

class

lazysingleton

//private 避免類在外部被例項化

public

static

synchronized

lazysingleton getinstance()

return

instance;

}}

優點:在多執行緒情形下,保證了「懶漢模式」的執行緒安全

缺點:眾所周知在多執行緒情形下,synchronized方法通常效率低,但是每次訪問時都要同步,會影響效能,且消耗更多的資源,這是懶漢式單例的缺點。

最佳的單例模式的實現:

結合上面兩種單例模式的實現都存在缺陷採用dcl雙檢查鎖機制(dcl:double checked locking) 

public

class

singleton

//靜態方法返回該例項

public

static

singleton getinstance() }}

return

instance;

}}

上面是單例模式的最佳實現方式。記憶體佔用率高,效率高,執行緒安全,多執行緒操作原子性

單例模式只允許建立乙個物件,因此節省記憶體,加快物件訪問速度,因此物件需要被公用的場合適合使用,如多個模組使用同乙個資料來源連線物件等等。如: 

1.需要頻繁例項化然後銷毀的對象。 

2.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。 

3.有狀態的工具類物件。 

4.頻繁訪問資料庫或檔案的對象。

5 當某類需要頻繁例項化,而創建的物件又頻繁被銷毀的時候,如多執行緒的執行緒池、網路連線池等。

面試2 單例模式

為什麼單例 1 在記憶體中只有乙個物件,節省記憶體空間。避免頻繁的建立銷毀物件,可以提高效能。避免對共享資源的多重占用。可以全域性訪問。2 確保乙個類只有乙個例項,自行例項化並向系統提供這個例項 單例需要注意的問題 1 執行緒安全問題 2 資源使用問題 單件模式用途 下面對單件模式的懶漢式與餓漢式進...

面試 c 單例模式

構造是私有的 static csingleton m pinstance public static csingleton getinstance return m pinstance csingleton csingleton m pinstance null 初始化靜態資料成員 intmain ...

面試 單例模式總結

在面試的時候,少不了問單例模式,曾經有一次就被問到 你會幾種單例模式的編寫,當時只答出了普通的懶漢式和餓漢式,之後又問 多執行緒情況下,有考慮怎麼寫嗎,回答說加上鎖實現,卻在寫出來後被指出synchronized位置寫錯了,結果就這樣黯然離開了,唉 所以寫下這篇文章,引以為鑑!懶漢式 即延遲載入 p...