通過容器實現單例模式

2021-10-22 18:24:44 字數 1592 閱讀 5963

今天再為大家提供乙個實現單例模式的方法,註冊式單例模式。

首先建立乙個容器類,用來盛放建立的單例。

public

class

containersingleton2

private

static map

ioc=

newconcurrenthashmap

<

>()

;public

static object getinstance

(string classname)

catch

(instantiationexception e)

catch

(illegalacces***ception e)

catch

(classnotfoundexception e)

return instance;

}return ioc.

get(classname);}

}

上方**似乎已經實現了單例模式。那麼它到底是否符合執行緒安全,我們來測試一下。

首先建立乙個實體類:

public

class

pojo

我們通過多執行緒建立該實體類的例項,看是否生成的例項符合單例模式的特點。

執行緒類:

public

class

containersinglethread

implements

runnable

}

測試類:

public

class

containersingletest

}

多執行幾次,我們得到的結果如下:

thread-0--

->com.example.singleton.pojo@6a5f10aa

thread-1--

->com.example.singleton.pojo@406851d4

很顯然實際結果與我們想的不一樣。在多執行緒爭奪時,上方**沒辦法保證執行緒安全性。接下來我們對容器類做乙個優化:

ublic class

containersingleton

private

static map

ioc =

newconcurrenthashmap

<

>()

;public

static object getinstance

(string classname)

catch

(exception e)

return instance;}}

}return ioc.

get(classname);}

}

加上雙重校驗。這樣可以保證在多執行緒的情況下保證執行緒的安全性。原因很簡單,從**層看,我們校驗了兩次(!ioc.containskey(classname))。第一次,為了判斷是否競爭鎖。第二次是為了判斷是否建立單例。

單例模式實現

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。1 適用於單執行緒 class singleton public static singleton getinstance return instance 註解 singleton的靜態屬性instance中,只有...

單例模式實現

推薦的單例實現方法 餓漢模式 1種 public class singleton public static singleton getinstance 雙重檢查 volatile關鍵字必須加 public class singleton public static singleton getins...

單例模式實現

什麼是設計模式 設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分類的 設計經驗的總結 使用設計模式的目的 為了 可重用性 讓 更容易被他人理解 保證 可靠性 什麼是單例模式 單例模式是設計模式的一種,也是最簡單的一種,在單例模式中乙個類只能建立乙個例項,這種設計模式可以...