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();
    }

}

 

打印:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM