国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

單例設(shè)計(jì)模式精講(餓漢式和懶漢式實(shí)現(xiàn)的重要方法)

這篇具有很好參考價(jià)值的文章主要介紹了單例設(shè)計(jì)模式精講(餓漢式和懶漢式實(shí)現(xiàn)的重要方法)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

什么叫做單例模式?

餓漢式和懶漢式的區(qū)別?

餓漢式-方式1(靜態(tài)變量方式)

餓漢式-方式2(靜態(tài)代碼塊方式)

懶漢式-方式1(線程不安全)

懶漢式-方式2(線程安全)

懶漢式-方式3(雙重檢查鎖)

懶漢式-方式4(靜態(tài)內(nèi)部類方式)


什么叫做單例模式?


????????涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類提供 了一種訪問(wèn)其唯一的對(duì)象的方式,可以直接訪問(wèn),不需要實(shí)例化該類的對(duì)象。


餓漢式和懶漢式的區(qū)別?


? ? ? ? 餓漢式:類加載就會(huì)導(dǎo)致該單實(shí)例對(duì)象被創(chuàng)建
? ? ? ? 懶漢式:類加載不會(huì)導(dǎo)致該單實(shí)例對(duì)象被創(chuàng)建,而是首次使用該對(duì)象時(shí)才會(huì)創(chuàng)建
? ? ? ? 導(dǎo)致類加載的情況:new 對(duì)象,創(chuàng)建子類,調(diào)用靜態(tài)屬性
? ? ? ? 類加載是什么意思:就是把你的變量和方法存在內(nèi)存當(dāng)中
? ? ? ? 代碼區(qū)別如下:
? ? ? ? 人話來(lái)說(shuō)就是創(chuàng)建對(duì)象的時(shí)機(jī)不一樣,如果看不懂的話建議去補(bǔ)java基礎(chǔ)靜態(tài)這一塊的知識(shí)

//餓漢式
public class Singleton {

    private Singleton(){}
//    提前創(chuàng)建好單列對(duì)象;
    private static Singleton instance = new Singleton();
    public static Singleton getInstance(){
        return instance;
    }

}
//測(cè)試代碼:
public class Test {
    public static void main (String[] args) {
        //因?yàn)檫@里調(diào)用的是靜態(tài)方法,所以導(dǎo)致類加載,就會(huì)執(zhí)行 new Singleton();從而創(chuàng)建對(duì)象
        //導(dǎo)致類加載的情況:new 對(duì)象,創(chuàng)建子類,調(diào)用靜態(tài)屬性
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);
    }
}
============================================================================
//餓漢式
public class Singleton {
    private Singleton(){}
    private static Singleton instance;
    public static Singleton getInstance(){
        if (instance==null){
            //調(diào)用的時(shí)候才創(chuàng)建對(duì)象
            //判短對(duì)象為空才創(chuàng)建對(duì)象
            instance=new Singleton();
        }
        return instance;
    }
}
public class Test {
    public static void main (String[] args) {
        //調(diào)用方法的時(shí)候才創(chuàng)建對(duì)象
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance==instance1);
    }
}
餓漢式-方式1(靜態(tài)變量方式)
?
/**
* 餓漢式
* 靜態(tài)變量創(chuàng)建類的對(duì)象
*/
public class Singleton {
//私有構(gòu)造方法
private Singleton() {}
//在成員位置創(chuàng)建該類的對(duì)象
private static Singleton instance = new Singleton();
//對(duì)外提供靜態(tài)方法獲取該對(duì)象
public static Singleton getInstance() {
return instance;
}
}

缺點(diǎn):
該方式在成員位置聲明Singleton類型的靜態(tài)變量,并創(chuàng)建Singleton類的對(duì)象instance。 instance對(duì)象是隨著類的加載而創(chuàng)建的。如果該對(duì)象足夠大的話,而一直沒(méi)有使用就會(huì)造成內(nèi)存 的浪費(fèi)。


餓漢式-方式2(靜態(tài)代碼塊方式)
?
/**
* 惡漢式
* 在靜態(tài)代碼塊中創(chuàng)建該類對(duì)象
*/
public class Singleton {
//私有構(gòu)造方法
private Singleton() {}
//在成員位置創(chuàng)建該類的對(duì)象
private static Singleton instance;
static {
instance = new Singleton();
}
//對(duì)外提供靜態(tài)方法獲取該對(duì)象
public static Singleton getInstance() {
return instance;
}
}

缺點(diǎn):
該方式在成員位置聲明Singleton類型的靜態(tài)變量,而對(duì)象的創(chuàng)建是在靜態(tài)代碼塊中,也是對(duì)著 類的加載而創(chuàng)建。所以和餓漢式的方式1基本上一樣,當(dāng)然該方式也存在內(nèi)存浪費(fèi)問(wèn)題。


懶漢式-方式1(線程不安全)
/**
* 懶漢式
* 線程不安全
*/
public class Singleton {
//私有構(gòu)造方法
private Singleton() {}
//在成員位置創(chuàng)建該類的對(duì)象
private static Singleton instance;
//對(duì)外提供靜態(tài)方法獲取該對(duì)象
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}

缺點(diǎn):
從上面代碼我們可以看出該方式在成員位置聲明Singleton類型的靜態(tài)變量,并沒(méi)有進(jìn)行對(duì)象的 賦值操作,那么什么時(shí)候賦值的呢?當(dāng)調(diào)用getInstance()方法獲取Singleton類的對(duì)象的時(shí) 候才創(chuàng)建Singleton類的對(duì)象,這樣就實(shí)現(xiàn)了懶加載的效果。但是,如果是多線程環(huán)境,會(huì)出現(xiàn) 線程安全問(wèn)題。


懶漢式-方式2(線程安全)
?
/**
* 懶漢式
* 線程安全
*/
public class Singleton {
//私有構(gòu)造方法
private Singleton() {}
//在成員位置創(chuàng)建該類的對(duì)象
private static Singleton instance;
//對(duì)外提供靜態(tài)方法獲取該對(duì)象
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}

缺點(diǎn):
該方式也實(shí)現(xiàn)了懶加載效果,同時(shí)又解決了線程安全問(wèn)題。但是在getInstance()方法上添加了 synchronized關(guān)鍵字,導(dǎo)致該方法的執(zhí)行效果特別低。從上面代碼我們可以看出,其實(shí)就是在 初始化instance的時(shí)候才會(huì)出現(xiàn)線程安全問(wèn)題,一旦初始化完成就不存在了。

就是每個(gè)現(xiàn)場(chǎng)都會(huì)拿到鎖,導(dǎo)致效率降低,應(yīng)該是當(dāng)沒(méi)有獲取對(duì)象的誰(shuí)時(shí)候拿到鎖。

?

懶漢式-方式3(雙重檢查鎖)
?
public class Singleton {
    private Singleton(){}
    //聲明一個(gè)Singleton類型的變量
    private static Singleton instance;
    public static Singleton getInstance(){
        if (instance==null){
            //為空的時(shí)候才會(huì)拿到鎖
            synchronized (Singleton.class){
                if (instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

雙重檢查鎖模式是一種非常好的單例實(shí)現(xiàn)模式,解決了單例、性能、線程安全問(wèn)題,上面的雙重檢 測(cè)鎖模式看上去完美無(wú)缺,其實(shí)是存在問(wèn)題,在多線程的情況下,可能會(huì)出現(xiàn)空指針問(wèn)題,出現(xiàn)問(wèn) 題的原因是JVM在實(shí)例化對(duì)象的時(shí)候會(huì)進(jìn)行優(yōu)化和指令重排序操作。 要解決雙重檢查鎖模式帶來(lái)空指針異常的問(wèn)題,只需要使用 volatile 關(guān)鍵字, volatile 關(guān) 鍵字可以保證可見性和有序性。
?

懶漢式-方式4(靜態(tài)內(nèi)部類方式)

?
public class Singleton {
//私有構(gòu)造方法
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
//對(duì)外提供靜態(tài)方法獲取該對(duì)象
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

?第一次加載Singleton類時(shí)不會(huì)去初始化INSTANCE,只有第一次調(diào)用getInstance,虛擬機(jī)加 載SingletonHolder 并初始化INSTANCE,這樣不僅能確保線程安全,也能保證 Singleton 類的唯一性。 小結(jié): 靜態(tài)內(nèi)部類單例模式是一種優(yōu)秀的單例模式,是開源項(xiàng)目中比較常用的一種單例模式。在沒(méi)有加任 何鎖的情況下,保證了多線程下的安全,并且沒(méi)有任何性能影響和空間的浪費(fèi)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-653427.html

到了這里,關(guān)于單例設(shè)計(jì)模式精講(餓漢式和懶漢式實(shí)現(xiàn)的重要方法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java中23種設(shè)計(jì)模式-單例模式--餓漢式】

    加油,新時(shí)代打工人! 簡(jiǎn)單粗暴,直接上代碼。 23種設(shè)計(jì)模式定義介紹 Java中23種設(shè)計(jì)模式-單例模式 Java中23種設(shè)計(jì)模式-單例模式2–懶漢式線程不安全 Java中23種設(shè)計(jì)模式-單例模式2–懶漢式2線程安全

    2024年02月22日
    瀏覽(19)
  • 24種設(shè)計(jì)模式之單例模式(餓漢式、懶漢式)

    24種設(shè)計(jì)模式之單例模式(餓漢式、懶漢式)

    單例模式( Singleton Pattern )是指確保一個(gè)類在任何情況下都絕對(duì)只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)。單例模式是創(chuàng)建型模式。單例模式在現(xiàn)實(shí)生活中應(yīng)用也非常廣泛,例如,總統(tǒng),班主任等。J2EE標(biāo)準(zhǔn)中的ServletContext 、ServletContextConfig 等、Spring框架應(yīng)用中的。 特點(diǎn):構(gòu)造方

    2024年02月07日
    瀏覽(24)
  • Java中單例(單態(tài)、原子)設(shè)計(jì)模式(餓漢式/懶漢式)

    先看文章目錄,大致了解知識(shí)點(diǎn)結(jié)構(gòu),直接點(diǎn)擊文章目錄可以跳轉(zhuǎn)到文章指定位置。 設(shè)計(jì)模式就是設(shè)計(jì)出來(lái)的固定問(wèn)題的解決方法,描述了在軟件設(shè)計(jì)過(guò)程中的一些不斷重復(fù)發(fā)生的問(wèn)題和解決方案。遇到類似問(wèn)題的時(shí)候可以直接使用現(xiàn)成的模式方案。 ①單例模式中一個(gè)類只

    2024年02月04日
    瀏覽(29)
  • 如何理解單例模式----餓漢式?

    目錄 1.前言 2.本質(zhì) 3.代碼默寫 在面試中,理解和掌握單例模式是非常重要的。本文旨在幫助讀者深入理解餓漢式單例模式,并通過(guò)簡(jiǎn)潔明了的解釋和示例代碼,使讀者能夠輕松掌握并默寫出餓漢式單例模式的代碼實(shí)現(xiàn)。 餓漢式單例模式是一種單例設(shè)計(jì)模式的實(shí)現(xiàn)方式,它在

    2024年01月18日
    瀏覽(21)
  • 單例模式(餓漢式單例 VS 懶漢式單例)

    單例模式(餓漢式單例 VS 懶漢式單例)

    所謂的單例模式就是保證某個(gè)類在程序中只有一個(gè)對(duì)象 1.構(gòu)造方法私有化(保證對(duì)象的產(chǎn)生個(gè)數(shù)) ? ? ? ? 創(chuàng)建類的對(duì)象,要通過(guò)構(gòu)造方法產(chǎn)生對(duì)象 ? ? ? ?構(gòu)造方法若是public權(quán)限,對(duì)于類的外部,可以隨意創(chuàng)建對(duì)象,無(wú)法控制對(duì)象個(gè)數(shù) ? ? ? 構(gòu)造方法私有化,這樣類的外

    2024年02月09日
    瀏覽(21)
  • 懶漢單例設(shè)計(jì)模式與餓漢單例設(shè)計(jì)模式

    單例模式即一個(gè)類確保只有一個(gè)對(duì)象,主要用于避免浪費(fèi)內(nèi)存 1 .餓漢單例設(shè)計(jì)模式 :拿到對(duì)象時(shí),對(duì)象就早已經(jīng)創(chuàng)建好了 寫法: 把類的構(gòu)造器私有 在類中自己創(chuàng)建一個(gè)對(duì)象,并賦值到一個(gè)變量 定義一個(gè)靜態(tài)方法,返回自己創(chuàng)建的這個(gè)對(duì)象 2. 懶漢單例設(shè)計(jì)模式 :第一次拿到對(duì)象時(shí)

    2024年02月21日
    瀏覽(31)
  • 自學(xué)設(shè)計(jì)模式(類圖、設(shè)計(jì)原則、單例模式 - 餓漢/懶漢)

    自學(xué)設(shè)計(jì)模式(類圖、設(shè)計(jì)原則、單例模式 - 餓漢/懶漢)

    設(shè)計(jì)模式需要用到面向?qū)ο蟮娜筇匦浴庋b、繼承、多態(tài)(同名函數(shù)具有不同的狀態(tài)) UML類圖 eg.—— 描述類之間的關(guān)系(設(shè)計(jì)程序之間畫類圖) ?+: public; #: protected; -: private; 下劃線: static 屬性名:類型(=默認(rèn)值) 方法和變量分開------- 虛函數(shù)斜體,純虛函數(shù)在虛函數(shù)類

    2024年02月11日
    瀏覽(22)
  • 設(shè)計(jì)模式之單例模式(懶漢, 餓漢)

    設(shè)計(jì)模式之單例模式(懶漢, 餓漢)

    單例模式是一種常用的軟件設(shè)計(jì)模式, 該模式的主要目的是確保某一個(gè)類在內(nèi)存中只能有一個(gè)實(shí)例對(duì)象, 通過(guò)單例模式的方法創(chuàng)建的類在當(dāng)前進(jìn)程中只有一個(gè)實(shí)例對(duì)象. 常見的單例模式有兩種: 餓漢式, 這里的 “餓” 意義表述不夠清晰, 用 “急” 來(lái)表述意義更加容易聯(lián)想一些

    2024年02月22日
    瀏覽(20)
  • 【單例模式】餓漢式、懶漢式、靜態(tài)內(nèi)部類--簡(jiǎn)單例子

    【單例模式】餓漢式、懶漢式、靜態(tài)內(nèi)部類--簡(jiǎn)單例子

    單例模式是?個(gè)單例類在任何情況下都只存在?個(gè)實(shí)例,構(gòu)造?法必須是私有的、由??創(chuàng)建?個(gè)靜態(tài)變量存儲(chǔ)實(shí)例,對(duì)外提供?個(gè)靜態(tài)公有?法獲取實(shí)例。 目錄 一、單例模式 餓漢式 ?靜態(tài)內(nèi)部類 懶漢式 反射可以破壞單例 道高一尺魔高一丈 枚舉 類?加載就創(chuàng)建對(duì)象,這

    2024年04月23日
    瀏覽(25)
  • 單例模式類設(shè)計(jì)|什么是餓漢模式和懶漢模式

    那么這里博主先安利一些干貨滿滿的專欄了! 首先是博主的高質(zhì)量博客的匯總,這個(gè)專欄里面的博客,都是博主最最用心寫的一部分,干貨滿滿,希望對(duì)大家有幫助。 高質(zhì)量干貨博客匯總 https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482 一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,

    2024年02月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包