單例模式之
幾種單例模式對比
單例模式是一種常用的設計模式,在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的乙個類只有乙個例項。即乙個類只有乙個物件的例項。比如:銀行atm系統對於bank這個類的話,就需要使用單例模式,來保證銀行只有乙個。
由於單例模式只生成乙個例項,減少了系統效能的開銷,當乙個物件的產生需要較多的資源時,如讀取配置,產生其他依賴物件時,則可以通過在應用啟動的時候直接產生乙個單例物件,然後永久駐留記憶體的方式來解決。
單例模式可以在系統設定全域性的訪問點,優化共享資源訪問。例如可以設計乙個單例類,負責所有資料表的對映
1.將類的構造方法私有化,保證只能呼叫該類提供的靜態方法來獲得該類的唯一例項。
2.在該類中提供乙個靜態方法,呼叫該方法時判斷該類的例項是否存在,存在就將例項返回,否則就建立該類的例項
public
class
singletondemo1
//方法沒有同步,呼叫效率高
static singletondemo1 getinstance()
}
測試**一
public
class
client
}
執行結果一
通過比較可以兩個是同乙個物件。餓漢,餓漢!關鍵就是乙個餓字。舉個例子,做飯。大早上的就把今天一天要吃的早餐,中餐晚餐都提前做好。在這裡的話,雖然暫時不需要使用這個物件,但是提前就建立好了,這就是餓漢式。
public
class
singletondemo2
//方法同步,呼叫效率低
public
static
synchronized singletondemo2 getinstance()
return instance;
}}
測試**二
public
class
client
}
測試結果二
同樣的通過比較,兩個還是同一物件。懶漢,懶漢,關鍵乙個懶字。舉個例子,同樣也是做飯。還沒到中午,但是懶的提前做中餐,等到了中午再做吧。這裡的話,懶的建立物件,等用到這個物件的時候再來建立這個物件,這就是懶漢式。
懶漢式與餓漢式相反,可以對比著理解。
public
class
singletondemo3
public
static singletondemo3 getinstance()
private
singletondemo3()
}
測試**三
public
class
client
}
測試結果三
靜態內部類實現單例模式,這種方式,執行緒安全,呼叫效率高,並且也實現了延時載入。
注意:1.外部並沒有static屬性,則不會像餓漢式那樣立即載入物件
2.只有真正呼叫getinstance()才會載入靜態內部類。載入時是執行緒安全的。
3.instance是static final 型別,保證了記憶體中只有這樣乙個例項存在,而且只能賦值一次,從而保證執行緒安全
4.兼備了高併發和延時載入的優勢
public
enum singletondemo4
}
測試**四
public
class
client
}
測試結果四
建立10個執行緒,每個執行緒執行100000000次,每次都去獲得instance物件。
public
class
client2
countdownlatch.
countdown()
;}})
.start()
;}countdownlatch.
await()
;//main執行緒阻塞,直到計數器變為0,才會繼續往下執行
long end = system.
currenttimemillis()
; system.out.
println(+
(end-start));
}}
測試結果
餓漢式
懶漢式
靜態內部類
列舉
餓漢式:執行緒安全,呼叫效率高,不能延時載入
懶漢式:執行緒安全,呼叫效率不高,但是可以延時載入
靜態內部類式:執行緒安全,呼叫效率高,也可以延時載入
列舉式:執行緒安全,呼叫效率高,並且可以天然防止反射和反序列化漏洞
當 單例物件 占用資源少,不需要延時載入: 列舉式 好於 餓漢式
當 單例物件 占用資源大,需要延時載入: 靜態內部類式 好於 懶漢式
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...