1. 程式人生 > >單例模式之懶漢式餓漢式的原理和例項

單例模式之懶漢式餓漢式的原理和例項

在java面試題當中,我們經常會遇到單例模式的懶漢式和餓漢式的java筆試題,甚至面試官會問你在開發中,是否用上了這兩種開發模式,用在了哪些例子當中。想了解我們在開發中是否用上了這個,需要我們對這種兩種開發模式的原理有所瞭解。

懶漢式就是當用戶需要用到這個例項的時候,才會加載出來,以下是懶漢式的簡單示例:

//懶漢式
public class Singleton {
 private Singleton(){}
 private static Singleton singleton = null;
 public static Singleton getInstance(){
  if(singleton == null){
   singleton = new Singleton();
  }
  return singleton;
 }
}

從上面的例子可以看出,懶漢式需要有一個判斷java物件是否為空的if語句,如果物件為空,才會建立這個物件例項。

我們都知道如果不是原子性的操作,又有共享物件,在多個執行緒同時執行的情況下,就會出現執行緒不安全現象,顯然,懶漢式的單利模式並不是原子性的,所以為了安全,我們常常需要給懶漢加入同步鎖synchronized,程式碼如下:

//帶有同步鎖synchronized的懶漢式
public class Singleton {
 private Singleton(){}
 private static Singleton singleton = null;
 public static synchronized Singleton getInstance(){
    if(singleton == null){      
       singleton = new Singleton();
    }
  return singleton;
 }
}

下面再來看看餓漢式的單例模式:

//餓漢式
public class Singleton {
 private Singleton(){}
 private static Singleton singleton = new Singleton();
 public static Singleton getInstance(){
  return singleton;
 }
}

 餓漢式是不需要判斷是否為空的,就會自動建立例項,這樣雖然可以節約時間,但是卻犧牲了空間,在程式啟動時,懶漢式可能會比餓漢式的程式啟動快一點,但是他們各有優卻點。