1. 程式人生 > >java單例模式的理解

java單例模式的理解

單例模式的特點:

    1、單例類只能有一個例項。2、單例類必須自己建立自己的唯一例項。3、單例類必須給所有其他物件提供這一例項。

一、懶漢式單例

[java] view plain copy  print?
  1. //懶漢式單例類.在第一次呼叫的時候例項化自己 
  2. publicclass Singleton {  
  3.     private Singleton() {}  
  4.     privatestatic Singleton single=null;  
  5.     //靜態工廠方法 
  6.     publicstatic Singleton getInstance() {  
  7.          if
     (single == null) {    
  8.              single = new Singleton();  
  9.          }    
  10.         return single;  
  11.     }  
  12. }  
Singleton通過將構造方法限定為private避免了類在外部被例項化,在同一個虛擬機器範圍內,Singleton的唯一例項只能通過getInstance()方法訪問。

(事實上,通過Java反射機制是能夠例項化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)

但是以上懶漢式單例的實現沒有考慮執行緒安全問題,它是執行緒不安全的,併發環境下很可能出現多個Singleton例項,要實現執行緒安全,有以下三種方式,都是對getInstance這個方法改造,保證了懶漢式單例的執行緒安全,如果你第一次接觸單例模式,對執行緒安全不是很瞭解,可以先跳過下面這三小條,去看餓漢式單例,等看完後面再回頭考慮執行緒安全的問題:

在getInstance方法上加同步

[java] view plain copy  print?
  1. publicstaticsynchronized Singleton getInstance() {  
  2.          if (single == null) {    
  3.              single = new Singleton();  
  4.          }    
  5.         return single;  
  6. }

二、餓漢式單例

[java] view plain copy  print?
  1. //餓漢式單例類.在類初始化時,已經自行例項化 
  2. publicclass Singleton1 {  
  3.     private Singleton1() {}  
  4.     privatestaticfinal Singleton1 single = new Singleton1();  
  5.     //靜態工廠方法 
  6.     publicstatic Singleton1 getInstance() {  
  7.         return single;  
  8.     }  
  9. }  
餓漢式在類建立的同時就已經建立好一個靜態的物件供系統使用,以後不再改變,所以天生是執行緒安全的。

餓漢式和懶漢式區別

從名字上來說,餓漢和懶漢,

餓漢就是類一旦載入,就把單例初始化完成,保證getInstance的時候,單例是已經存在的了,

而懶漢比較懶,只有當呼叫getInstance的時候,才回去初始化這個單例。