精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

單例模式深度解析:從餓漢式到枚舉實現的全方位解讀

開發 前端
就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。

單例設計模式概念

就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。如果我們要讓類在一個虛擬機中只能產生一個對象,我們首先必須將類的構造器的訪問權限設置為private,這樣,就不能用new操作符在類的外部產生類的對象了,但在類內部仍可以產生該類的對象。因為在類的外部開始還無法得到類的對象,只能調用該類的某個靜態方法以返回類內部創建的對象,靜態方法只能訪問類中的靜態成員變量,所以,指向類內部產生的該類對象的變量也必須定義成靜態的。

餓漢式

class Singleton {
    // 1.私有化構造器
    private Singleton() {
    }
    // 2.內部提供一個當前類的實例
    // 4.此實例也必須靜態化
    private static Singleton single = new Singleton();
    // 3.提供公共的靜態的方法,返回當前類的對象;在內存中自始至終都存在
    public static Singleton getInstance() {
        return single;
    }
}

案例:

public static void main(String[] args) {
        User user1 = User.getUser();
        System.out.println(user1);
        User user2 = User.getUser();
        System.out.println(user2);
}
class User{
    //1、私有化構造器
    private User() {
    }
    //2、內部提供一個當前類的實例,此實例也必須靜態化
    private static User user = new User();
    //3、提供公共的靜態的方法,返回當前類的對象;在內存中自始至終都存在
    public static User getUser() {
        return user;
    }
}
//結果是一樣的,即同一個對象
com.gupao.singleton.User@6d6f6e28
com.gupao.singleton.User@6d6f6e28

static變量在類加載的時候初始化,此時不會涉及到多個線程對象訪問該對象的問題,虛擬機保證只會裝載一次該類,肯定不會發生并發問題,無需使用synchronized 關鍵字

存在的問題:如果只是加載了本類,而并不需要調用getUser,則會造成資源的浪費。

總結:線程安全、非懶加載、效率高,資源浪費

懶漢式

延遲對象的創建

方式1:普通創建

public class Singleton {
    //私有構造方法
    private Singleton() {}

    //在成員位置創建該類的對象
    private static Singleton instance;

    //對外提供靜態方法獲取該對象
    public static Singleton getInstance() {

        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

如果是多線程環境,以上代碼會出現線程安全問題。

方式2:方法加鎖

class Singleton {
    // 1.私有化構造器
    private Singleton() {
    }
    // 2.內部提供一個當前類的實例
    // 4.此實例也必須靜態化
    private static Singleton instance;
    // 3.提供公共的靜態的方法,返回當前類的對象
    public static synchronized Singleton getInstance() {//注意多線程情況
        if(instance== null) {
        instance= new Singleton();
        }
    return instance;
    }
}

以上使用同步方法會造成每次獲取實例的線程都要等鎖,會對系統性能造成影響,未能完全發揮系統性能,可使用同步代碼塊來解決

方式3:雙重檢查鎖

對于 getInstance() 方法來說,絕大部分的操作都是讀操作,讀操作是線程安全的,所以我們沒必讓每個線程必須持有鎖才能調用該方法,我們需要調整加鎖的時機。由此也產生了一種新的實現模式:雙重檢查鎖模式

public class Singleton { 

    //私有構造方法
    private Singleton() {}

    private volatile static Singleton instance;

   //對外提供靜態方法獲取該對象
    public static Singleton getInstance() {
  //第一次判斷,如果instance不為null,不進入搶鎖階段,直接返回實例
        if(instance == null) { // ①
            synchronized (Singleton.class) {
                //搶到鎖之后再次判斷是否為null
                if(instance == null) {
                    instance = new Singleton();// ②
                }
            }
        }
        return instance;
    }
}

為什么判斷兩次instance==null

第一次判斷是在代碼塊前,第二次是進入代碼塊后,第二個判斷想必都知道,多個線程都堵到代碼塊前等待鎖的釋放,進入代碼塊后要獲取到最新的instance值,如果為空就進行創建對象。那么為什么還要進行第一個判斷,第一個判斷起到優化作用,假設如果instance已經不為空了,那么沒有第一個判斷仍然會有線程堵在代碼塊前等待進一步判斷,所以如果不為空,有了第一個判斷就不用再去進入代碼塊進行判斷,也就不用再去等鎖了,直接返回。

為什么要加volatile?

  • 是為了防止指令重排序,給私有變量加 volatile 主要是為了防止第 ② 處執行時,也就是“instance = new Singleton()”執行時的指令重排序的,這行代碼看似只是一個創建對象的過程,然而它的實際執行卻分為以下 3 步:

試想一下,如果不加 volatile,那么線程A在執行到上述代碼的第 ② 處時就可能會執行指令重排序,將原本是 1、2、3 的執行順序,重排為 1、3、2。但是特殊情況下,線程 A在執行完第 3 步之后,如果來了線程 B執行到上述代碼的第 ① 處,判斷 instance 對象已經不為 null,但此時線程 A還未將對象實例化完,那么線程B將會得到一個被實例化“一半”的對象,從而導致程序執行出錯,這就是為什么要給私有變量添加 volatile 的原因了。

  1. 創建內存空間。
  2. 在內存空間中初始化對象 Singleton。
  3. 將內存地址賦值給 instance 對象(執行了此步驟,instance 就不等于 null 了)。
  • 優化作用,synchronized塊只有執行完才會同步到主內存,那么比如說instance剛創建完成,不為空,但還沒有跳出synchronized塊,此時又有10000個線程調用方法,那么如果沒有volatile,此使instance在主內存中仍然為空,這一萬個線程仍然要通過第一次判斷,進入代碼塊前進行等待,正是有了volatile,一旦instance改變,那么便會同步到主內存,即使沒有出synchronized塊,instance仍然同步到了主內存,通過不了第一個判斷也就避免了新加的10000個線程進入去爭取鎖。

總結:線程安全、懶加載、效率高。

靜態內部類(延遲初始化占位類)

靜態內部類單例模式中實例由內部類創建,由于 JVM 在加載外部類的過程中, 是不會加載靜態內部類的, 只有內部類的屬性/方法被調用時才會被加載, 并初始化其靜態屬性。靜態屬性由于被 static 修飾,保證只被實例化一次,并且嚴格保證實例化順序。

public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder{
        private  static final Singleton Instance = new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonHolder.Instance;
    }
}

第一次加載Singleton類時不會去初始化INSTANCE,只有第一次調用getInstance,虛擬機加載SingletonHolder并初始化INSTANCE,這樣不僅能確保線程安全,也能保證 Singleton 類的唯一性。

靜態內部類單例模式是一種優秀的單例模式,是開源項目中比較常用的一種單例模式。在沒有加任何鎖的情況下,保證了多線程下的安全,并且沒有任何性能影響和空間的浪費。

總結:線程安全、懶加載、效率高。

枚舉

枚舉類實現單例模式是極力推薦的單例實現模式,因為枚舉類型是線程安全的,并且只會裝載一次,設計者充分的利用了枚舉的這個特性來實現單例模式,枚舉的寫法非常簡單,而且枚舉類型是所用單例實現中唯一一種不會被破壞的單例實現模式。

public enum Singleton {

     INSTANCE;

}

提供了序列化機制,保證線程安全,絕對防止多次實例化,即使是在面對復雜的序列化或者反射攻擊的時候。

枚舉方式屬于餓漢式方式,會浪費資源

總結:線程安全、非懶加載、效率高。

幾種方式對比

方式

優點

缺點

餓漢式

線程安全、效率高

非懶加載,資源浪費

懶漢式synchronized方法

線程安全、懶加載

效率低

懶漢式雙重檢測

線程安全、懶加載、效率高

靜態內部類

線程安全、懶加載、效率高

枚舉

線程安全、效率高

非懶加載,資源浪費

責任編輯:武曉燕 來源: seven97
相關推薦

2016-12-14 14:43:11

ButterknifeAndroid

2009-12-15 10:10:42

Ruby過程對象

2011-10-26 09:28:28

紅帽大數據Gluster

2010-01-04 14:06:35

Silverlight

2009-08-24 10:39:12

思科認證CCNA思科認證CCNA

2009-12-16 17:07:27

Ruby on Rai

2009-12-21 13:06:05

WCF Address

2009-12-14 17:04:13

Ruby讀寫UNIX命

2010-01-27 13:52:15

Android多媒體框

2009-12-15 10:48:54

Ruby局部變量

2014-06-26 17:25:22

車聯網 ECU

2022-05-23 07:35:15

單例模式懶漢模式靜態內部類

2011-06-15 14:33:13

2009-09-17 09:01:10

CCNA學習指南CCNA

2009-12-21 15:48:29

WCF應用程序

2024-05-10 14:35:56

人工智能大型語言模型

2010-01-05 09:57:34

.NET Framew

2021-07-21 08:20:24

微信搜索功能設計

2011-06-28 15:18:45

Qt 單例模式

2016-02-16 14:42:58

戴爾云計算
點贊
收藏

51CTO技術棧公眾號

欧美精品在线视频观看| 樱花影视一区二区| 国产精品99导航| 大吊一区二区三区| 麻豆一区在线| 欧美午夜美女看片| 亚洲一二区在线| 狠狠人妻久久久久久综合麻豆| 亚洲第一毛片| 在线视频精品一| 无码人妻一区二区三区免费n鬼沢| 亚洲妇女成熟| 日韩理论片网站| 激情久久av| 国产孕妇孕交大片孕| 亚洲美女一区| 久久久国产精品亚洲一区| 最近日本中文字幕| 91精品一久久香蕉国产线看观看| 亚洲国产综合色| 亚洲在线色站| 免费日韩av电影| 一区二区黄色片| 日韩欧美中文在线观看| 91精品办公室少妇高潮对白| 今天免费高清在线观看国语| 韩国三级av在线免费观看| 国产一区二三区好的| 日韩免费av片在线观看| 欧美黄色一级网站| 欧美一级精品| 日韩av在线导航| 三级网站免费看| 九九久久国产| 在线欧美日韩精品| 欧美成人高潮一二区在线看| 成人在线播放| 日韩一区在线播放| 欧美一级爱爱| 飘雪影院手机免费高清版在线观看| 国产麻豆视频一区二区| 国产欧美日韩精品丝袜高跟鞋| 精品国产午夜福利| 一本久道久久综合狠狠爱| 欧美成人精品xxx| 少妇视频一区二区| 国产欧美日韩视频在线| 亚洲精品中文字幕女同| 亚洲激情 欧美| 风间由美中文字幕在线看视频国产欧美 | 蜜臀久久99精品久久久| 97超碰成人| 日韩亚洲欧美中文三级| 日本 片 成人 在线| 中文字幕21页在线看| 亚洲成人激情av| 日本中文字幕亚洲| 日日夜夜天天综合入口| 亚洲免费观看高清在线观看| 日本女人高潮视频| 国产调教视频在线观看| 综合久久给合久久狠狠狠97色| 亚洲一区高清| 麻豆传媒视频在线| 亚洲色图一区二区| www.国产二区| yellow在线观看网址| 午夜欧美2019年伦理| 国产视频九色蝌蚪| 午夜不卡影院| 欧美这里有精品| 四季av一区二区三区| 91麻豆精品国产综合久久久| 欧美一区二区网站| 亚洲一二三四五| 好吊妞视频这里有精品 | 夜夜嗨av一区二区三区中文字幕| 高清无码一区二区在线观看吞精| 国产丝袜精品丝袜| 午夜激情久久久| 国内外免费激情视频| 国产毛片精品久久| 91精品国产色综合久久| 任你躁av一区二区三区| 亚州精品视频| 中文字幕无线精品亚洲乱码一区| 日韩激情小视频| 亚洲特色特黄| 日韩av免费一区| 国产日韩精品在线观看| 亚洲天堂网av在线| 欧美日本精品| 911国产网站尤物在线观看| 精品一区二区无码| 狠狠狠色丁香婷婷综合激情| 国产精品 日韩| 日韩私人影院| 国产精品久久久久久久浪潮网站 | 91青青草免费观看| 丝袜+亚洲+另类+欧美+变态| 国产精品欧美精品| 欧美日韩福利在线| 91大神在线观看线路一区| 日韩精品专区在线影院观看| 免费黄色在线视频| 亚洲欧美在线专区| 茄子视频成人在线| 国产成人a人亚洲精品无码| 91麻豆福利精品推荐| 亚洲AV无码成人精品一区| 国产资源在线观看入口av| 欧美日韩国产欧美日美国产精品| 91精品又粗又猛又爽| 日产精品一区二区| 国内外成人免费激情在线视频| 亚洲 国产 日韩 欧美| 成人一区二区三区在线观看| 一区二区三区日韩欧美| 精品一区久久久| 黄色网页网址在线免费| 欧美视频精品一区| 波多野吉衣在线视频| 欧美猛男男男激情videos| 欧美激情网站在线观看| 中文字幕有码视频| 久久亚洲欧美国产精品乐播| 隔壁人妻偷人bd中字| 日本免费成人| 国产一区二区三区18| 日本在线观看视频网站| 韩国成人精品a∨在线观看| 日本免费高清一区二区| 超碰97国产精品人人cao| 欧美日韩成人综合| 我和岳m愉情xxxⅹ视频| 亚洲国产综合在线看不卡| 91亚洲精品丁香在线观看| 北岛玲一区二区三区| 色香蕉成人二区免费| 国产精品手机在线观看| 欧美另类亚洲| 2022国产精品| 91成人高清| 午夜精品福利一区二区蜜股av| 乱码一区二区三区| 亚洲国产精品成人| 91老司机精品视频| 2017亚洲天堂1024| 在线观看视频一区| 国产真实乱人偷精品人妻| 国产视频一区欧美| 久草热久草热线频97精品| 九色porny自拍视频在线观看| 亚洲大尺度美女在线| 免费在线观看日韩| 国产91精品一区二区| 亚洲熟妇无码av在线播放| 日韩最新av| 久久久久久久97| 少妇精品视频一区二区 | 精品欧美一区二区三区免费观看 | 欧美一二三区在线| 1024手机在线视频| 国产美女精品一区二区三区| 四虎4hu永久免费入口| 国产精品igao视频网网址不卡日韩| 精品国产欧美一区二区五十路| 在线观看国产小视频| 中文字幕中文在线不卡住| 中文字幕线观看| 欧美国产三区| 国产麻豆乱码精品一区二区三区| 黄色漫画在线免费看| 精品视频—区二区三区免费| 69av视频在线观看| 亚洲欧美在线视频观看| 精品人妻二区中文字幕| 亚洲在线电影| 一道精品一区二区三区| 日本亚州欧洲精品不卡| 欧美激情一区二区三级高清视频| 亚洲三区在线播放| 欧美色综合网站| 国产67194| 不卡电影免费在线播放一区| 欧美日韩第二页| 97人人精品| 国产一区二区三区无遮挡| 欧美日韩免费看片| 菠萝蜜影院一区二区免费| 亚洲乱熟女一区二区| 精品久久久久久中文字幕| 久久午夜精品视频| 国产成人免费视频一区| www国产黄色| 婷婷综合在线| 久久草.com| 亚洲资源在线| 91超碰caoporn97人人| 日本三级在线播放完整版| 欧美大片一区二区| 无码人妻熟妇av又粗又大| 亚洲免费色视频| 人妻少妇一区二区| 国产精品一卡二卡在线观看| 狠狠爱免费视频| 欧美.www| 亚洲日本精品| 亚洲国产精品嫩草影院久久av| 国产日韩精品综合网站| www.成人影院| 欧美裸体xxxx极品少妇| h网站视频在线观看| 亚洲国产精品电影在线观看| 国产一区二区三区黄片| 欧美视频一二三| 欧美被狂躁喷白浆精品| 国产精品丝袜黑色高跟| 色呦呦一区二区| 国产精品中文有码| 蜜臀av免费观看| 日韩一级网站| 国产精品久久国产| 99精品国产一区二区三区| 蜜桃网站成人| 国产区精品视频在线观看豆花| 91精品视频免费观看| 日日夜夜天天综合| 午夜精品久久久久久久久久久久| 黄视频网站在线看| 亚洲精品一区二区网址| 欧美一级在线免费观看| 日韩午夜激情av| 亚洲最新av网站| 欧美在线视频不卡| 久久国产精品免费看| 亚洲一级在线观看| a级黄色片免费看| 中文字幕一区二区三| 免费网站在线高清观看| 26uuu精品一区二区| 精品熟女一区二区三区| 粉嫩蜜臀av国产精品网站| 午夜国产福利在线观看| 久久99精品久久久久| 日韩av手机版| 秋霞影院一区二区| 国产一二三区av| 免费久久99精品国产| 五月婷婷狠狠操| 蜜桃精品视频在线| 制服丝袜综合网| 麻豆成人免费电影| 在线观看日本一区二区| 六月丁香综合在线视频| 日韩欧美国产片| 久久国产日韩欧美精品| 最新av免费在线观看| 精品在线免费视频| 日本一二三区在线| 国产成人福利片| wwwxx日本| 93久久精品日日躁夜夜躁欧美| 醉酒壮男gay强迫野外xx| 久久亚洲精华国产精华液 | 91av网站在线播放| 天堂√8在线中文| 日韩av电影中文字幕| 黄色精品视频| 成人春色激情网| 欧美精品三级在线| 国产视频在线观看一区| 啪啪激情综合网| 欧美日韩高清在线一区| 成人精品影院| 国产成人生活片| 99日韩精品| 成人性生生活性生交12| 黄一区二区三区| 东京热av一区| 国产欧美日韩亚州综合| 国产美女久久久久久| 亚洲午夜影视影院在线观看| 男人天堂2024| 4438x成人网最大色成网站| 成人午夜免费福利| 亚洲男人天堂古典| 黄在线免费观看| 97在线视频免费观看| 精品三区视频| 99久久精品无码一区二区毛片| 免费萌白酱国产一区二区三区| 色综合久久88色综合天天提莫| 一级毛片免费高清中文字幕久久网| 我的公把我弄高潮了视频| 天堂在线一区二区| www.欧美激情.com| 99这里都是精品| 男人在线观看视频| 丰满岳妇乱一区二区三区| 日韩国产亚洲欧美| 精品少妇一区二区三区日产乱码| 国产高清视频在线| 欧美激情在线有限公司| 视频一区在线免费看| 国产精品免费观看高清| 大片网站久久| 国产深夜男女无套内射| 精品一区二区三区视频| 国产黄色网址在线观看| 一区二区三区中文字幕| 中文区中文字幕免费看| 亚洲激情第一页| 91高清在线观看视频| 国产精品av免费在线观看| 国产精品成人自拍| 一区二区三区一级片| 久久久久国产精品一区二区| 韩国三级hd中文字幕有哪些| 欧美国产精品一区二区| 久久久久久久久久久久久久av| 宅男噜噜噜66一区二区66| 国产免费av高清在线| 久久久亚洲影院| 久久久久亚洲精品中文字幕| 色之综合天天综合色天天棕色| 国产精品女主播一区二区三区| 日本女人性视频| 国产精品国产三级国产普通话99 | 色综合一本到久久亚洲91| 国产精品成人观看视频免费| 亚洲成人免费| 在线免费观看av网| 中文一区在线播放| 中文字幕精品无| 亚洲美女又黄又爽在线观看| av电影免费在线看| 99www免费人成精品| 亚洲精品网址| 99九九99九九九99九他书对| 国产精品看片你懂得| 亚洲精品国产无码| 亚洲美女自拍视频| 依依综合在线| 久久综合久久综合这里只有精品| 一本久道久久久| 亚洲国产精品成人综合久久久| 亚洲国产日韩av| 亚洲精品无码专区| 欧美高清videos高潮hd| 日韩精品一区二区三区免费视频| 日本道在线视频| 国产成人在线免费| 免费人成在线观看| 精品少妇一区二区| heyzo在线欧美播放| 国产一区精品在线| 久久高清免费观看| 亚洲精品乱码久久久久久久久久久久 | 亚洲午夜精品久久久久久久久久久久| 国产美女高潮在线| 久久国产欧美精品| 天堂va蜜桃一区二区三区| 美女爆乳18禁www久久久久久| 色婷婷激情久久| av网页在线| 成人免费网站在线| 欧美激情第10页| 国产成人av无码精品| 欧美日韩美女视频| 国产精品二线| 成人黄色网免费| 韩国自拍一区| 日韩精品卡通动漫网站| 欧美影院精品一区| 高h视频在线观看| 国产综合精品一区二区三区| 免费亚洲视频| www.xx日本| 精品国产青草久久久久福利| sese综合| 中文字幕第50页| av电影在线观看完整版一区二区| 国产免费a视频| 免费91在线视频| 少妇高潮一区二区三区| 91看片在线免费观看| 亚洲精品欧美综合四区| 香蕉视频黄色片| 国产日韩精品在线播放| 亚洲人妖在线| 国产精品视频在| 精品国产乱码久久| 天天综合网站| 精品人妻大屁股白浆无码| 久久人人爽爽爽人久久久| 国产精品视频一二区| 69久久夜色精品国产7777| 手机在线一区二区三区| 97香蕉碰碰人妻国产欧美|