面試題 單例模式與反射 序列化

2021-10-07 19:44:11 字數 3318 閱讀 1247

餓漢式

立即載入,執行緒安全。

public

class

singleton

;public

static singleton getinstance()

}

懶漢式

延遲載入,執行緒不安全。

public

class

singleton

;public

static singleton getinstance()

return instance;

}}

雙檢鎖(dcl)

延遲載入,執行緒安全。

public

class

singleton

;public

static singleton getinstance()

}}return instance;

}}

靜態內部類

延遲載入,執行緒安全。

靜態內部類屬於被動引用,只有在呼叫時才載入。而jvm的類載入機制會保證只有乙個執行緒成功執行方法,初始化類變數。

public

class

singleton

private

static

class

singletonholder

public

static singleton getinstance()

}

列舉

延遲載入,執行緒安全。

public

class

singleton

//靜態列舉類

static

enum singletonholder

public singleton getinstance()

}//對外暴露的獲取方法

public

static singleton getinstance()

}

單例與反射

反射破壞單例:

public

class

singleton

private

static

class

singletonholder

public

static singleton getinstance()

public

static

void

main

(string[

] args)

throws exception

}

一般而言有兩種解決方案:

一:在私有構造中設定標誌位,進行訪問次數的判斷,限制只能訪問一次建構函式。

public

class

singleton

else

}private

static

class

singletonholder

public

static singleton getinstance()

public

static

void

main

(string[

] args)

throws exception

}

二:直接使用列舉式單例,列舉沒有無參構造,天然單例防反射。

單例與序列化

序列化單例物件,再反序列化也可以破壞單例模式:

解決方案:新增readresolve()方法,在方法中返回單例

原理:在objectinputstream類的readordinaryobject()方法中,對readresolve()方法的存在做了判斷,如果存在,則呼叫該方法獲取返回值作為最終返回。

建立者模式 單例模式 反射 序列化

實現方式 構造器私有,提供乙個外部可以訪問的方法 可以提供例項 1 餓漢式 執行緒安全,呼叫效率高,不能延時載入 2 懶漢式 執行緒安全,呼叫效率不高,可以延時載入 要用的時候才載入 3 雙重鎖檢測式 由於jvm底層內部模型原因,偶爾會出現問題,不建議使用 4 靜態內部類式 執行緒安全,呼叫效率高,...

序列化與單例

當單例模式的類實現了系列化serializable介面,也可以通過反序列化來使它不再單例。我們的單例類 12 3 4 5 6 7 8 9 10 11 12 publicfinalclasssingletonimplementsserializable publicstaticsingleton ge...

單例設計模式 序列化破壞單例模式?

1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...