1. 程式人生 > >Android-Java單例模式

Android-Java單例模式

今天我們來說說一個非常常用的模式,單例模式,單例模式讓某個類中有自己的例項,而且只例項化一次,避免重複例項化,單例模式讓某個類提供了全域性唯一訪問點,如果某個類被其他物件頻繁使用,就可以考慮單例模式,以下用程式碼來分析:

餓漢式單例模式舉例:

/*
 *  餓漢式單例模式
 *  餓漢式的這種單例模式是執行緒安全的
 *  需要根據業務需求來覺得要不要使用餓漢式單例模式
 */
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();
    }

}

 

列印: