java單例模式的實現方式,java模式實現方式

來源:互聯網
上載者:User

java單例模式的實現方式,java模式實現方式

一、什麼是單例模式

    

    單例:保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。

    單例模式是一種常用的軟體設計模式之一,其目的是保證整個應用中只存在類的唯一個執行個體。

    比如我們在系統啟動時,需要載入一些公用的配置資訊,對整個應用程式的整個生命週期中都可見且唯一,這時需要設計成單例模式。如:spring容器,session工廠,緩衝,資料庫連接池等等。

 

    
    

 

二、如何保證執行個體的唯一

 

        1)防止外部初始化

 2)由類本身進行執行個體化

 3)保證執行個體化一次

 4)對外提供擷取執行個體的方法

 5)安全執行緒

 

三、幾種單利模式的比較

 

(1)餓漢式

“因為餓,所以要立即吃飯,刻不容緩”,在定義類的靜態私人變數同時進行執行個體化。

public class Singleton {

    private static final Singleton singleton = new Singleton();

 

    private Singleton() {

 

    }

 

    public static Singleton getInstance() {

        return singleton;

    }

}

①聲明靜態私人類變數,且立即執行個體化,保證執行個體化一次

②私人構造,防止外部執行個體化(通過反射是可以執行個體化的,不考慮此種情況)

③提供public的getInstance()方法供外部擷取單例執行個體

好處:安全執行緒;擷取執行個體速度快 缺點:類載入即初始化執行個體,記憶體浪費

 

(2)懶漢式

“這個人比較懶,等用著你的時候才去執行個體化”,消極式載入。

public class Singleton {

private static Singleton singleton = null;

 

private Singleton() {

 

}

 

public static Singleton getInstance() {

if (singleton == null) {

singleton = new Singleton();

}

return singleton;

}

}

優點:在擷取執行個體的方法中,進行執行個體的初始化,節省系統資源

缺點:①如果擷取執行個體時,初始化工作較多,載入速度會變慢,影響系統系能

②每次擷取執行個體都要進行非空檢查,系統開銷大

③非安全執行緒,當多個線程同時訪問getInstance()時,可能會產生多個執行個體

 

接下來對它進行安全執行緒改造:

1)同步鎖

public synchronized static Singleton getInstance() {

if (singleton == null) {

singleton = new Singleton();

}

return singleton;

}

    優點:安全執行緒,缺點:每次擷取執行個體都要加鎖,耗費資源,其實只要執行個體已經產生,以後擷取就不需要再鎖了

 

2)雙重檢查鎖

public static Singleton getInstance() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}

優點:安全執行緒,進行雙重檢查,保證只在執行個體未初始化前進行同步,效率高 缺點:還是執行個體非空判斷,耗費一定資源

 

3)靜態內部類

public class Singleton {

 

private Singleton() {

 

}

 

private static class SingletonHolder {

private static final Singleton singleton = new Singleton();

}

 

public static Singleton getInstance() {

return SingletonHolder.singleton;

}

}

優點:既避免了同步帶來的效能損耗,又能夠消極式載入

 

(3)枚舉

public enum Singleton {

    INSTANCE;

public void init() {

System.out.println("資源初始化。。。");

}

}

天然安全執行緒,可防止反射產生執行個體。

 

四、單例模式的優缺點

 

        優點:該類只存在一個執行個體,節省系統資源;對於需要頻繁建立銷毀的對象,使用單例模式可以提高系統效能。

 缺點:不能外部執行個體化(new),調用人員不清楚調用哪個方法擷取執行個體時會感到迷惑,尤其當看不到原始碼時。

 

關注老薑談技術,號:helojava,或者掃描下面二維碼。


每日一帖,技術雞湯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.