今天我們來說說一個非常常用的模式,單例模式,單例模式讓某個類中有自己的實例,而且只實例化一次,避免重復實例化,單例模式讓某個類提供了全局唯一訪問點,如果某個類被其他對象頻繁使用,就可以考慮單例模式,以下用代碼來分析:
餓漢式單例模式舉例:
/* * 餓漢式單例模式 * 餓漢式的這種單例模式是線程安全的 * 需要根據業務需求來覺得要不要使用餓漢式單例模式 */ public class SingletonHungry { /* * 直接以變量的形式實例化了當前對象,並進行了私有化,(這種方式的話在不管被不被使用,就已經實例化) */ private static SingletonHungry singletonHungry = new SingletonHungry(); public static SingletonHungry getInstance() { return singletonHungry; } public void printlnMethod() { System.out.println("線程安全的餓漢式單例模式..."); } }
懶漢式單例模式
// 懶漢式單例模式 // 懶漢式的這種單例模式是線程不安全的,因為多線程並發性調用就會引發線程不安全問題 // 需要根據業務需求來覺得要不要使用懶漢式單例模式 public class SingletonLazy { /* * 首先申明一個對象變量,變量都是必須私有化 */ private static SingletonLazy singletonLazy = null; public static SingletonLazy getInstance() { if (null == singletonLazy) { singletonLazy = new SingletonLazy(); } return singletonLazy; } public void printlnMethod() { System.out.println("懶漢式單例模式,線程不安全的,因為多線程並發調用會導致線程不安全"); } }
以上的懶漢式單例模式,有不足之處,所以以下這個案例就是解決多線程並發調用引發的不安全問題:
/* * 之前提到的懶漢式單例模式,存在多線程並發調用引發線程不安全問題,現在就增加同步來解決這個問題 */ public class SingletonUpdate { private static SingletonUpdate singletonUpdate = null; public static SingletonUpdate getInstance() { if (null == singletonUpdate) { synchronized (SingletonUpdate.class) { if (null == singletonUpdate) { singletonUpdate = new SingletonUpdate(); } } } return singletonUpdate; } public void printlnMethod() { System.out.println("懶漢式單例模式,線程不安全的,因為多線程並發調用會導致線程不安全 這個是Update升級版...."); }
關於線程的安全問題,對於為什么會出現安全問題,可以看Android-多線程安全問題-synchronized,博客
測試程序:
// 測試程序 public class Main { public static void main(String[] args) { SingletonHungry.getInstance().printlnMethod(); SingletonLazy.getInstance().printlnMethod(); SingletonUpdate.getInstance().printlnMethod(); } }
運行結果:

靜態內部類 單例模式:
package android.java.thread13; /* * 內部靜態類 單例模式 */ class SingletonState { private SingletonState() {} private static class SingletonClass { public static SingletonState singletonState = new SingletonState(); } public static SingletonState getNewInstance() { return SingletonClass.singletonState; } public void printlnMethod() { System.out.println("內部靜態類 單例模式..."); } }
使用 靜態內部類 單例模式:
package android.java.thread13; /** * 使用內部靜態類 單例模式 */ public class Main { public static void main(String[] args) { // new SingletonState(); // 會報錯 ❌ // new SingletonState(參數); // 會報錯 ❌ // 實例化 內部靜態類 單例模式 SingletonState singletonState = SingletonState.getNewInstance(); singletonState.printlnMethod(); } }
打印:

