java單例模式的理解
阿新 • • 發佈:2019-01-23
單例模式的特點:
1、單例類只能有一個例項。2、單例類必須自己建立自己的唯一例項。3、單例類必須給所有其他物件提供這一例項。
一、懶漢式單例
[java] view plain copy print?- //懶漢式單例類.在第一次呼叫的時候例項化自己
- publicclass Singleton {
- private Singleton() {}
- privatestatic Singleton single=null;
- //靜態工廠方法
- publicstatic Singleton getInstance() {
-
if
- single = new Singleton();
- }
- return single;
- }
- }
(事實上,通過Java反射機制是能夠例項化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)
但是以上懶漢式單例的實現沒有考慮執行緒安全問題,它是執行緒不安全的,併發環境下很可能出現多個Singleton例項,要實現執行緒安全,有以下三種方式,都是對getInstance這個方法改造,保證了懶漢式單例的執行緒安全,如果你第一次接觸單例模式,對執行緒安全不是很瞭解,可以先跳過下面這三小條,去看餓漢式單例,等看完後面再回頭考慮執行緒安全的問題:
在getInstance方法上加同步
[java] view plain copy print?- publicstaticsynchronized Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
二、餓漢式單例
[java] view plain copy print?-
//餓漢式單例類.在類初始化時,已經自行例項化
- publicclass Singleton1 {
- private Singleton1() {}
- privatestaticfinal Singleton1 single = new Singleton1();
- //靜態工廠方法
- publicstatic Singleton1 getInstance() {
- return single;
- }
- }
餓漢式和懶漢式區別
從名字上來說,餓漢和懶漢,
餓漢就是類一旦載入,就把單例初始化完成,保證getInstance的時候,單例是已經存在的了,
而懶漢比較懶,只有當呼叫getInstance的時候,才回去初始化這個單例。