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

【多線程初階】多線程案例之單例模式

這篇具有很好參考價(jià)值的文章主要介紹了【多線程初階】多線程案例之單例模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


前言

本文主要給大家講解多線程的一個(gè)重要案例 — 單例模式.

關(guān)注收藏, 開(kāi)始學(xué)習(xí)吧??


1. 什么是單例模式

單例模式是一種很經(jīng)典的設(shè)計(jì)模式, 那么什么叫做設(shè)計(jì)模式呢?

設(shè)計(jì)模式好比象棋中的 “棋譜”.
紅方當(dāng)頭炮, 黑方馬來(lái)跳. 針對(duì)紅方的一些走法, 黑方應(yīng)招的時(shí)候有一些固定的套路. 按照套路來(lái)走局勢(shì)就不會(huì)吃虧.
軟件開(kāi)發(fā)中也有很多常見(jiàn)的 “問(wèn)題場(chǎng)景”. 針對(duì)這些問(wèn)題場(chǎng)景, 大佬們總結(jié)出了一些固定的套路. 按照這個(gè)套路來(lái)實(shí)現(xiàn)代碼, 也不會(huì)吃虧.

單例模式能保證某個(gè)類(lèi)在程序中只存在唯一一份實(shí)例, 而不會(huì)創(chuàng)建出多個(gè)實(shí)例.

這一點(diǎn)在很多場(chǎng)景上都需要. 比如 JDBC 中的 DataSource 實(shí)例就只需要一個(gè).

單例模式具體的實(shí)現(xiàn)方式有很多種寫(xiě)法, 在這里我們主要講解 “餓漢”“懶漢” 兩種.

2. 餓漢模式

核心思想: 類(lèi)加載的同時(shí), 創(chuàng)建實(shí)例.

class Singleton {
    private static Singleton instanse = new Singleton();

    public static Singleton getInstance() {
        return instanse;
    }

    private Singleton() {};
}

注意:

  1. private static Singleton instanse = new Singleton(); 被 static 修飾, 該屬性是類(lèi)的屬性, JVM 中, 每個(gè)類(lèi)的類(lèi)對(duì)象只有唯一一份, 類(lèi)對(duì)象里的這個(gè)成員自然也是唯一一份了.
  2. private Singleton() {}; 將構(gòu)造方法設(shè)為 private, 就可以將外部的 new 操作給禁用掉.
  3. 此時(shí), 在類(lèi)內(nèi)部把實(shí)例創(chuàng)建好, 同時(shí)禁止外部重新創(chuàng)造實(shí)例, 就可以保證單例的特性了.

【多線程初階】多線程案例之單例模式,多線程學(xué)習(xí)之路,單例模式,多線程,java,線程安全,餓漢和懶漢
由于構(gòu)造方法設(shè)為 private, 導(dǎo)致 new 操作被禁用, 我們只能通過(guò)類(lèi)方法 .getInstanse 來(lái)創(chuàng)建實(shí)例, 可以看到, 這樣先后創(chuàng)建的 s1 和 s2 實(shí)例, 其實(shí)是同一個(gè)實(shí)例.

3. 懶漢模式 — 單線程版

核心思想: 類(lèi)加載的時(shí)候不創(chuàng)建實(shí)例. 第一次使用的時(shí)候才創(chuàng)建實(shí)例.

class SingletonLazy {
    private static SingletonLazy instance = null;

    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy() {};
}

注意點(diǎn)與餓漢模式差不多, 但是區(qū)別在于, 懶漢模式是 “非必要不創(chuàng)建”, 可以看到, instance 實(shí)例對(duì)象是在調(diào)用類(lèi)方法時(shí)才創(chuàng)建的.

4. 懶漢模式 — 多線程版

現(xiàn)在問(wèn)題來(lái)了, 上述兩個(gè)模式, 是否能構(gòu)保證線程安全呢?

多個(gè)線程下調(diào)用 getInstance 方法, 是否會(huì)出現(xiàn)問(wèn)題呢?

回想一下我們之前講解的線程不安全的幾個(gè)原因. 可以推斷餓漢模式下, 線程是安全的, 因?yàn)樗皇亲x數(shù)據(jù), 并沒(méi)有進(jìn)行寫(xiě)數(shù)據(jù).

但是多線程下, 懶漢模式可能無(wú)法保證創(chuàng)建對(duì)象的唯一性, 線程不安全.

線程安全問(wèn)題發(fā)生在首次創(chuàng)建實(shí)例時(shí). 如果在多個(gè)線程中同時(shí)調(diào)用 getInstance 方法, 就可能導(dǎo)致創(chuàng)建出多個(gè)實(shí)例.
一旦實(shí)例已經(jīng)創(chuàng)建好了, 后面再多線程環(huán)境調(diào)用 getInstance 就不再有線程安全問(wèn)題了(不再修改instance 了)

我們可以通過(guò)加鎖, 利用 synchronized 關(guān)鍵字就可以改善這里的線程安全問(wèn)題.

class SingletonLazy {
    private static SingletonLazy instance = null;

    public synchronized static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy() {};
}

5. 懶漢模式 — 多線程改進(jìn)版

加鎖其實(shí)是一個(gè)比較低效的操作, 因?yàn)樗麜?huì)造成阻塞等待, 非必要還是不要進(jìn)行加鎖.

以下代碼在加鎖的基礎(chǔ)上, 做出了進(jìn)一步改動(dòng):

  • 使用雙重 if 判定, 降低鎖競(jìng)爭(zhēng)的頻率.
  • 給 instance 加上了 volatile.
class SingletonLazy {
    private static volatile SingletonLazy instance = null;

    public static SingletonLazy getInstance() {
        if (instance == null) {
            synchronized (SingletonLazy.class) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy() {};
}

理解雙重 if 判定 / volatile:

加鎖 / 解鎖是一件開(kāi)銷(xiāo)比較高的事情. 而懶漢模式的線程不安全只是發(fā)生在首次創(chuàng)建實(shí)例的時(shí)候. 因此后續(xù)使用的時(shí)候, 不必再進(jìn)行加鎖了.

  • 外層的 if 就是判定下看當(dāng)前是否已經(jīng)把 instance 實(shí)例創(chuàng)建出來(lái)了.
  • 同時(shí)為了避免 “內(nèi)存可見(jiàn)性” 導(dǎo)致讀取的 instance 出現(xiàn)偏差, 于是補(bǔ)充上 volatile .
  • 當(dāng)多線程首次調(diào)用 getInstance, 大家可能都發(fā)現(xiàn) instance 為 null, 于是又繼續(xù)往下執(zhí)行來(lái)競(jìng)爭(zhēng)鎖, 其中競(jìng)爭(zhēng)成功的線程, 再完成創(chuàng)建實(shí)例的操作.
  • 當(dāng)這個(gè)實(shí)例創(chuàng)建完了之后, 其他競(jìng)爭(zhēng)到鎖的線程就被里層 if 擋住了. 也就不會(huì)繼續(xù)創(chuàng)建其他實(shí)例.
  • 有三個(gè)線程, 開(kāi)始執(zhí)行 getInstance , 通過(guò)外層的 if (instance == null) 知道了實(shí)例還沒(méi)有創(chuàng)建的消息. 于是開(kāi)始競(jìng)爭(zhēng)同一把鎖.

總結(jié)

? 本文講解了線程安全下的單例模式, 由于餓漢模式只是讀操作, 天生就是安全的, 而懶漢模式不是安全的, 因?yàn)橛袑?xiě)操作, 我們通過(guò)加鎖, 并利用雙重 if 來(lái)減少不必要的加鎖操作, 再使用 volatile 禁止指令重排序, 使其變得安全.
? 想了解更多的多線程知識(shí), 可以收藏一下本人的多線程學(xué)習(xí)專(zhuān)欄, 里面會(huì)持續(xù)更新本人的學(xué)習(xí)記錄, 跟隨我一起不斷學(xué)習(xí).
? 感謝你們的耐心閱讀, 博主本人也是一名學(xué)生, 也還有需要很多學(xué)習(xí)的東西. 寫(xiě)這篇文章是以本人所學(xué)內(nèi)容為基礎(chǔ), 日后也會(huì)不斷更新自己的學(xué)習(xí)記錄, 我們一起努力進(jìn)步, 變得優(yōu)秀, 小小菜鳥(niǎo), 也能有大大夢(mèng)想, 關(guān)注我, 一起學(xué)習(xí).

再次感謝你們的閱讀, 你們的鼓勵(lì)是我創(chuàng)作的最大動(dòng)力!!!!!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-630602.html

到了這里,關(guān)于【多線程初階】多線程案例之單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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之單例模式

    Java之單例模式

    目錄 一.上節(jié)內(nèi)容 1.什么是線程安全 2.線程不安全的原因 3.JMM(Java內(nèi)存模型) 4.synchronized鎖 5.鎖對(duì)象 6.volatile 7.wait()和notify() 8.Java中線程安全的類(lèi) 二.單例模式 1.什么是單例 2.怎么設(shè)計(jì)一個(gè)單例 1.口頭約定 2.使用編程語(yǔ)言的特性 三.餓漢模式 四.懶漢模式 1.單線程下的懶漢模

    2024年02月04日
    瀏覽(26)
  • Java設(shè)計(jì)模式之單例模式

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

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

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

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

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

    2024年03月23日
    瀏覽(27)
  • 多線程(初階六:?jiǎn)卫J剑? decoding=
  • 【Java 設(shè)計(jì)模式】創(chuàng)建型之單例模式

    【Java 設(shè)計(jì)模式】創(chuàng)建型之單例模式

    在軟件開(kāi)發(fā)中,單例模式是一種常見(jiàn)的設(shè)計(jì)模式, 它確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn) 。單例模式在需要控制某些資源,如數(shù)據(jù)庫(kù)連接池、線程池等共享資源的情況下非常有用。在本文中,我們將介紹 Java 設(shè)計(jì)模式中的單例模式,了解其實(shí)現(xiàn)方式、使用場(chǎng)景

    2024年01月18日
    瀏覽(26)
  • Java23種設(shè)計(jì)模式-創(chuàng)建型模式之單例模式

    單例模式 (Singleton Pattern):通過(guò)單例模式的方法創(chuàng)建的 類(lèi)在當(dāng)前進(jìn)程中只有一個(gè)實(shí)例 (根據(jù)需要,也有可能一個(gè)線程中屬于單例,如:僅線程上下文內(nèi)使用同一個(gè)實(shí)例),該類(lèi)負(fù)責(zé) 創(chuàng)建自己的對(duì)象 ,同時(shí) 確保只有單個(gè)對(duì)象 被創(chuàng)建。 注 : 1、單例類(lèi) 只能 有 一個(gè)實(shí)例 。

    2024年04月26日
    瀏覽(27)
  • 手寫(xiě)java設(shè)計(jì)模式之單例模式,附源碼解讀

    在Java應(yīng)用中,單例對(duì)象能保證在一個(gè)JVM中,該對(duì)象只有一個(gè)實(shí)例存在。這樣的模式有幾個(gè)好處: 1、減少類(lèi)的頻繁創(chuàng)建,減少使用頻繁使用new創(chuàng)建實(shí)例,減少GC壓力。 2、某些應(yīng)用場(chǎng)景下,使用單例模式,保證整個(gè)系統(tǒng)中只會(huì)創(chuàng)建一個(gè)類(lèi)。 單例模式分兩種:餓漢模式和懶漢模

    2024年04月29日
    瀏覽(17)
  • Java中static的應(yīng)用之單例模式

    單例模式是一種創(chuàng)建對(duì)象的設(shè)計(jì)模式,它保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)。由于單例模式只允許存在一個(gè)實(shí)例,因此它可以節(jié)省系統(tǒng)資源并提高程序的性能。在許多情況下,單例模式在應(yīng)用程序中都是非常有用的,例如數(shù)據(jù)庫(kù)連接、日志記錄、配置文件等。

    2024年02月12日
    瀏覽(26)
  • Java課堂|獨(dú)一無(wú)二的事物(設(shè)計(jì)模式之單例模式)

    Java課堂|獨(dú)一無(wú)二的事物(設(shè)計(jì)模式之單例模式)

    本文主要講述 單例模式 ,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識(shí)點(diǎn)并理解原理,做到有道無(wú)術(shù)。 單例模式是23種設(shè)計(jì)模式中 創(chuàng)建型模式 的一種,通過(guò)單例模式的方法創(chuàng)建的類(lèi)在當(dāng)前進(jìn)程或者線程中只有一個(gè)實(shí)例。單例模式有兩種比較常見(jiàn)的實(shí)現(xiàn)方式: 餓漢式

    2024年02月07日
    瀏覽(24)
  • Java設(shè)計(jì)模式之單例模式詳解--獨(dú)一無(wú)二的事物

    Java設(shè)計(jì)模式之單例模式詳解--獨(dú)一無(wú)二的事物

    本文主要講述 單例模式 ,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識(shí)點(diǎn)并理解原理,做到有道無(wú)術(shù)。 單例模式是23種設(shè)計(jì)模式中 創(chuàng)建型模式 的一種,通過(guò)單例模式的方法創(chuàng)建的類(lèi)在當(dāng)前進(jìn)程或者線程中只有一個(gè)實(shí)例。單例模式有兩種比較常見(jiàn)的實(shí)現(xiàn)方式: 餓漢式

    2024年02月07日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包