幾種單例模式總結

2022-09-02 06:09:09 字數 1502 閱讀 7993

面試被要求寫乙個單例模式,想不起來雙重鎖的寫法,就寫了乙個普通的餓漢模式。簡單問題沒答好,面試減去很多分數。回來翻看筆記,重新過了一遍,在部落格中整理記錄一下。

1.懶漢式,執行緒不安全

public

class

lazy

public

static

lazy getinstance()

}

2.懶漢式,執行緒不安全

public

class

lazy

public

static

synchronized

lazy getinstance()

}

3.餓漢式,執行緒安全

public

class

hungry

public

static

hungry getinstance()

}

4.雙重校驗鎖,執行緒安全

由於執行緒安全的懶漢式在任何時候只能有乙個執行緒呼叫 getinstance() 方法,但是同步操作只需要在第一次建立單例例項物件時才被需要,所以它並不高效。這就出現了雙重檢驗鎖來解決這個問題。為什麼在同步塊內要檢驗兩次,因為可能會有多個執行緒一起進入同步塊外的

if,如果在同步塊內不進行二次檢驗的話,阻塞的執行緒獲得鎖之後又會new乙個新的物件,就會生成多個例項了。

public

class

doublelock

public

static

doublelock getsingleton()

return

instance;

}}

這裡對instance使用了volatile關鍵字,主要是用它的禁止指令重排序功能。new singleton()並非是乙個原子操作,在 jvm 中做了下面 3 件事情,

a.給 instance 分配記憶體

b.呼叫 singleton 的建構函式來初始化成員變數

c.將instance物件指向分配的記憶體空間(執行完這步 instance 就為非 null 了)

jvm可能將語句c優化到語句b之前,當乙個執行緒執行完c沒有執行b,然後釋放鎖,另外乙個執行緒獲得鎖,此時判斷instance!=null,直接返回,那就會出錯。

5.靜態內部類,執行緒安全

public

class

inner

private

inner()

public

static

final

inner getinstance()

}

6.列舉,執行緒安全

public

enum

singletonenum

1、懶漢式,執行緒不安全

單例模式幾種實現

1.單執行緒模式下,推薦懶載入 public class singleton1 public static singleton1 getinstance return singleton 2.上述1演示,執行緒不安全,最容易想到的變為執行緒安全的方式就是加關鍵字synchronized public...

單例模式幾種寫法

1.餓漢式 public class singleton public static singleton getinstance 2.懶漢式 public class singleton 雙層檢測鎖 public static singleton getinstance return instanc...

C 幾種單例模式

單例模式 餓漢式 public class singleton 暴露給外部,提供例項。public static singleton getinstance 單例模式 懶漢式 一 public class singleton 暴露給外部,提供例項。public static singleton ge...