單例模式:Java單例模式的幾種寫法及它們的優缺點


總結下Java單例模式的幾種寫法:

1. 餓漢式

public class Singleton
{

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }

}

優點:實現簡單,不存在多線程問題,直接聲明一個私有對象,然后對外提供一個獲取對象的方法。

缺點:class 類在被加載的時候創建Singleton實例,如果對象創建后一直沒有使用,則會浪費很大的內存空間,此方法不適合創建大對象。

 

2. 懶漢式(線程不安全)

public class Singleton
{

    private static Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {

        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

}

優點:節省內存空間,在使用的時候才會創建;

缺點:在多線程下,可能會創建多個實例(一定要重視這個問題,有時候如果在單例對象的構造方法中做了某些重要操作,創建多個實例可能會造成可怕后果,如:打開Android的Sqlite數據庫連接)。

 

3. 懶漢式(線程安全)

public class Singleton
{

    private static Singleton instance = null;

    private Singleton() {}

    public synchronized static Singleton getInstance() {

        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

}

優點:支持多線程,且以懶漢式的方式加載,不浪費內存空間。

缺點:將 synchronized 塊加在方法上,會影響並發量,每次調用getInstance()方法都會線程同步,效率十分低下。最重要的是,當創建好實例對象之后,就不必繼續進行同步了。

 

4.懶漢式(線程安全,推薦)

public class Singleton
{

    private static volatile Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

優點:支持多線程,並發量高,且以懶漢式加載,不浪費內存空間。

缺點:一時找不出缺點,非要說缺點的話,就是實現比較麻煩。

 


免責聲明!

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



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