成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計模式-單例模式

guqiu / 3168人閱讀

摘要:簡介最基本的實例中規(guī)定了一個類只會被初始化一次所以該方法是線程安全的但是其在方法調(diào)用前就初始化了比較浪費資源優(yōu)點只有一個實例節(jié)約內(nèi)存空間減少了系統(tǒng)的性能開銷如果某一個對象的產(chǎn)生需要比較多的資源時可以在啟動時直接產(chǎn)生一個單例對象使其永駐內(nèi)存可

In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects. The term comes from the mathematical concept of a singleton
簡介 最基本的實例
public class Emperor {
    private static final Emperor emperor=new Emperor();

    private Emperor(){}

    public static Emperor getInstance(){
        return emperor;
    }
}

Java Language Specification 中規(guī)定了一個類只會被初始化一次.所以該方法是線程安全的, 但是其在方法調(diào)用前就初始化了, 比較浪費資源.

優(yōu)點

只有一個實例, 節(jié)約內(nèi)存空間, 減少了系統(tǒng)的性能開銷, 如果某一個對象的產(chǎn)生需要比較多的資源時, 可以在啟動時直接產(chǎn)生一個單例對象, 使其永駐內(nèi)存.

可以避免對資源的多重占用,

可以在系統(tǒng)設(shè)置全局的訪問點, 優(yōu)化和共享資源訪問.

缺點

單例模式一般沒有接口, 擴展很困難, 除了修改代碼基本上沒有第二種途徑可以實現(xiàn)

單例模式不利于測試, 如果單例模式?jīng)]有完成, 無法進行測試

與單一職責原則相沖突.

其它實現(xiàn)方式 懶漢模式
class Singleton {
    private static Singleton instance;

    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

該實現(xiàn)只會在需要的時候才會進行初始化且是線程安全的, 但是每次調(diào)用getInstance()都會進行同步, 會浪費資源

Double Check Lock
class SingletonDCL{
    private static SingletonDCL sInstance;

    private SingletonDCL(){}

    public static SingletonDCL getInstance(){
        if(sInstance==null){
            synchronized (SingletonDCL.class){
                if(sInstance==null){
                    sInstance=new SingletonDCL();
                }
            }
        }

        return sInstance;
    }
}

該實現(xiàn)只會在需要的時候才會進行初始化, 看似線程安全, 但實際并不是.

假設(shè)線程A執(zhí)行到sInstance=new SingletonDCL(), 這句代碼并不是一個原子操作, 這句代碼大致會被分為下面3個步驟來處理:

給SingletonDCL的實例分配內(nèi)存

調(diào)用SingletonDCL的構(gòu)造函數(shù), 初始化成員字段

將sInstance對象指向分配的內(nèi)存空間 (此時sInstance就不是null了).

如果這句代碼嚴格按照這個順序執(zhí)行,該DCL單例模式便是線程安全的, 但是事實并非如此. 原因是JVM并沒有保證上述第2和第3步的執(zhí)行順序.
也就是說執(zhí)行步驟可能是1-3-2, 這種執(zhí)行步驟就會出問題:

當先執(zhí)行第3步時, 另一個線程B開始執(zhí)行getInstance(), 由于此時sInstance已經(jīng)不是null了, 所以線程B會返回一個還未初始化的sInstance, 出現(xiàn)了錯誤.

JVM1.5之后改善了這個問題, 在sInstance前加上volatile關(guān)鍵字可以確保線程安全.
private static volatile SingletonDCL sInstance;

靜態(tài)內(nèi)部類單例模式

DCL單例模式并不推薦使用,《Java并發(fā)編程實踐》推薦使用下面這個方法:

class SingletonStatic{
    private SingletonStatic(){}

    public static SingletonStatic getInstance(){
        return SingletonStaticHolder.sInstance;
    }

    private static class SingletonStaticHolder{
        private static final SingletonStatic sInstance=new SingletonStatic();
    }
}

第一次加載時, 并不會初始化sInstance, 只在第一調(diào)用getInstance()時初始化, 且該方法是線程安全的.

枚舉單例
enum SingletonEnum{
    INSTACNE;
    public void doSomething(){
        StdOut.println("doSomething...");
    }
}

枚舉單例模式有以下3個優(yōu)點:

線程安全, 任何時候都只有一個實例

反序列化時, 都只會有一個實例

可以防止反射攻擊

選擇哪一種實現(xiàn)方式

無論采用哪一種實現(xiàn)方式, 都要確保線程安全, 防止反序列化導(dǎo)致重新生成實例對象等一些問題. 具體選擇哪一種實現(xiàn)方式取決于項目本身.

關(guān)于序列化

除了枚舉單例, 為了避免單例對象在被反序列化時重新生成對象, 必須加入以下方法

private Object readResolve() throws ObjectStreamException{
    return sInstance;
}

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71722.html

相關(guān)文章

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

    摘要:總結(jié)單例是運用頻率很高的模式,因為客戶端沒有高并發(fā)的情況,選擇哪種方式并不會有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類實現(xiàn)單例模式。 單例模式介紹 單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會使用的設(shè)計模式。在應(yīng)用單例模式時,單例對象的類必須保證只用一個實例存在。許多時候整個系統(tǒng)只需要一個全局對象,這樣有利于我么能協(xié)調(diào)整個系統(tǒng)整體的行為。 單例模式的使用場景 確保某個類有且...

    yzd 評論0 收藏0
  • JavaScript設(shè)計模式----單例模式

    摘要:不符合設(shè)計模式中的單一職責的概念。引入代理實現(xiàn)單例模式引入代理實現(xiàn)單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現(xiàn)的單例模式都混入了傳統(tǒng)面向?qū)ο笳Z言的特點。 聲明:這個系列為閱讀《JavaScript設(shè)計模式與開發(fā)實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統(tǒng)面向?qū)?..

    selfimpr 評論0 收藏0
  • JavaScript設(shè)計模式-第一部分:單例模式、組合模式和外觀模式

    摘要:但是,這并不是采用單例的唯一原因。使用命名空間單例模式也被稱為模塊設(shè)計模式。函數(shù)內(nèi)部聲明了一些局部函數(shù)和或變量。緊隨函數(shù)聲明放置即可立即執(zhí)行外部函數(shù),并將所得的對象文字費賠給變量。 JavaScript設(shè)計模式-第一部分:單例模式、組合模式和外觀模式 設(shè)計模式是一些可靠的編程方式,有助于保證代碼更加易于維護、擴展及分離,所有設(shè)計模式在創(chuàng)建大型JavaScript應(yīng)用程序時均不可或缺 單...

    betacat 評論0 收藏0
  • Java設(shè)計模式-單例模式(Singleton Pattern)

    摘要:如果需要防范這種攻擊,請修改構(gòu)造函數(shù),使其在被要求創(chuàng)建第二個實例時拋出異常。單例模式與單一職責原則有沖突。源碼地址參考文獻設(shè)計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...

    k00baa 評論0 收藏0
  • Java 設(shè)計模式單例模式

    摘要:在設(shè)計模式一書中,將單例模式稱作單件模式。通過關(guān)鍵字,來保證不會同時有兩個線程進入該方法的實例對象改善多線程問題為了符合大多數(shù)程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設(shè)計模式》一書中,將單例模式稱作單件模式。這里為了適應(yīng)大環(huán)境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個類只有一個實例,...

    everfight 評論0 收藏0

發(fā)表評論

0條評論

guqiu

|高級講師

TA的文章

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