多執行緒下建立單例例項的方式

2021-10-06 19:34:24 字數 1738 閱讀 8067

單例模式裡有懶漢式和餓漢式,在多執行緒下需要用特殊的方式保證執行緒安全。

下面我用一種方式實現餓漢式單例,兩種方式實現懶漢式單例

多執行緒下餓漢式單例:

//使用final修飾:防止子類覆蓋父類中的方法,破壞單例

public

final

class

singleton

implements

serializable

//建立例項,將其設定為static和final

private

static

final singleton instance=

newsingleton()

;//提供靜態方法獲取建立的例項

public

static singleton getinstance()

//反序列化時,返回自己建立的例項而不是位元組碼生成的例項

public object readresolve()

}

多執行緒下懶漢式單例:dcl方式

public class singleton

//先定義例項化物件為null,並且用volatitle修飾

//加volatile的修飾的原因:因為同步**塊中的指令可能發生指令重排序,因為同步**塊內的構造方法和其賦值的指令,

//如果不加volatitle,這兩個位元組碼指令可能會重排序,即先執行完賦值,再去呼叫構造方法

// 若此時有第二個執行緒來獲取例項,則會產生錯誤(拿到的是沒有呼叫構造前的值)

private static volatile singleton instance=null;

//建立例項的方法

public static singleton getinstance()

synchronized (singleton.class)

instance=new singleton();

return instance;

}

}
去掉注釋:

public

class

singleton

private

static

volatile singleton instance=null;

public

static singleton getinstance()

synchronized

(singleton.

class

) instance=

newsingleton()

;return instance;}}

}

多執行緒下懶漢式單例:使用靜態內部類

public class singleton

//定義靜態內部類,建立例項

private

static

class

lazyholder

//提供獲取例項的方法

public

static singleton getinstance()

}//如何保證其單例的?

//因為靜態內部類對外不可見,其載入方式也是懶漢式的,只有用到其實例時才建立

//比如,若是只使用singleton,而沒有用getinstance(),不會觸發靜態內部類的載入,因而也不會去建立例項

//又由於類載入時建立的例項是jvm完成的,可以由jvm保證其執行緒安全性

多執行緒下的單例

1多執行緒安全單例模式一 不使用同步鎖 1 1 public classsingleton 4 4 private staticsingleton singleton 5 5 6 6 public staticsingleton getinstance 7 7 12 12 returnsinglet...

多執行緒下的單例(靜態類單例)

定義乙個單例model package com.shirt.test author xiaxt date 2018 12 21.public class runmodel private runmodel setisrunning boolean b private runmodel setmess...

多執行緒下的單例模式

單例模式分為兩種 懶漢單例模式和餓漢式單例模式 public class singleton private static singleton single null public static singleton getinstance return single 在單執行緒中,這樣寫,不會存在任...