国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java設計優化之單例模式

2019-11-26 14:31:05
字體:
來源:轉載
供稿:網友

單例模式是一種對象創建模式,確保系統中一個類只有一個實例。

在java語言中,這樣做有兩大好處:

1.對于頻繁使用的對象,可以省略創建對象所話費的時間;

2.由于new操作的次數減少,對于系統內存的使用頻率降低,這樣減少GC的壓力,縮短GC停頓的時間。

單例模式細分:

1.

public class Singleton{  private Singleton(){    System.out.println("Singleton.Singleton()");  }    private static Singleton singleton = new Singleton();    public static Singleton getInstance(){    return singleton;  }}

注意:首先單例類必須有一個private訪問級別的構造函數,確保單例不會被系統其他代碼實例化;其次,singleton成員變量和getInstance()方法必須是static的。

這個單例類創建十分簡單,而且非常可靠。唯一的缺點是無法對singleton做延遲加載,例如由于單例創建過程很慢,由于成員變量定義為static,在jvm加載單例類時,單例對象也會被創建,那么在任何用到單例類的地方都會創建單例對象,不管單例對象是否被用到。例如:

public class Singleton{  private Singleton(){    System.out.println("Singleton.Singleton()");  }    private static Singleton singleton = new Singleton();    public static Singleton getInstance(){    return singleton;  }    public static void createString(){    System.out.println("Singleton.createString()");  }}

2.為了提高相關函數的調用速度,就需要引入懶加載機制。

package com.luchao.singtonle;public class LazySingleton {  private LazySingleton() {    System.out.println("LazySingleton.LazySingleton()");  }  private static LazySingleton lazyInstance = null;    public synchronized static LazySingleton getInstance(){    if(lazyInstance==null)      lazyInstance = new LazySingleton();    return lazyInstance;  }}

對于靜態變量singleton初始化賦值為null,確保系統啟動時沒有額外的負荷。在getInstance()方法中,判斷當前實例十分已經存在,如果存在則返回,如果不存在,再建單例。getInstance()必須為同步方法,因為在多線程環境下,當線程1正在建單例,未完成賦值前,線程2可能判斷instance為null,故線程2將啟動建立新建單例的程序,導致多個單例被創建。

上面實例單例實現,雖然實現了延遲加載,但是引入了同步方法,在多線程環境下,耗時遠大于第一個單例程序。

3.單例模式使用內部類來維護單例的創建

public class StaticSingleton {  private StaticSingleton() {    System.out.println("StaticSingleton.StaticSingleton()");  }    private static class SingletonHolder{    private static StaticSingleton ataticSingleton = new     StaticSingleton();  }     public static StaticSingleton getInstance(){    return SingletonHolder.ataticSingleton;  }  }

StaticSingleton被加載時,內部類不會被實例化,確保StaticSingleton類被載入jvm時,不會被初始化單例類,而當getInstance()方法被調用時,才加載SingletonHolder,從而初始化instance。同時用于實例的建立在類加載時完成,故天生對線程友好。

使用內部類完成單利模式,既可以做到延遲加載,也不用使用同步關鍵字,是一種比較完善的做法。

以上就是本文的全部內容希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福鼎市| 涡阳县| 沂源县| 乐陵市| 武穴市| 中西区| 静海县| 井研县| 华蓥市| 藁城市| 日喀则市| 芒康县| 翼城县| 茂名市| 阿拉尔市| 碌曲县| 台江县| 澄城县| 纳雍县| 绥滨县| 姚安县| 芜湖县| 武邑县| 乌海市| 青阳县| 九寨沟县| 监利县| 邻水| 普定县| 湛江市| 江油市| 阿坝县| 高阳县| 安达市| 正镶白旗| 石嘴山市| 洞头县| 抚松县| 延津县| 隆回县| 博白县|