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

【多線程案例】單例模式(懶漢模式和餓漢模式)

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

1. 什么是單例模式?

提起單例模式,就必須介紹設(shè)計模式,而設(shè)計模式就是在軟件設(shè)計中,針對特殊問題提出的解決方案。它是多年來針對一些常見的問題的解決方法,具有良好的可復(fù)用性、可擴展性和可維護性。
標(biāo)準(zhǔn)的設(shè)計模式有23種,單例模式就是最常見的一種,其目的是確認(rèn)一個類只有一個實例對象,并且可以提供一個全局訪問點來訪問該實例。
單例就是指一個類的實例只有一個,即該類的所有對象都指向用同一個實例。
而多數(shù)單例模式并沒有結(jié)合多線程,在多線程環(huán)境下運行有時會出現(xiàn)線程安全問題,所以下面不僅介紹如何實現(xiàn)單例模式,還有單例模式結(jié)合多線程使用時的相關(guān)知識。

2. 立即加載/“餓漢模式”

立即加載一般還被稱作餓漢模式,根據(jù)立即,餓漢可以看出十分的急,所以在餓漢模式中,這樣單例中的唯一實例對象就被創(chuàng)建。

創(chuàng)建MyObject.java代碼如下:

//單例模式、餓漢模式
public class MyObject {
    //進行封裝,防止創(chuàng)建新的對象
    private static MyObject object = new MyObject();
    private MyObject(){};
    //通過這個方法獲得對象
    public static MyObject getObject(){
        return object;
    }
}

創(chuàng)建線程類MyThread.java:

public class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println(MyObject.getObject().hashCode());
    }
}

創(chuàng)建運行類Run.java:

public class Run {
    //測試單例模式對象是同一個
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        t1.start();
        t2.start();
        t3.start();
    }
}

運行結(jié)果:
【多線程案例】單例模式(懶漢模式和餓漢模式),Java多線程編程,單例模式,javascript,開發(fā)語言,java
運行結(jié)果相同,說明對象是同一個,成功實現(xiàn)了立即加載型單例設(shè)計模式。

3. 延時加載/“懶漢模式”

延時,懶漢可以看出代碼并不著急,所以懶漢模式型單例模式中的對象并不像餓漢模式中沒有調(diào)用前就創(chuàng)建完成,而是在第一調(diào)用方法實例時才被創(chuàng)建。
對比餓漢模式:
優(yōu)點:會減少內(nèi)存資源浪費。
缺點:多線程環(huán)境并發(fā)運行,可能會出現(xiàn)線程安全。

3.1 第一版

創(chuàng)建類MyObjectLazy.java,代碼如下:

public class MyObjectLazy {
    //單例模式、懶漢模式
    private static MyObjectLazy myObjectLazy = null;
    private static Object lock = new Object();
    private MyObjectLazy(){};
    public static MyObjectLazy getMyObjectLazy(){
        if(myObjectLazy != null){
            return myObjectLazy;
        }else{
            myObjectLazy = new MyObjectLazy();
        }
        return myObjectLazy;
    }
 }

創(chuàng)建線程類MyThreadLazy.java:

public class MyThreadLazy extends Thread{
    @Override
    public void run() {
        System.out.println(MyObjectLazy.getMyObjectLazy().hashCode());
    }
}

創(chuàng)建運行類RunLazy.java:

public class RunLazy {
    //測試對象是不是同一個,是的話就是安全的單例模式
    public static void main(String[] args) {
        MyThreadLazy t1 = new MyThreadLazy();
        MyThreadLazy t2 = new MyThreadLazy();
        MyThreadLazy t3 = new MyThreadLazy();
        t1.start();
        t2.start();
        t3.start();
    }
}

運行結(jié)果:
【多線程案例】單例模式(懶漢模式和餓漢模式),Java多線程編程,單例模式,javascript,開發(fā)語言,java
結(jié)果不同,所以并不是單例模式,其中有問題,造成線程不安全。

3.2 第二版

第一版生成不同對象,所以造成非線程安全,我們可以做出一點修改,對代碼加上鎖。
修改后的MyObjectLazy.java:

    public static MyObjectLazy getMyObjectLazy(){
        synchronized (lock){
            if(myObjectLazy == null){
                myObjectLazy = new MyObjectLazy();
            }
        }
        return myObjectLazy;
    }

運行結(jié)果:
【多線程案例】單例模式(懶漢模式和餓漢模式),Java多線程編程,單例模式,javascript,開發(fā)語言,java
說明這個單例模式是正確實現(xiàn)了。

3.3 第三版

但是第二版又暴露一個問題,上面加鎖后相當(dāng)于整個方法都加鎖,上面一個線程沒有釋放鎖,下一個線程將無法運行,造成效率低下。
所以我們繼續(xù)修改,修改后的MyObjectLazy.java:

    public static MyObjectLazy getMyObjectLazy(){
        try{
            if(myObjectLazy == null){
                Thread.sleep(1000);
                synchronized (lock){
                    myObjectLazy = new MyObjectLazy();
                }
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        return myObjectLazy;
    }

運行結(jié)果:
【多線程案例】單例模式(懶漢模式和餓漢模式),Java多線程編程,單例模式,javascript,開發(fā)語言,java
運行結(jié)果又不同了,創(chuàng)建出了三個對象,為什么?這是因為雖然上了鎖,但是if已經(jīng)判斷,只是new對象時串行。
雖然效率提高了,但這并不是單例模式。

3.4 第四版

我們可以使用DCL雙檢查鎖機制來實現(xiàn),進行兩次if判斷,使線程安全。
修改后MyObjectLazy.java:

    //再一次修改代碼,加鎖只加一塊,并且應(yīng)用DCL雙檢查機制來實現(xiàn)多線程環(huán)境下的延時加載單例模式,保證線程安全
    public static MyObjectLazy getMyObjectLazy(){
        try{
            if(myObjectLazy == null){
                Thread.sleep(1000);
                synchronized (lock){
                    if(myObjectLazy == null) {
                        myObjectLazy = new MyObjectLazy();
                    }
                }
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        return myObjectLazy;
    }

運行結(jié)果:
【多線程案例】單例模式(懶漢模式和餓漢模式),Java多線程編程,單例模式,javascript,開發(fā)語言,java
使用雙檢查鎖功能,成功解決了懶漢模式遇到多線程的問題。DCL經(jīng)常出現(xiàn)在此場景下,我們要學(xué)會應(yīng)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-690405.html

到了這里,關(guān)于【多線程案例】單例模式(懶漢模式和餓漢模式)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 設(shè)計模式第一課-單例模式(懶漢模式和餓漢模式)

    設(shè)計模式第一課-單例模式(懶漢模式和餓漢模式)

    個人理解:單例模式實際就是通過類加載的方式獲取到一個對象,并且保證這個對象在使用中只有一個,不允許再次被創(chuàng)建 1、懶漢模式的基礎(chǔ)寫法 代碼解釋: (1)、編寫LazySingleton類的時候,需要將成員屬性設(shè)定為static,這樣才會是類屬性 (2)、重寫構(gòu)造方法,將其設(shè)置

    2024年02月05日
    瀏覽(23)
  • c++單例模式包括懶漢模式和餓漢模式(優(yōu)劣勢分析和改進方法)

    c++單例模式包括懶漢模式和餓漢模式(優(yōu)劣勢分析和改進方法)

    在整個軟件的運行過程中,讓整個類有且只有一個實例化對象存在于整個進程中。 是最簡單的一個設(shè)計模式,然后再項目開發(fā)中也是使用最廣的。 1.節(jié)省資源:再整個軟件的運行過程中,只有一個實例化對象,不用重新分配新的堆空間。 2.數(shù)據(jù)的傳遞:由于單例只會創(chuàng)建一個

    2024年02月21日
    瀏覽(24)
  • 【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)
  • 關(guān)于Java中單例模式(餓漢模式和懶漢模式)的簡析

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

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

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

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

    2024年02月04日
    瀏覽(30)
  • 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)
  • 【單例模式】餓漢模式和懶漢模式的單例模式

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

    2024年02月16日
    瀏覽(24)
  • 設(shè)計模式之單例模式(懶漢, 餓漢)

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

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

    2024年02月22日
    瀏覽(20)
  • 單例模式(餓漢式單例 VS 懶漢式單例)

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

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

    2024年02月09日
    瀏覽(21)
  • JavaEE:單例模式(餓漢模式和懶漢模式)精講

    JavaEE:單例模式(餓漢模式和懶漢模式)精講

    前言 什么是單例模式? 其實用通俗的話就是程序猿約定俗成的一些東西,就比如如果你繼承了一個抽象類,你就要重寫里面的抽象方法,如果你實現(xiàn)了一個接口,你就要重寫里面的方法。如果不進行重寫,那么編譯器就會報錯。這其實就是一個規(guī)范。 而單例模式能保證某個

    2024年02月04日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包