国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android中的設(shè)計模式—單例模式

yzd / 2647人閱讀

摘要:總結(jié)單例是運(yùn)用頻率很高的模式,因為客戶端沒有高并發(fā)的情況,選擇哪種方式并不會有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類實現(xiàn)單例模式。

單例模式介紹
單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會使用的設(shè)計模式。在應(yīng)用單例模式時,單例對象的類必須保證只用一個實例存在。許多時候整個系統(tǒng)只需要一個全局對象,這樣有利于我么能協(xié)調(diào)整個系統(tǒng)整體的行為。
單例模式的使用場景
確保某個類有且只有一個對象的場景,避免創(chuàng)建多個對象消耗過多的資源,或者某個對象只應(yīng)該有且只有一個。例如,創(chuàng)建一個對象需要消耗的資源過多,如要訪問IO和數(shù)據(jù)庫的資源,需要頻繁進(jìn)行創(chuàng)建和銷毀的對象,這時候就需要考慮使用單例模式。
單例的實現(xiàn)方式 餓漢式
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}
懶漢式
 public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
getInstance()方法中添加了synchronized關(guān)鍵字,也就是getInstance是一個同步方法,在多線程情況下保證單例的對象唯一性的手段。但是會發(fā)現(xiàn)個問題即使instance已經(jīng)被初始化,每次調(diào)用getInstance方法都會進(jìn)行同步,這樣會消耗不必要的資源,這也是懶漢式的最大的文問題。最后總結(jié)下:
優(yōu)點:單例只在使用時才被初始化,一定程度上節(jié)約了資源。
缺點:第一次加載時需要進(jìn)行實例化,反應(yīng)稍慢,最大問題是每次調(diào)用getInstance都會進(jìn)行同步,造成不必要的同步開銷,這種模式一般不建議使用
Double Check Lock(DCL)實現(xiàn)單例
public class Singleton {
    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
                if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
getInstance方法中對instance進(jìn)行了兩次判空,第一層判斷主要是避免不必要的同步,第二層判斷是為了在null放的情況下創(chuàng)建實例。由于Java編譯器允許處理器亂序執(zhí)行,在JDK1.5之前JMM(Java內(nèi)存模型)會偶爾失敗,會發(fā)生DCL失效問題。JDK1.5之后,SUN調(diào)整了JVM,又優(yōu)化了volatile關(guān)鍵字,只要將instance定義改成 private volatile static Singleton instance = null就可以保證每次都是從主內(nèi)存讀取,就可以使用DCL的寫法來完成單例。
優(yōu)點資源利用率高,既能在需要時才初始化單例,又能保證線程安全,且單例對象初始化后調(diào)用getInstance不進(jìn)行同步,效率高。
缺點第一次加載反應(yīng)稍慢,也由于JMM的原因偶爾會失敗。在高并發(fā)環(huán)境下也有一定缺陷,雖然發(fā)生的概率較小。
DCL模式是使用最多的單例模式實現(xiàn)方式,除非代碼在并發(fā)場景比較復(fù)雜或者JDK1.6以下版本使用,否則,這種方式基本都能滿足需求。
靜態(tài)內(nèi)部類單例模式
public class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    private static class SingletonHolder {
        private static Singleton instance = new Singleton();
    }
}
DCL模式雖然在一定程度解決了資源消耗、多余的同步、線程安全等問題,但是,它還是在某種情況下會出現(xiàn)失效問題。
第一次加載Singleton類并不會初始化instance,只有在第一次調(diào)用getInstance()方法時instance才被初始化,因此第一次調(diào)用getInstance方法會導(dǎo)致虛擬機(jī)加載SingletonHolder類,這種方法不僅能保證線程安全,也能保證單例對象的唯一性,同時也延遲了單例的實例化,所以這是推薦使用的單例模式。
枚舉單例
public enum SingletonEnum {
    INSTANCE;
    public void doSomething() {
        System.out.println("do something");
    }
}
優(yōu)點:簡單
枚舉在java中與普通類一樣,不僅能有字段,還能夠有自己的方法。重要的是枚舉實例的創(chuàng)建是線程安全的,并且在任何情況下它都是一個單例。
容器實現(xiàn)單例
public class SingletonManager {
    private static Map objMap = new HashMap();

    public static void regsiterService(String key, Object instance) {
        if (!objMap.containsKey(key)) {
            objMap.put(key, instance);
        }
    }

    public static Object getService(String key) {
        return objMap.get(key);
    }
}
將多種單例注入一個統(tǒng)一的管理類,使用時根據(jù)key獲取對象對應(yīng)類型的對象。
這種方法是使得我們可以管理多種類型的單例,在使用過程中可以通過統(tǒng)一的接口進(jìn)行操作,降低了使用成本,也對用戶應(yīng)藏了具體實現(xiàn),降低了耦合。
總結(jié)

單例是運(yùn)用頻率很高的模式,因為客戶端沒有高并發(fā)的情況,選擇哪種方式并不會有太大的影響,出于效率考慮,推薦使用DCL和靜態(tài)內(nèi)部類實現(xiàn)單例模式。
單例的優(yōu)點

由于單例模式只存在一個實例,減少了內(nèi)存開銷,特別是一個對象需要頻繁的創(chuàng)建、銷毀時,而且創(chuàng)建或銷毀時性能無法優(yōu)化,單例模式的優(yōu)勢就十分明顯。

由于單例模式只生成一個實例,減少了系統(tǒng)的性能開銷,當(dāng)一個對象的產(chǎn)生需要比較多的資源時,可以通過應(yīng)用啟動時直接產(chǎn)生一個單例對象。然后用永久駐留內(nèi)存的方式來解決。

單例模式可以避免對資源的多重占用,比如文件的讀寫操作。

單例模式可以在系統(tǒng)中設(shè)置安全的訪問點,優(yōu)化和共享資源訪問,比如可以設(shè)計一個單例類,負(fù)責(zé)所有數(shù)據(jù)表的映射處理。
單例的缺點

單例模式一般沒有接口,擴(kuò)展困難。

單例對象如果持有Context,容易引發(fā)內(nèi)存泄漏,此時需要傳遞給單例對象的Context最好是Application Context。

微信公眾號:碼農(nóng)修煉之道

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71431.html

相關(guān)文章

  • Java單例模式實現(xiàn)

    摘要:所以,在版本前,雙重檢查鎖形式的單例模式是無法保證線程安全的。 單例模式可能是代碼最少的模式了,但是少不一定意味著簡單,想要用好、用對單例模式,還真得費(fèi)一番腦筋。本文對Java中常見的單例模式寫法做了一個總結(jié),如有錯漏之處,懇請讀者指正。 餓漢法 顧名思義,餓漢法就是在第一次引用該類的時候就創(chuàng)建對象實例,而不管實際是否需要創(chuàng)建。代碼如下: public class Singleton...

    jaysun 評論0 收藏0
  • [Android]單例模式

    摘要:即便如此,出于效率考慮,推薦使用雙重校驗鎖和靜態(tài)內(nèi)部類單例模式。 概述 單例模式是應(yīng)用最廣的模式之一,在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統(tǒng)只需要擁有一個全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。如在一個應(yīng)用中,應(yīng)該只有一個ImageLoader實例,這個ImageLoader中又含有線程池、緩存系統(tǒng)、網(wǎng)絡(luò)請求等,很消耗資源。因此不應(yīng)該讓它構(gòu)造多個實...

    劉玉平 評論0 收藏0
  • 求職準(zhǔn)備 - 收藏集 - 掘金

    摘要:一基礎(chǔ)接口的意義百度規(guī)范擴(kuò)展回調(diào)抽象類的意義想不想通過一線互聯(lián)網(wǎng)公司面試文檔整理為電子書掘金簡介谷歌求職記我花了八個月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對象深入分析 Java 中實例變量和類變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點,閱讀更多有深度的文章。 實例變量 和 類變量...

    cuieney 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<