一、定義
保證一個類僅有一個實例,並提供一個可以訪問它的全局訪問點。
二、單例目前分類
1.餓漢模式
很好理解,餓漢就是十分着急要吃的,也就是迫切的創建對象,程序一加載就創建好了對象,等着被使用。可以想象當程序一旦加載,會有着大量單例對象被創建,等待被使用,如果沒有用到的話,將是一種資源的浪費,所以餓漢模式必須確定該對象會被使用。
2.懶漢模式
同理,懶漢則是當你使用的時候,纔去創建對象來使用。即延時加載,保證了創建的對象必然會被使用到。
三、代碼實例
保證多線程情況下只創建一個實例化對象。分別用餓漢式和懶漢式實現
懶漢式單例類:
public class LazySingleton { //volatile阻止進行寫操作的時候,不會進行讀操作 private static volatile LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { //防止多線程下,每次都加鎖 if (instance == null) { synchronized (LazySingleton.class) { //防止多線程下創建多個實例 if (instance == null) { instance = new LazySingleton(); } } } return instance; } public void show() { System.out.println("懶漢式單例"); } }
餓漢式單例類:
public class HungrySingleton { //私有靜態內部類 private static class SingletonHolder { private static final HungrySingleton INSTANCE = new HungrySingleton(); } private HungrySingleton() { } public static HungrySingleton getInstance() { /*SingletonHolder被加載的時機也就是在getInstance()方法第一次被調用的時候 避免了過早初始化,造成資源的浪費*/ return SingletonHolder.INSTANCE; } public void show() { System.out.println("餓漢式單例"); } }
測試類:
public class Test { public static void main(String[] args) { HungrySingleton instance = HungrySingleton.getInstance(); instance.show(); LazySingleton instance1 = LazySingleton.getInstance(); instance1.show(); } }