Android-Java單例模式
阿新 • • 發佈:2019-01-07
今天我們來說說一個非常常用的模式,單例模式,單例模式讓某個類中有自己的例項,而且只例項化一次,避免重複例項化,單例模式讓某個類提供了全域性唯一訪問點,如果某個類被其他物件頻繁使用,就可以考慮單例模式,以下用程式碼來分析:
餓漢式單例模式舉例:
/* * 餓漢式單例模式 * 餓漢式的這種單例模式是執行緒安全的 * 需要根據業務需求來覺得要不要使用餓漢式單例模式 */ public class SingletonHungry { /* * 直接以變數的形式例項化了當前物件,並進行了私有化,(這種方式的話在不管被不被使用,就已經例項化) */ privatestatic 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(); } }
列印: