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

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

這篇具有很好參考價值的文章主要介紹了單例模式(餓漢式單例 VS 懶漢式單例)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

所謂的單例模式就是保證某個類在程序中只有一個對象

一、如何控制只產(chǎn)生一個對象?

1.構(gòu)造方法私有化(保證對象的產(chǎn)生個數(shù))

? ? ? ? 創(chuàng)建類的對象,要通過構(gòu)造方法產(chǎn)生對象

? ? ? ?構(gòu)造方法若是public權(quán)限,對于類的外部,可以隨意創(chuàng)建對象,無法控制對象個數(shù)

? ? ? 構(gòu)造方法私有化,這樣類的外部就徹底無法產(chǎn)生對象,一個對象都沒有。

2.單例類的內(nèi)部提供這個唯一的對象(static)

? ? ? ? 構(gòu)造方法私有化后,對于類的外部而言就一個對象都沒有了。因此要在這個類的內(nèi)部構(gòu)造出這個唯一的對象,只調(diào)用一次構(gòu)造方法即可(這個單例對象不能是類的成員屬性,因為成員變量必須通過對象來訪問,但是類的外部根本無法產(chǎn)生對象,(矛盾),因此這個對象必須使用static關(guān)鍵字修飾,靜態(tài)變量,不依賴類的對象

3.單例類提供返回這個唯一對象的靜態(tài)方法供外部使用

二、餓漢式單例

餓漢式單例模式是天然的線程安全的。類加載時就創(chuàng)建了這個唯一的對象!?。?/span>

/**
 * 餓漢式單例(類加載就產(chǎn)生這個唯一的對象,也不管外部是否調(diào)用該對象)。饑不擇食,這個類一加載就把惟一的這個對象產(chǎn)生了,
 * 我也不管外部到底用不用這個對象,只要這個類加載到JVM,唯一對象就會產(chǎn)生
 **/
public class SingleTon {
    // 惟一的這一個對象
    private static SingleTon singleTon = new SingleTon();
    private SingleTon() {}
    // 調(diào)用此方法時,singleTon對象已經(jīng)產(chǎn)生過了,多線程場景下取回的是同一個單例對象
    public static SingleTon getSingleton() {
        return singleTon;
    }
}

三、懶漢式單例

懶漢式單例:只有第一次調(diào)用getSingleTon(),表示外部需要獲取這個單例對象時才產(chǎn)生對象

public class LazySingleTon {
    private static LazySingleTon singleTon ;
    private LazySingleTon(){}
    
    public LazySingleTon getSingleTon(){
        if (singleTon == null){
            singleTon = new LazySingleTon();
        }
        return singleTon;
    }
}

多線程場景下會產(chǎn)生線程安全問題(不能確保只有一個對象產(chǎn)生)?

單例模式(餓漢式單例 VS 懶漢式單例),單例模式,java,開發(fā)語言

在這個場景下,三個線程并發(fā)調(diào)用get方法,此時三個?線程看到的singleTon 都為null,因此,每個線程都創(chuàng)建了一個對象!!

四、解決懶漢式單例的線程安全問題

1.靜態(tài)方法上加鎖

    public synchronized static LazySingleTon getSingleTon(){
        if (singleTon == null){
            singleTon = new LazySingleTon();
        }
        return singleTon;
    }

在方法上上鎖,表示同一時間只有一個線程能進入此方法(其他線程想要進入此方法都等待獲取鎖成功的線程釋放鎖)。此時,getSingleTon()的內(nèi)部都是單線程操作(鎖的粒度太粗)。

2.double-check(雙重加鎖)

    private volatile static LazySingleTon singleTon ;
    private LazySingleTon(){}

    public  static LazySingleTon getSingleTon(){
        if (singleTon == null){
            synchronized (LazySingleTon.class){
                if (singleTon == null){
                    singleTon = new LazySingleTon();
                }
            }
        }
        return singleTon;
    }

volatile的作用:內(nèi)存屏障,可見性

此時有t1,t2,t3三個線程,t1首先獲取到了鎖,開始執(zhí)行new操作,雖然還沒完全結(jié)束,但此時的singleTon != null,對于剛開始執(zhí)行代碼的t2,t3來說,它們看到singleTon != null 直接返回了,但是返回后的單例對象是一個尚未完全初始化的對象

此時采用volatile關(guān)鍵字修飾單例對象,new操作有著一堵墻,其它線程要能執(zhí)行到return語句,JVM一定保證了new操作完全結(jié)束了,之后才會執(zhí)行return語句

單例模式(餓漢式單例 VS 懶漢式單例),單例模式,java,開發(fā)語言

?double-check:防止其他線程恢復(fù)執(zhí)行后多次創(chuàng)建單例對象

當(dāng)t1先進入同步代碼塊后,t2,t3卡在獲取所得位置,

t1產(chǎn)生對象后釋放鎖,

t2,t3還是從獲取鎖的位置繼續(xù)執(zhí)行,在他們的工作內(nèi)存中,singleTon == null?

t2,t3就會再次new對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-704533.html

到了這里,關(guān)于單例模式(餓漢式單例 VS 懶漢式單例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Java|多線程與高并發(fā)】設(shè)計模式-單例模式(餓漢式,懶漢式和靜態(tài)內(nèi)部類)

    【Java|多線程與高并發(fā)】設(shè)計模式-單例模式(餓漢式,懶漢式和靜態(tài)內(nèi)部類)

    設(shè)計模式是一種在軟件開發(fā)中常用的解決復(fù)雜問題的方法論。它提供了一套經(jīng)過驗證的解決方案,用于解決特定類型問題的設(shè)計和實現(xiàn)。設(shè)計模式可以幫助開發(fā)人員提高代碼的可重用性、可維護性和可擴展性。 設(shè)計模式有很多,本文主要介紹單例模式. 單例模式是一種創(chuàng)建型設(shè)

    2024年02月11日
    瀏覽(28)
  • Java單例模式的五種實現(xiàn)方式 懶漢式 餓漢式 雙重校驗鎖 靜態(tài)變量 靜態(tài)內(nèi)部類 枚舉實現(xiàn)單例模式等

    Java單例模式是一種設(shè)計模式,用于確保一個類只有一個實例,并提供全局訪問點以獲取該實例。它通常用于需要共享資源或控制某些共享狀態(tài)的情況下。 懶漢式:在類加載的時候就創(chuàng)建對象,要再調(diào)用方法時才創(chuàng)建對象,減少內(nèi)存開銷。 餓漢式:再類加載的時候就實例化對

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

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

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

    2024年04月23日
    瀏覽(25)
  • 24種設(shè)計模式之單例模式(餓漢式、懶漢式)

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

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

    2024年02月07日
    瀏覽(24)
  • 單例設(shè)計模式精講(餓漢式和懶漢式實現(xiàn)的重要方法)

    目錄 什么叫做單例模式? 餓漢式和懶漢式的區(qū)別? 餓漢式-方式1(靜態(tài)變量方式) 餓漢式-方式2(靜態(tài)代碼塊方式) 懶漢式-方式1(線程不安全) 懶漢式-方式2(線程安全) 懶漢式-方式3(雙重檢查鎖) 懶漢式-方式4(靜態(tài)內(nèi)部類方式) 什么叫做單例模式? ????????涉

    2024年02月12日
    瀏覽(16)
  • 【Java中23種設(shè)計模式-單例模式--餓漢式】

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

    2024年02月22日
    瀏覽(19)
  • 關(guān)于Java中單例模式(餓漢模式和懶漢模式)的簡析

    關(guān)于Java中單例模式(餓漢模式和懶漢模式)的簡析

    目錄 一.什么是單例模式 二.餓漢模式和懶漢模式 餓漢模式 代碼 懶漢模式 代碼 關(guān)于多線程安全的問題 如何解決懶漢模式多線程安全問題 雙if判斷 簡單來說,就是我們在程序中通過代碼進行限制,在該程序中 只能創(chuàng)建一個對象 因為只能創(chuàng)建一個對象,所以對于我們而言就有兩種

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

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

    2024年01月18日
    瀏覽(21)
  • 【Java多線程】關(guān)于多線程的一些案例 —— 單例模式中的餓漢模式和懶漢模式以及阻塞隊列

    【Java多線程】關(guān)于多線程的一些案例 —— 單例模式中的餓漢模式和懶漢模式以及阻塞隊列

    目錄 1、單例模式 1.1、餓漢模式 2.1、懶漢模式? 2、阻塞隊列 2.1、BlockingQueue 阻塞隊列數(shù)據(jù)結(jié)構(gòu) 對框架和設(shè)計模式的簡單理解就是,這兩者都是“大佬”設(shè)計出來的,讓即使是一個代碼寫的不太好的“菜雞程序員”也能寫出還可以的代碼。 設(shè)計模式也可以認為是對編程語言語

    2024年03月23日
    瀏覽(27)
  • 【單例模式】餓漢模式和懶漢模式的單例模式

    設(shè)計模式是一種 在軟件設(shè)計中經(jīng)過驗證的解決問題的方案或者模版 。它們是從實踐中總結(jié)出來的,可以幫助解決常見的設(shè)計問題,提高代碼的重用性、維護性和擴展性。 設(shè)計模式可以分為三大類: 創(chuàng)建型模式(Creational Patterns) :創(chuàng)建型模式關(guān)注對象的實例化過程,包括如

    2024年02月16日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包