最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java單例模式的線程安全,餓漢和懶漢模式詳解

 更新時間:2022年02月23日 09:44:01   作者:Augustu_  
這篇文章主要為大家詳細(xì)介紹了Java單例模式的線程安全,餓漢和懶漢模式。文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

單例模式

創(chuàng)建唯一的一個變量(對象),在類中將構(gòu)造函數(shù)設(shè)為protected或者private(析構(gòu)函數(shù)設(shè)為相對應(yīng)的訪問權(quán)限),故外部不能實例化對象,再提供訪問它的一個全局訪問點,即定義一個static函數(shù),返回類中唯一構(gòu)造的一個實例對象。任何條件下,保證只有一個實例對象,這就是單例。

1.線程安全:在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機(jī)制保證各個線程都可以正常且正確的執(zhí)行,不會出現(xiàn)數(shù)據(jù)污染等意外情況。

2..懶漢模式:在系統(tǒng)運行中,實例并不存在,只有當(dāng)需要的時候才創(chuàng)建并使用實例。(需要考慮線程安全)可以使用靜態(tài)局部變量(c++11及以上)或者需要加鎖。

//如果是多線程 需要加鎖
class MultiThreadSingleton
{
public:
    ~MultiThreadSingleton()
    {
        cout << "~MultiThreadSingleton()" << endl;
    }   
    static MultiThreadSingleton* getInstance()
    {
        if(instance == nullptr)
        {
            //初次創(chuàng)建時加鎖
            pthread_mutex_lock(&mutex);
            instance = new MultiThreadSingleton();
            pthread_mutex_unlock(&mutex);
        }
        return instance;
    }
    void SingletonOP()
    {
        cout << "SingletonOP!" << endl;
    }
private:
    MultiThreadSingleton()
    {
        pthread_mutex_init(&mutex,NULL);
        cout << "MultiThreadSingleton()" << endl;
    }
    static pthread_mutex_t mutex;
    static MultiThreadSingleton* instance;
};
//懶漢模式  即需要的時候才去實例化對象
MultiThreadSingleton*  MultiThreadSingleton::instance = nullptr;
pthread_mutex_t MultiThreadSingleton::mutex;
//------------
MultiThreadSingleton* sig3 = MultiThreadSingleton::getInstance();
sig3->SingletonOP();
delete sig3;
//局部變量懶漢模式
static MultiThreadSingleton* getInstance()
{
     //局部變量
     static MultiThreadSingleton localInstance;
     return &localInstance;
}
//-----------------------------
//懶漢局部變量
 MultiThreadSingleton* sig4 = MultiThreadSingleton::getInstance();
 MultiThreadSingleton* sig5 = MultiThreadSingleton::getInstance();
 sig4->SingletonOP();
 if(sig4 == sig5) cout << "Test!" << endl;

3.餓漢模式:指系統(tǒng)一運行,就初始化創(chuàng)建實例,當(dāng)需要的時候,直接調(diào)用就行。(本身就是線程安全)

1.二者的主要區(qū)別就是創(chuàng)建實例的時間不同

2.使用懶漢單例時,推薦使用內(nèi)部靜態(tài)變量的懶漢單例,代碼量少。

3.懶漢式是空間換時間,適應(yīng)于訪問量較少;餓漢式是時間換空間,適應(yīng)于訪問量較大或者線程較多時。

class MultiThreadSingleton
{
public:
    ~MultiThreadSingleton()
    {
        cout << "~MultiThreadSingleton()" << endl;
    }   
    static MultiThreadSingleton* getInstance()
    {
        // if(instance == nullptr)
        // {
        //     return new MultiThreadSingleton();
        // }
        return instance;
    }
    void SingletonOP()
    {
        cout << "SingletonOP!" << endl;
    }
private:
    MultiThreadSingleton()
    {
        cout << "MultiThreadSingleton()" << endl;
    }
    static MultiThreadSingleton* instance;

};
//餓漢模式  即在類加載時時就創(chuàng)建對象,適合訪問量較大的時候,用空間換時間
MultiThreadSingleton*  MultiThreadSingleton::instance = new MultiThreadSingleton();

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • 關(guān)于SpringBoot配置文件加載位置的優(yōu)先級

    關(guān)于SpringBoot配置文件加載位置的優(yōu)先級

    這篇文章主要介紹了關(guān)于SpringBoot配置文件加載位置的優(yōu)先級,我們也可以通過spring.config.location來改變默認(rèn)的配置文件位置,項目打包好后,我們可以通過命令行的方式在啟動時指定配置文件的位置,需要的朋友可以參考下
    2023-10-10
  • 使用springboot單元測試對weblistener的加載測試

    使用springboot單元測試對weblistener的加載測試

    這篇文章主要介紹了使用springboot單元測試對weblistener的加載測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • logback標(biāo)記日志過濾器MarkerFilter源碼解讀

    logback標(biāo)記日志過濾器MarkerFilter源碼解讀

    這篇文章主要為大家介紹了logback標(biāo)記日志過濾器MarkerFilter源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java_時間戳與Date_相互轉(zhuǎn)化的實現(xiàn)代碼

    java_時間戳與Date_相互轉(zhuǎn)化的實現(xiàn)代碼

    本篇文章是對java_時間戳與Date_相互轉(zhuǎn)化的實現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下如下。
    2016-11-11
  • MyBatis 與 Spring 的完美整合方法

    MyBatis 與 Spring 的完美整合方法

    MyBatis 和 Spring 兩大框架已經(jīng)成了 Java 互聯(lián)網(wǎng)技術(shù)主流框架組合,它們經(jīng)受住了大數(shù)據(jù)量和大批量請求的考驗,在互聯(lián)網(wǎng)系統(tǒng)中得到了廣泛的應(yīng)用。這篇文章主要介紹了MyBatis 與 Spring 整合,需要的朋友可以參考下
    2018-04-04
  • 基于java查找并打印輸出字符串中字符出現(xiàn)次數(shù)

    基于java查找并打印輸出字符串中字符出現(xiàn)次數(shù)

    這篇文章主要介紹了基于java查找并打印輸出字符串中字符出現(xiàn)次數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Struts2在打包json格式的懶加載異常問題

    Struts2在打包json格式的懶加載異常問題

    這篇文章主要為大家詳細(xì)介紹了Struts2在打包json格式的懶加載異常問題,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java中如何實現(xiàn)對類的對象進(jìn)行排序

    java中如何實現(xiàn)對類的對象進(jìn)行排序

    在本篇文章里小編給各位整理一篇關(guān)于java中如何實現(xiàn)對類的對象進(jìn)行排序知識點內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Java在重載中使用Object的問題

    Java在重載中使用Object的問題

    這篇文章主要介紹了Java在重載中使用Object的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng)的詳細(xì)步驟

    javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng)的詳細(xì)步驟

    這篇文章主要介紹了javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論

衡东县| 墨脱县| 古蔺县| 云林县| 双峰县| 临夏市| 正定县| 迭部县| 长顺县| 横山县| 庄河市| 永丰县| 宜章县| 赤壁市| 江安县| 万山特区| 申扎县| 延边| 平安县| 浦县| 南召县| 南昌县| 闻喜县| 鄯善县| 社旗县| 湘西| 利辛县| 太仆寺旗| 门头沟区| 龙门县| 夏河县| 包头市| 峨边| 南京市| 巴中市| 聂拉木县| 大宁县| 吉安市| 太康县| 台前县| 祁连县|