面試 單例模式總結

2021-10-06 22:52:59 字數 1297 閱讀 7402

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

// 懶漢式 即延遲載入

public

class

singletoninstance

public

static singletoninstance getinstance()

return instance;

}}

// 餓漢式 即立即載入

public

class

singletoninstance

public

static singletoninstance getinstance()

}

單例模式,一定要注意:私有靜態變數、私有構造方法、公共獲取方法

在集群環境下,如果還像上述方式寫,就無法保證單例,因為多執行緒。在這種情況下,我們可以新增synchronized,以此來保證單例。

下面我先貼出曾經面試時錯誤的寫法:

public

class

singletoninstance

public

static

synchronized singletoninstance getinstance()

return instance;

//第三步

}}

上面這種寫法雖然加了synchronized 關鍵字,但並沒有真正起作用,比如:a執行緒走到第一步,b執行緒走到了第二步,即剛建立卻但還沒有返回,這時a執行緒就會繼續走到第二步,這樣就無法保證單例。

下面是正確的寫法:

首先判斷是否存在例項,如果不存在,就加鎖建立例項,當a執行緒走到第一步,b執行緒走到第二步,a執行緒和b執行緒此時不衝突,都繼續往下走,當b執行緒走到第三步時,就已經鎖住物件,之後再判斷是否已有執行緒走過第四步,即是否已經建立物件例項,如果沒有,則走第四步,建立例項。

public

class

singletoninstance

public

static singletoninstance getinstance()

}}return instance;

}}

面試題總結 設計模式 單例模式

單例模式的優缺點 在程式編寫上,一般將單例模式分為兩種,分別是餓漢式和懶漢式,餓漢式 在類載入時就完成了初始化,所以類載入比較慢,但獲取物件的速度快。懶漢式 在類載入時不初始化,等到第一次被使用時才初始化。餓漢式 可用 public class singleton public static sin...

單例模式總結

三種實現單例模式的對比 1.volatile關鍵字不但可以防止指令重排,也可以保證執行緒訪問的變數值是 主記憶體中的最新值 有關volatile的詳細原理,我在以後的漫畫中會專門講解。2.使用列舉實現的單例模式,不但可以防止利用反射強行構建單例物件 可以而且在列舉類物件被 反序列化 的時候,保證反序...

單例模式總結

單例模式的使用有乙個必要的條件,在乙個系統要求乙個類只有乙個例項時才應當使用單例模式。在懶漢式單例的時候為什麼要進行執行緒的控制呢?package 單例模式.懶漢模式 public class lazysingleton synchronized public lazysingleton getin...