精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久久精品久久| 国产精品123| 国产亚洲精品美女| 天天干天天干天天干天天干天天干| jzzjzzjzz亚洲成熟少妇| 美女一区二区三区在线观看| 久久99久久99精品中文字幕| 国产不卡一二三| 国产精品一区二区av影院萌芽| 亚洲国产精品成人综合色在线婷婷 | 亚洲国产精品suv| 亚洲欧美日韩专区| 另类专区欧美制服同性| 男生裸体视频网站| 99精品美女视频在线观看热舞| 亚洲成人精品一区二区| 亚洲三级一区| 青青草成人在线| av鲁丝一区鲁丝二区鲁丝三区| 欧美大胆性生话| 亚洲精品老司机| 婷婷久久青草热一区二区| 精品国产免费无码久久久| 久久久久国产精品一区二区| 欧美成人在线网站| 欧美成人另类视频| 色狠狠久久av综合| 欧美一级爆毛片| 亚洲另类第一页| 一区二区乱码| 亚洲成在线观看| 日韩video| 99视频在线观看地址| 不卡欧美aaaaa| 亚洲a级在线观看| 中文在线免费观看| 思思99re6国产在线播放| 国产精品12区| 成人h猎奇视频网站| 国产视频1区2区| 亚洲九九精品| 欧美极品少妇xxxxⅹ裸体艺术 | 亚洲国产精华液网站w| 国产色综合一区二区三区| 国产高中女学生第一次| 韩日精品视频一区| 成人黄色免费看| 一级欧美一级日韩| 麻豆成人久久精品二区三区红| 欧美与欧洲交xxxx免费观看| 欧美成人免费观看视频| 色777狠狠狠综合伊人| 亚洲色图日韩av| 美女久久久久久久久久| 亚洲国产精品嫩草影院久久av| 亚洲黄色成人网| 亚洲中文字幕一区| 亚洲三级性片| 韩国午夜理伦三级不卡影院| 日本伊人精品一区二区三区介绍| 成年免费在线观看| 夜夜嗨av一区二区三区网站四季av| 欧美日本啪啪无遮挡网站| 福利所第一导航| 一区二区亚洲| 欧美在线免费观看| 涩涩视频在线观看| 韩国精品免费视频| 国产精品18毛片一区二区| 人成网站在线观看| 久久亚洲欧美国产精品乐播| 日韩国产伦理| 麻豆网在线观看| 亚洲一区自拍偷拍| 91专区在线观看| 日韩高清在线| 日韩一区二区三区电影| 欧美做受高潮中文字幕| 亚洲理论电影片| www.亚洲天堂| 久久精品久久国产| 日韩精品免费专区| 91亚洲va在线va天堂va国| 亚洲欧美高清视频| 久久久久久久电影| 中文字幕一区二区三区有限公司| 日本三级韩国三级欧美三级| 欧美日韩国产中文精品字幕自在自线| 日韩一级在线免费观看| 高清一区二区中文字幕| 亚洲国产精品久久久久| 国产黄色大片免费看| 希岛爱理av一区二区三区| 国内精品一区二区三区| 在线观看中文字幕码| 成人h动漫精品| 亚洲黄色一区二区三区| 日本性爱视频在线观看| 欧洲生活片亚洲生活在线观看| 色呦色呦色精品| 日韩高清三区| 久久久国产一区| 久久久久99精品成人片我成大片 | 三级av在线播放| 亚洲欧洲综合另类在线| 久久精品国产精品亚洲色婷婷| 97精品国产综合久久久动漫日韩 | 亚洲国产精品日韩专区av有中文| 国内精品一区二区三区| 97超碰人人草| 久久只精品国产| 久久综合亚洲精品| 成人av色网站| 亚洲精品在线观看www| 日韩a级片在线观看| 日韩精品一级中文字幕精品视频免费观看 | 亚洲欧美一二三| 久久r热视频| 精品国产区一区| 午夜精品一区二区三级视频| 午夜在线精品偷拍| 国产精品亚洲综合| 亚洲精品一线| 欧美精品少妇一区二区三区 | 国产一区二区三区四区大秀| 欧美激情视频一区二区| 97超碰人人模人人人爽人人爱| 久久免费美女视频| 欧美极品欧美精品欧美| 91蜜桃臀久久一区二区| 久久福利网址导航| 一级片aaaa| 国产精品国产三级国产有无不卡| 97在线播放视频| 亚洲精品3区| 欧美自拍视频在线观看| 午夜18视频在线观看| 亚洲午夜一区二区三区| 人妻巨大乳一二三区| 国产精品二区不卡| 91精品国产自产在线观看永久| 国产大学生校花援交在线播放| 欧美日韩精品在线视频| 国产在线不卡av| 91久久综合| 国产尤物91| 欧美aa在线观看| 日韩国产欧美精品在线| 五月天综合激情| 99精品久久99久久久久| 浮妇高潮喷白浆视频| 国产欧美三级电影| 4438全国亚洲精品在线观看视频| 视频一区二区免费| 欧美性猛交xxxx富婆弯腰| 国产精品无码一区二区三区免费| 日韩网站在线| 欧美一区二区在线视频观看| 亚洲精品一级二级| 日韩专区在线播放| 99视频免费看| 亚洲高清久久久| 久久久久9999| 日韩激情视频网站| 黄色免费高清视频| 一区二区亚洲视频| 98精品在线视频| 麻豆导航在线观看| 欧美视频在线观看一区| 性色国产成人久久久精品| 国产一区不卡精品| 国产va亚洲va在线va| 一本色道久久综合狠狠躁的番外| 国产精品h片在线播放| 欧美69xxx| 精品国产乱码久久久久久久| 精品人妻一区二区三区免费看| 久久久国产一区二区三区四区小说| 999在线免费视频| 日韩av一二区| 91精品入口| 91a在线视频| 国产精品免费观看| 91精品麻豆日日躁夜夜躁| 青青青在线视频| 2欧美一区二区三区在线观看视频| 国产一区亚洲二区三区| 99久久影视| 国产欧美亚洲日本| 99riav视频一区二区| 欧美老少配视频| 日韩国产福利| 欧美精选一区二区| www.国产成人| 中文字幕中文字幕在线一区 | 老司机午夜网站| 欧美一区自拍| 国产人妖伪娘一区91| 国产探花视频在线观看| 一区二区欧美在线| 亚洲欧美强伦一区二区| 在线亚洲免费视频| 久久精品视频久久| 国产三级漂亮女教师| 亚洲欧美成aⅴ人在线观看| 在线观看免费视频国产| 日本特黄久久久高潮| 日本黄色片一级片| 日本成人小视频| 国内视频一区| 国产一区二区久久久久| 日韩av黄色在线观看| 四虎影院观看视频在线观看| 亚洲人成伊人成综合网久久久 | 爱爱视频免费在线观看| 久久综合丝袜日本网| 极品白嫩少妇无套内谢| 久久精品国产秦先生| 日本www高清视频| 99在线观看免费视频精品观看| 4444在线观看| 国产大片一区| 视频一区二区三| 蜜桃一区二区三区| 精品中文字幕人| 波多野结衣欧美| 91在线观看免费高清| 日本.亚洲电影| 成人激情小说网站| 91精品视频国产| 男人操女人的视频在线观看欧美| 成人黄色av片| 亚洲国产美女| 波多野结衣av一区二区全免费观看| 欧美wwwww| 亚洲精品自在在线观看| 狠狠色丁香婷婷综合影院| 精品一卡二卡三卡四卡日本乱码 | 国产视频亚洲精品| 日本激情视频网站| 亚洲精品一线二线三线| 国产福利资源在线| 欧美一级精品在线| 精品人妻无码一区二区 | 亚洲日本在线播放| 亚洲国产精彩中文乱码av在线播放 | 韩国女同性做爰三级| 久久久亚洲欧洲日产国码αv| 日韩aaaaa| www久久精品| 免费看黄色的视频| 国产欧美一区二区三区在线看蜜臀| 国精产品一区一区三区免费视频 | 久久另类ts人妖一区二区| 牛牛视频精品一区二区不卡| 好吊色欧美一区二区三区视频| 欧美人与动xxxxz0oz| 蜜桃av色综合| 红桃成人av在线播放| 视频二区一区| 亚洲一区色图| 欧美精品一区二区三区三州| 国产精品免费看| 激情内射人妻1区2区3区| 日本午夜一区二区| 男插女视频网站| proumb性欧美在线观看| 日本高清www| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | av色综合久久天堂av综合| 真人bbbbbbbbb毛片| 国产午夜精品一区二区三区四区| 特黄一区二区三区| 一区二区三区在线免费观看| 日本熟妇毛耸耸xxxxxx| 色域天天综合网| 国产精品视频a| 亚洲加勒比久久88色综合 | 欧美成人高清视频| xxxx在线视频| 国产精品电影久久久久电影网| av成人在线观看| 成人综合色站| 精品国产一区二区三区小蝌蚪| 国产精品99久久久久久大便| 极品尤物久久久av免费看| 欧美污视频网站| 激情文学综合插| 懂色av粉嫩av蜜乳av| 国产精品美女一区二区| 国产精品自拍视频一区| 欧美亚洲国产一区二区三区va| 精品久久久免费视频| 日韩久久免费电影| 黄网站免费在线播放| 欧美在线激情网| 精品国产亚洲一区二区三区在线| 噜噜噜噜噜久久久久久91| 中文字幕一区二区av| 毛片av免费在线观看| 国产成人av一区| 一级片黄色录像| 精品国产91久久久久久| 99在线精品视频免费观看20| 亚洲男人av在线| 色婷婷视频在线观看| 国产精品69久久| 老牛影视av一区二区在线观看| 伊人情人网综合| 久久一区中文字幕| 无码任你躁久久久久久老妇| 中文字幕一区二区三| 在线观看 亚洲| 亚洲激情在线观看视频免费| 怡红院在线观看| 国产一区玩具在线观看| 国产亚洲一区二区三区啪| 亚洲理论电影在线观看| 精品无码三级在线观看视频| 天天躁夜夜躁狠狠是什么心态| 亚洲成人免费在线| 国产三级小视频| xxxxxxxxx欧美| 欧洲成人一区| 欧美专区一二三| 在线亚洲欧美| 国产黑丝一区二区| 亚洲国产精品一区二区久久 | 日本少妇吞精囗交| 欧美一区二区免费视频| 日本在线观看免费| 国产精品一区=区| 精品国产乱码久久久久久果冻传媒| 可以在线看的av网站| 成人av电影在线观看| 国产无码精品视频| 亚洲成人动漫在线播放| 免费男女羞羞的视频网站在线观看| 成人激情视频免费在线| 91精品久久久久久久久久不卡| 无限资源日本好片| 国产精品麻豆99久久久久久| 中文字幕欧美在线观看| 中文字幕精品网| 日韩黄色在线| 97av中文字幕| 国产·精品毛片| 国产精品成人网站| 日韩精品高清视频| 美女100%一区| 手机看片福利永久国产日韩| 日韩电影在线观看一区| 中国1级黄色片| 欧美精品久久久久久久多人混战 | 希岛爱理一区二区三区| 91精品国产三级| 亚洲午夜电影在线| 天堂a中文在线| 国产精品久久97| 国产精品精品| 三上悠亚 电影| 午夜影院久久久| 麻豆av电影在线观看| 国产精品一区二区三区免费视频| 我不卡影院28| 91传媒理伦片在线观看| 色综合欧美在线视频区| 亚洲图片88| 成人av资源| 日韩一级大片| 国产毛片欧美毛片久久久| 欧美精品xxxxbbbb| 爱看av在线入口| 五月天亚洲综合小说网| 国产精品一区三区| 国产91精品一区| 久久久国产一区二区| 美腿丝袜亚洲图片| 黄色三级视频在线| 亚洲在线免费播放| 国产在线小视频| 亚洲综合成人婷婷小说| 国产精品入口66mio| 四虎影视一区二区| 亚洲国产黄色片| 黄色欧美视频| 欧美日本视频在线观看| 国产精品美女久久久久高潮| 亚洲av无码专区在线| 日本高清不卡在线| 黑人一区二区| 特黄一区二区三区| 亚洲精品在线不卡| 视频成人永久免费视频| caopor在线视频| 亚洲图片一区二区| 午夜视频在线观看免费视频| 精品国产一区二区三区久久久久久| 青青草97国产精品免费观看无弹窗版 | 日韩av电影在线播放|