大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 單例設計模式的幾種實現方式

單例設計模式的幾種實現方式

更新時間:2021-08-10 13:33:53 來源:動力節點 瀏覽1135次

大家對于java語言已經不陌生,單例對于java來說也是必不可少的,單例帶來了兩大好處:

1.由于new操作的次數減少,因而對系統內存的使用頻率也會降低,這將減輕GC壓力,縮短GC停頓時間。

2.對于頻繁使用的對象,可以省略創建對象所花費的時間,這對于那些重量級的對象而言,是非常可觀的一筆系統開銷。

所以對于系統的關鍵組件和被頻繁操作的對象,使用單例模式便可以有效地改善系統性能。

單例的參與者非常簡單,只有單例類和使用者兩個;

下面介紹單例設計模式在java代碼的具體實現:

單例模式的核心在于通過一個接口返回唯一的對象實例,一個簡單的單例實現如下:

public class Singleton {
    private  Singleton() {
        System.out.println("Singleton  is  create"); // 創建單例的過程可能會比較慢
    }
    private static Singleton instance = new Singleton();
    private static Singleton getInstance() {
        return instance;
    }
}

注意代碼的藍色部分,首先單例類必須要有一個private訪問級別的構造函數,只有這樣,才能確保單例不會在系統中的其他代碼內被實例化,這點是相當重要的;其次,instance成員和getInstance()方法必須是static的。

這種單例的實現方式非常簡單,而且十分可靠,它唯一的不足僅是無法對instance實例做延遲加載,假如單例的創建過程很慢,而由于instance成員變量是static定義的,因此在JVM加載單例類時,單例對象就會被建立,如果此時,這個單例類在系統中還扮演其他角色,那么在任何使用這個單例類的地方都會初始化這個單例變量,根本就不會管是否被用到。比如單例String工廠,用于創建一些字符串(該類既用于創建單例Singleton,又用于創建String對象)。

public class Singleton {
    private Singleton() {
        System.out.println("Singleton  is  create"); // 創建單例的過程可能會比較慢
    } 
    private static Singleton instance = new Singleton(); 
    private static Singleton getInstance() {
        return instance;
    }     
    public static void CreateString(){       //這是模擬單例類扮演其他角色
        System.out.println("createString in Singleton");
    }
}

上面代碼的意思就是,假如單例類里面有getInstance以外的其它靜態方法,跟單例沒啥關系的方法,如果使用了Singleton.CreateString()這種調用,就會自動創建Singleton這個類實例(雖然private構造已經防止了你人為去new這個單例),這是開發人員不愿看到的,我運行下面代碼(此代碼調用了上面代碼的createString()方法)進行展示:

那么在這個單例基礎上進行延遲加載改良:

public class Singleton {
    private Singleton() {
        System.out.println("LazySingleton  is  create"); // 創建單例的過程可能會比較慢
    }
    private static Singleton instance = null;
    public static synchronized Singleton getInstance() {
        if (instance == null)
            instance = new Singleton();
        return instance;
    }
}

此時再調用同樣的測試方法:

解決了這個問題。

顯而易見,這次改良主要是從JVM加載類的原理上進行改良的,上面的代碼在初始化類的時候給instance賦予null,確保系統啟動的時候沒有額外的負載,其次,在getInstance方法中加入判斷單例是否存在,不存在才new。但是getInstance()方法必須是同步的,

否則多線程環境下,可能線程1正在創建單例時,線程2判斷單例instance為空,就會創建多個實例。

但是上面的寫法,存在性能問題,在多線程下,它的耗時遠遠大于第一種單例。以下代碼就說明了此問題:

@Override
        public void run(){
            for (int i = 0; i < 100000; i++)
                Singleton.getInstance();
                System.out.println("spend:" (System.currentTimeMillis()-begintime));
        }

開啟五個線程同時完成以上代碼的運行,使用第一種單例耗時0ms,而使用第二種單例耗時390ms,性能至少相差兩個數量級。

為了線程安全使用了同步關鍵字反而降低了系統性能,為了解決這個問題,繼續改進:

public class Singleton {
    private Singleton() {
        System.out.println("LazySingleton  is  create"); // 創建單例的過程可能會比較慢
    }
    public static class SingletonHolder {
        private static Singleton instance = new Singleton();
    }
    public static synchronized Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

沒錯,這就是現在最完整的單例寫法,內部類實現單例,除了effctive java中闡述的枚舉單例實現,這種方法是目前最好的實現方式。

在這個實現中,用內部類來保護單例,當Singleton類被加載時,內部類不會被初始化,所以可以確保Singleton類被載入JVM時,不會初始化單例類,當getInstance方法被調用時,才會加載SingleHolder,從而初始化instance,同時,由于實例的建立是在類加載時完成的,故天生對多線程友好,getInstance()方法也不需要使用synchronized修飾,因此,這種實現能兼顧前兩種寫法的優點(延遲加載,非同步)。

最后,在極端情況下,序列化和反序列化可能會破壞單例,一般來說不多見,如果存在就要多加注意,此時可以加入以下代碼:

private Object readResolve() {
        return instance;
    }

以上就是動力節點小編介紹的"單例設計模式的幾種實現方式",希望對大家有幫助,想了解更多可查看Java設計模式。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 99久久国产 | 97影院秋霞国产精品 | 国产一区二区三区久久精品 | 国产一区二区中文字幕 | 久久日韩精品 | 香蕉国产人午夜视频在线观看 | 国产激情久久久久影 | 久久久噜久噜久久gif动图 | 色综合激情 | 国产麻豆精品在线 | 日本精品高清一区二区不卡 | 99精品视频在线免费观看 | 日本成人久久 | 九色福利视频 | 欧美操片在线观看 | 老司机免费精品视频 | 欧美成人在线免费视频 | 日日添天天做天天爱 | 国产精品第8页 | 四虎国产永久免费久久 | 狠狠综合欧美综合欧美色 | 99久久国产综合精品麻豆 | 亚洲精品三区 | 91社区视频| 老司机亚洲精品影院在线 | 中文字幕亚洲 综合久久 | 好吊妞乱淫欧美 | 96精品专区国产在线观看高清 | 欧美日韩网站 | porno日本xxxx | 欧洲a级毛片 | 国产精品视频一区二区三区 | 香蕉久久久 | 麻豆狠色伊人亚洲综合网站 | 精品国产区一区二区三区在线观看 | 99久久99久久久精品齐齐鬼色 | 中文字幕在线视频在线看 | 99精品国产在现线免费 | 久久美女性网 | 奇米影视在线视频8888 | 久草久草在线视频 |