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)執行效率:餓漢式沒有加任何的鎖,因此執行效率比較高。懶漢式一般使用都會加同步鎖,效率比餓漢式差。
(3)內存使用:餓漢式在一開始類加載的時候就實例化,無論使用與否,都會實例化,所以會占據空間,浪費內存。懶漢式什么時候用就什么時候實例化,不浪費內存。