確保類只有乙個唯一物件,單件模式

2021-08-16 07:07:18 字數 2334 閱讀 8716

我們為什麼要用到單件模式,當我們用到這些物件如:執行緒池,快取,登錄檔和日誌物件等,事實上,這些物件我們只能有乙個例項,不然會導致很多問題出現,所以我們要將它弄成單件的。

類圖很簡單

class singleton //不允許通過new方式得到例項化物件

//獲取物件唯一方式

static singleton getinstance()

return uniqueinstance;}}

測試類testsingleton

package headfirst.hd.singleton;

public

class testsingleton

}

在乙個單執行緒中執行,這樣已經完美了,但如果有很多個執行緒併發的情況下,那單件可能就不是單件了。

具體分析如下圖

將方法同步,加入synchronized

將getinstance方法封裝成原子性操作

package headfirst.hd.singleton;

public

class

singletonsyn

//將getinstance方法封裝成原子性操作

static

synchronized singletonsyn getinstance()

return uniqueinstance;}}

雖然功能上解決了以上問題,但是每次獲取單件時,都會加鎖,使得其成為累贅,由於上圖我們分析得知,只有第一次獲取單件時候,才會造成多執行緒bug,所有我們改善一下哈

急切式

package headfirst.hd.singleton;

public

class singleton

static singleton getinstance()

}

雙重檢查加鎖
public

class singleton

public

static singleton getinstance()

} }

return uniqueinstance;

} }

為什麼要加關鍵字volatile

參考:主要分以下步驟(使用急切式,畢竟簡單)

【第一步】將構造方法改為私有方法

【第二步】定義靜態變數,並例項化變數

【第三步】提供唯一獲取單件的方法

案例 原來類chocolatebolier

package headfirst.hd.singleton;

public

class

chocolatebolier

public

void

fill()

}public

void

drain()

}public

void

boil()

}public

boolean

isempty()

public

boolean

isboiled()

}

將類chocolatebolier改造為單件

package headfirst.hd.singleton;

//使用急切式,畢竟簡單

public

class

chocolatebolier

//【第三步】提供唯一獲取單件的方法

static chocolatebolier getinstance()

public

void

fill()

}public

void

drain()

}public

void

boil()

}public

boolean

isempty()

public

boolean

isboiled()

}

單例模式,乙個類只能有乙個例項。地球只有乙個。

單例設計模式 單例設計模式就是保證某個類的例項有且只能有乙個不能隨意建立例項。例如 我們只有乙個地球,地球類的例項只能建立乙個。1 為了阻止類例項的new建立,可以做乙個private的建構函式。2 既然不能從外部使用new進行例項的建立,就從類內部進行例項的建立,為此可以提供乙個靜態方法和乙個要建...

利用反射將乙個物件的值轉存到另一物件

工作要求,要將儲存在原物件中的值部分轉存到另一物件,沒有利用反射前的 為 public newlcconttable replace lcconttable mlcconttable 利用反射節省了set get重複書寫 public class clone public static object...

單例設計模式 保證類在記憶體中只有乙個物件

餓漢式和懶漢式的區別 1,餓漢式是空間換時間,懶漢式是時間換空間 2,在多執行緒訪問時,餓漢式不會建立多個物件,而懶漢式有可能會建立多個物件 餓漢式 class singleton 2,建立本類物件 private static singleton s new singleton 3,對外提供公共的...