單例模式中的懶漢模式和餓漢模式是什麼?區別又是什麼?
阿新 • • 發佈:2022-04-01
1.懶漢模式:顧名思義,他是一個懶漢,他不願意動彈。什麼時候需要吃飯了,他就什麼時候開始想辦法搞點食物。
即懶漢式一開始不會例項化,什麼時候用就什麼時候new,才進行例項化。
2.餓漢模式:顧名思義,他是一個餓漢,他很勤快就怕自己餓著。他總是先把食物準備好,什麼時候需要吃了,他隨時拿來吃,不需要臨時去搞食物。
即餓漢式在一開始類載入的時候就已經例項化,並且建立單例物件,以後只管用即可。
3.懶漢式程式碼實現:
public class Singleton { //預設不會例項化,什麼時候用就什麼時候new private static Singleton instance = null; private Singleton(){ } public static synchronized Singleton getInstance(){ if(instance == null){ //什麼時候用就什麼時候new instance = new Singleton(); } return instance; } }
4.餓漢式程式碼實現:
public class Singleton { //一開始類載入的時候就例項化,建立單例項物件 private static Singleton instance = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return instance; } }
5.懶漢式和餓漢式的安全和效能區別:
(1) 執行緒安全:餓漢式線上程還沒出現之前就已經例項化了,所以餓漢式一定是執行緒安全的。懶漢式載入是在使用時才會去new 例項的,那麼你去new的時候是一個動態的過程,是放到方法中實現的,比如:
public static synchronized Singleton getInstance(){
if(instance == null){
//什麼時候用就什麼時候new
instance = new Singleton();
}
如果這個時候有多個執行緒訪問這個例項,這個時候例項還不存在,還在new,就會進入到方法中,有多少執行緒就會new出多少個例項。一個方法只能return一個例項,那最終return出哪個呢?是不是會覆蓋很多new的例項?這種情況當然也可以解決,那就是加同步鎖,避免這種情況發生 。
(2)執行效率:餓漢式沒有加任何的鎖,因此執行效率比較高。懶漢式一般使用都會加同步鎖,效率比餓漢式差。