以Java爲例:多線程
餓漢:函數
public final class VirtualCore { private static VirtualCore gCore = new VirtualCore(); private VirtualCore() { } public static VirtualCore get() { return gCore; } }
懶漢:spa
public final class VirtualCore { private static VirtualCore gCore = null; private VirtualCore() { } public static synchronized VirtualCore get() { if(gCore == null){ gCore = new VirtualCore(); } return gCore; } }
先來看單例模式原理及要求,保證這個類在內存中只有一個對象,那麼就不能隨便給別人new,因此必須把構造函數改成private,而後整一個公共靜態方法供外部統一獲取實例。線程
再來看餓漢以及懶漢定義(原理)以及區別:code
餓漢:一開始就吧吃的找好(對象new出來),隨時能夠吃對象
懶漢:懶得動,餓了(有須要)再去找吃的(new 對象)blog
二者區別在於,餓漢模式拿空間換時間,一開始就把對象生成,在內存中佔着,懶漢則是按需生成。注意的是,多線程訪問的時候,內存
懶漢可能會由於不一樣步建立多個對象,因此獲取單例的方法加上 synchronized字段~get