成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

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

yzd / 2695人閱讀

摘要:總結(jié)單例是運(yùn)用頻率很高的模式,因?yàn)榭蛻舳藳](méi)有高并發(fā)的情況,選擇哪種方式并不會(huì)有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例模式。

單例模式介紹
單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會(huì)使用的設(shè)計(jì)模式。在應(yīng)用單例模式時(shí),單例對(duì)象的類(lèi)必須保證只用一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要一個(gè)全局對(duì)象,這樣有利于我么能協(xié)調(diào)整個(gè)系統(tǒng)整體的行為。
單例模式的使用場(chǎng)景
確保某個(gè)類(lèi)有且只有一個(gè)對(duì)象的場(chǎng)景,避免創(chuàng)建多個(gè)對(duì)象消耗過(guò)多的資源,或者某個(gè)對(duì)象只應(yīng)該有且只有一個(gè)。例如,創(chuàng)建一個(gè)對(duì)象需要消耗的資源過(guò)多,如要訪問(wèn)IO和數(shù)據(jù)庫(kù)的資源,需要頻繁進(jìn)行創(chuàng)建和銷(xiāo)毀的對(duì)象,這時(shí)候就需要考慮使用單例模式。
單例的實(shí)現(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是一個(gè)同步方法,在多線程情況下保證單例的對(duì)象唯一性的手段。但是會(huì)發(fā)現(xiàn)個(gè)問(wèn)題即使instance已經(jīng)被初始化,每次調(diào)用getInstance方法都會(huì)進(jìn)行同步,這樣會(huì)消耗不必要的資源,這也是懶漢式的最大的文問(wèn)題。最后總結(jié)下:
優(yōu)點(diǎn):?jiǎn)卫辉谑褂脮r(shí)才被初始化,一定程度上節(jié)約了資源。
缺點(diǎn):第一次加載時(shí)需要進(jìn)行實(shí)例化,反應(yīng)稍慢,最大問(wèn)題是每次調(diào)用getInstance都會(huì)進(jìn)行同步,造成不必要的同步開(kāi)銷(xiāo),這種模式一般不建議使用。
Double Check Lock(DCL)實(shí)現(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方法中對(duì)instance進(jìn)行了兩次判空,第一層判斷主要是避免不必要的同步,第二層判斷是為了在null放的情況下創(chuàng)建實(shí)例。由于Java編譯器允許處理器亂序執(zhí)行,在JDK1.5之前JMM(Java內(nèi)存模型)會(huì)偶爾失敗,會(huì)發(fā)生DCL失效問(wèn)題。JDK1.5之后,SUN調(diào)整了JVM,又優(yōu)化了volatile關(guān)鍵字,只要將instance定義改成 private volatile static Singleton instance = null就可以保證每次都是從主內(nèi)存讀取,就可以使用DCL的寫(xiě)法來(lái)完成單例。
優(yōu)點(diǎn)資源利用率高,既能在需要時(shí)才初始化單例,又能保證線程安全,且單例對(duì)象初始化后調(diào)用getInstance不進(jìn)行同步,效率高。
缺點(diǎn)第一次加載反應(yīng)稍慢,也由于JMM的原因偶爾會(huì)失敗。在高并發(fā)環(huán)境下也有一定缺陷,雖然發(fā)生的概率較小。
DCL模式是使用最多的單例模式實(shí)現(xiàn)方式,除非代碼在并發(fā)場(chǎng)景比較復(fù)雜或者JDK1.6以下版本使用,否則,這種方式基本都能滿足需求。
靜態(tài)內(nèi)部類(lèi)單例模式
public class Singleton {
    private Singleton() {
    }

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

    private static class SingletonHolder {
        private static Singleton instance = new Singleton();
    }
}
DCL模式雖然在一定程度解決了資源消耗、多余的同步、線程安全等問(wèn)題,但是,它還是在某種情況下會(huì)出現(xiàn)失效問(wèn)題。
第一次加載Singleton類(lèi)并不會(huì)初始化instance,只有在第一次調(diào)用getInstance()方法時(shí)instance才被初始化,因此第一次調(diào)用getInstance方法會(huì)導(dǎo)致虛擬機(jī)加載SingletonHolder類(lèi),這種方法不僅能保證線程安全,也能保證單例對(duì)象的唯一性,同時(shí)也延遲了單例的實(shí)例化,所以這是推薦使用的單例模式。
枚舉單例
public enum SingletonEnum {
    INSTANCE;
    public void doSomething() {
        System.out.println("do something");
    }
}
優(yōu)點(diǎn):簡(jiǎn)單
枚舉在java中與普通類(lèi)一樣,不僅能有字段,還能夠有自己的方法。重要的是枚舉實(shí)例的創(chuàng)建是線程安全的,并且在任何情況下它都是一個(gè)單例。
容器實(shí)現(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);
    }
}
將多種單例注入一個(gè)統(tǒng)一的管理類(lèi),使用時(shí)根據(jù)key獲取對(duì)象對(duì)應(yīng)類(lèi)型的對(duì)象。
這種方法是使得我們可以管理多種類(lèi)型的單例,在使用過(guò)程中可以通過(guò)統(tǒng)一的接口進(jìn)行操作,降低了使用成本,也對(duì)用戶應(yīng)藏了具體實(shí)現(xiàn),降低了耦合。
總結(jié)

單例是運(yùn)用頻率很高的模式,因?yàn)榭蛻舳藳](méi)有高并發(fā)的情況,選擇哪種方式并不會(huì)有太大的影響,出于效率考慮,推薦使用DCL和靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例模式。
單例的優(yōu)點(diǎn)

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

    jaysun 評(píng)論0 收藏0
  • [Android]單例模式

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

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

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

    cuieney 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<