App下載

Java單例設(shè)計模式----懶漢與餓漢

猿友 2020-12-30 17:36:49 瀏覽數(shù) (2506)
反饋

關(guān)于設(shè)計模式,這其實是單獨存在的東西,它不屬于 Java,也不屬于任何語言所獨有,但是在 Java 中使用較多,所以今天小編就給大家介紹下單例設(shè)計模式中的餓漢和懶漢這倆樸素的打工人。推薦好課:Java 多線程講解、深入解析 Java 面向?qū)ο?/a>。

dagr

首先,我們先了解下單例模式的定義:單例設(shè)計模式目的是使得類的一個對象成為系統(tǒng)中的唯一實例。

再看下,Java 中單例模式的定義:一個類有且僅有一個實例,并且自行實例化向整個系統(tǒng)提供。

那么,所謂“懶漢式”與“餓漢式”的區(qū)別,是在于建立單例對象的時間不同。

“懶漢式”:是在你真正用到的時候才去建這個單例對象;

“餓漢式”:在不管你用的用不上,一開始就建立這個單例對象。

一、餓漢式

餓漢式:通俗的來講,這位打工人對干飯?zhí)胤e極,不管餓不餓都跟餓死鬼似的,老早的就把干飯工具準(zhǔn)備好了( new 對象),隨時準(zhǔn)備干飯。

上代碼:

class Hungry_people{

    private int id;

    private String name;

    private Hungry_people(){

    }        //構(gòu)造器私有化

    private static Hungry_people Instance=new Hungry_people();  

    //內(nèi)部創(chuàng)建類的對象

    public static Hungry_people getInstance(){

        return Instance;

    }

    //提供公共的靜態(tài)方法,且返回對象。

}

public class Test1 {

    public static void main(String[] args) {

        Hungry_people hungry1 = Hungry_people.getInstance();

        Hungry_people hungry2 = Hungry_people.getInstance();

    }

}

二、懶漢式

懶漢式:通俗的講,這位打工人對干飯一點都不上心,碗筷臟了也不理,啥時候要干飯了才來洗碗筷( new 對象)。

上代碼:

class Lazy_people {

    private Lazy_people(){

    }

    private static Lazy_people Instance = null;

    //聲明當(dāng)前對象沒有初始化值

    public static Lazy_people getInstance(){

        if (Instance == null){

            Instance=new Lazy_people ();

            //需要再造對象,不要就不new對象了

        }

        return Instance;

    }

}

public class Test2 {

    public static void main(String[] args) {

       Lazy_people lazy1 = Lazy_people.getInstance();

    }

}

三、餓漢和懶漢有啥不同

對于餓漢式:

優(yōu)點:線程賊安全

缺點:對象加載時間過長

對于懶漢式:

優(yōu)點:延遲對象的創(chuàng)建,更快

缺點:多線程安全賊低,但是可以通過優(yōu)化使其可用。

四、常見面試題

1.懶漢式和餓漢式有什么不同?

答:懶漢式的特點在于實例的延遲加載。

2.懶漢式的延遲加載有沒有問題?

答:遇到多線程訪問時會出現(xiàn)安全問題。

3.如何解決該問題?

答:可以增加同步來解決。

4.增加同步的方式?

答:用同步方法或同步代碼塊都可以,但是同步方法稍微有點低效。

5.增加同步時,使用的鎖是哪一個?

答:該類所屬的字節(jié)碼文件對象。


1 人點贊