單例模式之懶漢式餓漢式的原理和例項
阿新 • • 發佈:2018-12-31
在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; } }
餓漢式是不需要判斷是否為空的,就會自動建立例項,這樣雖然可以節約時間,但是卻犧牲了空間,在程式啟動時,懶漢式可能會比餓漢式的程式啟動快一點,但是他們各有優卻點。