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

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

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

概念

????????保證指定的類只有一個實例,不能創(chuàng)建出其他的實例

實現(xiàn)方式

? ? ? ? 1.餓漢模式

? ? ? ? ? ? ? ? 1.1 代碼展示

package 設(shè)計模式;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wuyulin
 * Date: 2023-07-28
 * Time: 11:28
 */

//單例模式(餓漢模式)
//保證Singleton類只有一個實例
//Singleton類中instance對象的創(chuàng)建時機:在Singleton類被jvm加載的時候創(chuàng)建,Singleton類會在第一次使用的時候被加載,不一定是程序一啟動的時候
class Singleton{
    //帶有static的是類屬性,由于每個類的類對象是單例的,所以類對象的屬性(static)也是單例的
    private static Singleton instance=new Singleton();
    public static Singleton getSingleton(){
        return instance;
    }   //當多個線程調(diào)用getSingleton方法相當于多個線程讀取同一個變量,這是線程安全的

    //由于要規(guī)定在類的外部不能實例化Singleton類型的對象,所以要把構(gòu)造函數(shù)改為私有的,這樣就在類外部就不能實例化Singleton類的對象了
    private Singleton(){};
}
public class Deom1 {
    public static void main(String[] args) {
        Singleton s1=Singleton.getSingleton();
        Singleton s2=Singleton.getSingleton();

        //Singleton s3=new Singleton();

        System.out.println(s1==s2);
        //System.out.println(s1==s3);
    }
}

? ? ? ? ? ? ? ? 1.2 Singleton類中instance對象的創(chuàng)建時機

????????????????Singleton類中instance對象的創(chuàng)建時機:在Singleton類被jvm加載的時候創(chuàng)建,Singleton類會在第一次使用的時候被加載,不一定是程序一啟動的時候

? ? ? ? ? ? ? ? 1.3 控制Singleton類的實例只有一個的核心步驟

? ? ? ? ? ? ? ? ? ? ? ? 1.3.1 在類屬性(static)中進行創(chuàng)建,帶有static的是類屬性,由于每個類的類對象是單例的,所以類對象的屬性(static)也是單例的

? ? ? ? ? ? ? ? ? ? ? ? 1.3.2 提供一個獲取這個對象的接口,方便在類外調(diào)用這個對象

? ? ? ? ? ? ? ? ? ? ? ? 1.3.3 由于規(guī)定在類的外部不能實例化Singleton類型的對象,所以要把構(gòu)造函數(shù)改為私有的,這樣就在類外部就不能實例化Singleton類的對象了

? ? ? ? ? ? ? ? 1.4線程安全問題

????????????????餓漢模式實現(xiàn)單例模式是沒有線程安全問題的,因為多個線程調(diào)用getSingleton()方法,相當于多個線程讀取instance引用的值,沒有涉及到多個線程進行修改,所以沒有線程安全問題

? ? ? ? 2.懶漢模式

? ? ? ? ? ? ? ? 2.1代碼展示

package 設(shè)計模式;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wuyulin
 * Date: 2023-07-28
 * Time: 12:05
 */
//單例線程(懶漢模式)
//SingletonLazy類中instance對象創(chuàng)建的時機:在第一次調(diào)用getInstance()方法時創(chuàng)建
class SingletonLazy{
    private static volatile SingletonLazy instance=null;    //加上volatile避免內(nèi)存可見性問題
    public static SingletonLazy getInstance(){
        if(instance==null){ //第一個條件判斷是否需要加鎖
            synchronized(SingletonLazy.class){  //第二個條件用于判斷是否要創(chuàng)建對象
                if(instance==null){
                    instance=new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy(){};
}
public class Demo2 {
    public static void main(String[] args) {
        SingletonLazy s1=SingletonLazy.getInstance();
        SingletonLazy s2=SingletonLazy.getInstance();

        System.out.println(s1==s2);

        //SingletonLazy s3=new SingletonLazy();
    }



}

? ? ? ? ? ? ? ? 2.2SingletonLazy類中instance對象創(chuàng)建的時機

????????????????????????在第一次調(diào)用getInstance()方法時創(chuàng)建

? ? ? ? ? ? ? ? 2.3控制SingletonLazy類的實例只有一個的核心步驟

? ? ? ? ? ? ? ? ? ? ? ? 2.3.1在類屬性(static)中進行創(chuàng)建聲明,帶有static的是類屬性,由于每個類的類對象是單例的,所以類對象的屬性(static)也是單例的

? ? ? ? ? ? ? ? ? ? ? ? 2.3.2 提供一個實例化這個對象并返回這個對象的接口

? ? ? ? ? ? ? ? ? ? ? ? 2.3.3 由于規(guī)定在類的外部不能實例化Singleton類型的對象,所以要把構(gòu)造函數(shù)改為私有的,這樣就在類外部就不能實例化Singleton類的對象了

? ? ? ? ? ? ? ? 2.4 線程安全問題

????????????????????????懶漢模式存在線程安全問題

????????????????????????當多個線程判斷instance=null,可能多個線程都會判斷為null值,導(dǎo)致創(chuàng)建多個對象,所以要對getInstance()方法中的代碼進行加鎖,將判斷和創(chuàng)建對象兩個操作變成一個原子性的操作

????????????????????????但實際上是需要一直加鎖的嗎?不是的,只有我們準備實例化instance對象的時候會出現(xiàn)線程安全問題,當創(chuàng)建成功后,instance!=null,此時多個線程都是獲得instance引用的值,不存在線程安全問題,也就不需要加鎖了,所以要判斷一下是否需要加鎖,當instance為null表示當前第一次準備創(chuàng)建該對象,此時加鎖控制只有第一個線程創(chuàng)建對象,其余線程返回instance的值,instance不為null說明instance對象已經(jīng)創(chuàng)建成功,多個線程都只是讀取instance的值,不存在線程安全問題,所以不用加鎖

?????????????????????加了鎖以后該程序其實還有內(nèi)存可見性問題,因為在第一次調(diào)用getInstance()方法創(chuàng)建對象后,第二次去讀取instance的值,你不一定能讀到最新的instance的值,原因請看線程安全問題(內(nèi)存可見性),所以要在instance變量聲明的時候加上volatile(易變的),解決內(nèi)存可見性問題

? ? ? ? ? ? ? ? ? ? ? 使用volatile不僅僅是為了預(yù)防出現(xiàn)內(nèi)存可見性問題,還要解決指令重排序問題,指令重排序問題請看線程安全問題(指令重排序)

????????????????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-613489.html

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

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

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

相關(guān)文章

  • JAVA設(shè)計模式——單例模式

    JAVA設(shè)計模式——單例模式

    單例模式是應(yīng)用最廣的設(shè)計模式之一,也是程序員最熟悉的一個設(shè)計模式,使用單例模式的類必須保證只能有創(chuàng)建一個對象。 今天主要是回顧一下單例模式,主要是想搞懂以下幾個問題 為什么要使用單例? 如何實現(xiàn)一個單例? 單例存在哪些問題? 單例對象的作用域的范圍

    2024年02月16日
    瀏覽(22)
  • 設(shè)計模式篇(Java):單例模式

    設(shè)計模式篇(Java):單例模式

    上一篇:設(shè)計模式篇(Java):前言(UML類圖、七大原則) 所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法(靜態(tài)方法)。 構(gòu)造器私有化 (防止 new ) 類的內(nèi)部創(chuàng)建對象 向外暴露一個靜

    2024年02月11日
    瀏覽(29)
  • Java設(shè)計模式---單例 工廠 代理模式

    單例模式是設(shè)計模式中的一種,屬于創(chuàng)建型模式。在軟件工程中,單例模式確保一個類只有一個實例,并提供一個全局訪問點。這種模式常用于那些需要頻繁實例化然后引用,且創(chuàng)建新實例的開銷較大的類,例如數(shù)據(jù)庫連接池、緩存管理等。 意圖 :保證一個類僅有一個實例

    2024年01月24日
    瀏覽(28)
  • java設(shè)計模式-單例

    單例模式是一種創(chuàng)建型設(shè)計模式,它可以保證一個類只有一個實例,并提供全局訪問點。單例模式在實際開發(fā)中經(jīng)常使用,可以避免多個實例引起的資源浪費和同步問題。常見的java實現(xiàn)方式有多種。 餓漢式單例模式是指在類加載時就創(chuàng)建了單例對象,因此在調(diào)用時不需要再

    2024年01月18日
    瀏覽(26)
  • Java與設(shè)計模式(4):單例模式

    單例模式是一種創(chuàng)建型設(shè)計模式,它確保一個類只有一個實例,并提供全局訪問點來訪問該實例。 在單例模式中,類的構(gòu)造函數(shù)被私有化,從而禁止外部直接實例化該類。通過一個靜態(tài)方法或靜態(tài)變量來控制類的實例化過程,并返回同一個實例。 單例模式的特點包括: 單一

    2024年02月12日
    瀏覽(28)
  • Java設(shè)計模式之單例模式

    Java設(shè)計模式之單例模式

    定義:保證一個類僅有一個實例,并提供一個全局訪問點 類型:創(chuàng)建型 想確保任何情況下都絕對只有一個實例 例如:線程池,數(shù)據(jù)庫連接池一般都為單例模式 單例模式優(yōu)點 在內(nèi)存中只有一個實例,減少內(nèi)存開銷 可以避免對資源的多重占用 設(shè)置全局訪問點,嚴格控制訪問

    2024年02月02日
    瀏覽(56)
  • Java設(shè)計模式(八)— 單例模式3

    Java設(shè)計模式(八)— 單例模式3

    單例模式之靜態(tài)內(nèi)部類 單例模式之枚舉方式 單例模式之JDK源碼分析 Hello,小伙伴們,歡迎來到柚子的博客~讓我們一起成長吧o( ̄▽ ̄)ブ 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 代碼如下(示例): 類被裝載的時候,類里面的靜態(tài)內(nèi)部類也是會被裝載的,而且線

    2024年02月09日
    瀏覽(55)
  • 03-JAVA設(shè)計模式-單例模式詳解

    03-JAVA設(shè)計模式-單例模式詳解

    單例模式(Singleton Pattern)是設(shè)計模式中的一種,它確保一個類僅有一個實例,并提供一個全局訪問點來訪問該實例。這種設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 單例模式的應(yīng)用場景十分廣泛,主要涉及需要頻繁使用某個對象而又不想重復(fù)創(chuàng)建的情況

    2024年04月13日
    瀏覽(30)
  • java設(shè)計模式-單例模式(Singleton)

    單例模式(Singleton)就是一個類只能有一個實例,自行實例化,并向系統(tǒng)提供這一實例,這個類就是單例類。單例模式的特點: 一個類只能有一個實例; 單例類自己實例化; 單例類給其它對象提供這個單一實例。 資源管理類經(jīng)常被設(shè)計為單例模式,例如管理屬性文件的類。

    2024年02月15日
    瀏覽(19)
  • Java——單例設(shè)計模式

    Java——單例設(shè)計模式

    設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風格、以及解決問題的思考方式。設(shè)計模式免去我們自己再思考和摸索。就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜、“套路”。 經(jīng)典的設(shè)計模式共有23種。每個設(shè)計模式均是特定環(huán)境下特定問題的

    2024年02月11日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包