日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式 单例模式

發布時間:2025/7/14 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單例模式

確保一個類只有一個實例,而且自動實例化并向整個系統提供這個實例。

實現

餓漢式

很簡單。

  • 將構造函數設置為私有的,防止外界new出該類的實例,從而失去了單例的意義。
  • 設置類的私有靜態變量,同時新建單例對象。
  • 添加共有靜態方法獲取該單例。
  • 該種方法的缺點是在類加載時就進行實例化,但是相較于其簡單易用來說,這點缺點個人認為影響不大。

    package com.mengyunzhi;/*** @author zhangxishuo on 2018/6/18*/ public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;} }

    這種實現的單例模式是最簡單的,同時多個線程操作該單例時也不會有問題。

    package com.mengyunzhi;public class Main {public static void main(String[] args) {Thread thread1 = new Thread(() -> {Singleton singleton1 = Singleton.getInstance();System.out.println("Singleton1:" + singleton1);});Thread thread2 = new Thread(() -> {Singleton singleton2 = Singleton.getInstance();System.out.println("Singleton2:" + singleton2);});thread1.start();thread2.start();} }

    注:打印時調用toString方法,因為沒有重寫toString,調用Object類中的toString,所以打印該對象的類名加哈希值。

    我們看到控制臺中打印的兩個對象地址都是89ae60d,表示同一塊內存,即表示多線程時該實現方法仍能實現單例。

    線程競爭

    我們調用的順序明明是thread1的start,然后thread2再start,但是為什么控制臺打印的順序卻是單例2和單例1呢?

    這兩個線程會競爭處理器的資源,這里打印的順序是單例2、單例1,說明處理器處執行線程時,先執行完thread2線程,后執行完thread1線程。這兩個線程可能是同時執行,也可能是來回切換執行,這取決于處理器的核心與線程。

    代碼講解

    函數式接口

    Thread類的構造函數接收的是一個Runnable接口類型的參數,所以之前創建線程的代碼長這樣。

    Thread myThread = new Thread(new Runnable() {@Overridepublic void run() {} });

    看下面的代碼,因為Runnable接口只有一個抽象的run方法需要去實現,所以就不需要去@Override聲明我要實現run方法,直接傳一個函數體不就可以嗎?這就是函數式接口。

    package java.lang;@FunctionalInterface public interface Runnable {public abstract void run(); }

    lamda表達式

    相信很多人都聽說過lamda表達式,但是總是覺得這個很高大上,其實我們接觸過lamda表達式,只是沒有注意到。

    self.init = function() {};

    在JavaScript的世界里,我們可以將一個函數傳來傳去。

    self.init = () => {};

    然后人們發現,寫function太麻煩了,他們發明了箭頭函數。用這種寫法代替一個函數。

    那Java為什么不可以?

    如果剛剛的代碼這么寫,那你應該瞬間就明白了。

    Runnable runnable = () -> {Singleton singleton1 = Singleton.getInstance();System.out.println("Singleton1:" + singleton1); }; Thread thread1 = new Thread(runnable);

    懶漢式

    這是懶漢式的寫法,當需要這個實例的時候,再去新建實例。

    package com.mengyunzhi;/*** @author zhangxishuo on 2018/6/18*/ public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }

    但是這是這種寫法是線程不安全的,我們再運行一下主函數中多個線程同時訪問單例的方法。

    上次向晨澍請教:StringBuffer線程安全,StringBuilder線程不安全。既然有的類線程安全,有的類線程不安全?那為什么不都用線程安全的呢?

    答案就是:為了實現線程安全,系統需要額外的開銷。所以有些不需要多線程的,使用線程不全的類,通常會提高速度。

    假設我們的處理器支持多個線程并行處理,當多個線程同時訪問時,thread1獲取實例,然后判斷if (instance == null),創建實例;另一個線程同時執行,instance依然是空,然后thread2調用getInstance時又創建了一個實例。這就違反了單例模式。

    synchronized

    解決該問題的方案就是用synchronized修飾該代碼塊。

    音標:['s??kr?na?zd]

    只允許一個線程訪問synchronized修飾的代碼塊,其他線程會被阻塞,等待該線程執行完再執行。

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

    應該是線程2先執行完的,所以我們猜測就是:線程2競爭到處理器資源,然后去訪問getInstance()方法,因為筆者屬于多核多線程處理器,支持線程并行執行,當線程2訪問getInstance()代碼塊時,因為有synchronized修飾,所以線程1會被阻塞,等待線程2執行完再才能訪問該代碼塊。

    線程2執行完創建實例,線程1可以訪問該代碼塊,發現instance不為空,直接返回。

    使用場景

    • 頻繁new然后銷毀的對象,降低了內存開支。
    • 當一個對象的產生需要較多資源時,如讀取配置,可以將其設置為單例,在應用啟動時產生一個單例對象常駐內存。
    • 單例是同一個對象,可以用該單例設置項目配置,用于幾個模塊之間共享。

    擴展:多線程學習

    為什么要使用多線程?

    摩爾定律

    每18個月,芯片的性能將提高一倍。

    單核心

    十幾年前,那時還是單核的時代,各大廠商做出主頻越來越高的處理器。

    但是主頻越高,意味著芯片中需要的晶體管越多,功耗越大,散熱越多,當一定程度熱量就會燒壞芯片。

    為什么CPU的頻率止步于4G?我們觸到頻率天花板了嗎?

    2004年秋,Intel的CEO公開對取消4GHz芯片的計劃道歉。

    這是Intel酷睿i7 8700K的參數,主頻僅有3.70GHz,十幾年過去了,我們依然停留在4GHz。

    多核心

    但是,為了滿足不斷增長的用戶需求,雖然無法提升單個核心的時鐘頻率,但是廠商利用多核心實現了芯片的性能提升。

    這是Intel官網對i7 8700K的描述,6核心12線程。也就是說這個處理器有6個物理核心,因為超線程技術,可以模擬出12個邏輯核心,即可以同時處理12個線程任務。

    超線程就是利用處理器剩余的資源模擬出一個新的核心,用于提高處理器的利用率。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的设计模式 单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 一区二区三区啪啪啪 | 国产aⅴ一区二区三区 | 午夜影视体验区 | 国产欧美精品一区二区色综合 | 亚洲夜夜爽 | 国产日本欧美一区二区 | 午夜视频www | 蘑菇福利视频一区播放 | 99爱在线观看 | xx色综合| 国产精品乱码一区二区三区 | 国产精品久久影院 | 国产伦精品一区二区三区视频女 | 久久99精品久久久久子伦 | 一区二区三区四区免费观看 | 黄色香港三级三级三级 | 日本三级网站在线观看 | www.brazzers.com| 午夜免费激情视频 | 打美女屁股网站 | 午夜免费在线观看 | 无码成人精品区一级毛片 | 欧美亚洲一区 | 亚洲清色| 男人都懂的网站 | 日日噜噜噜噜久久久精品毛片 | 一区二区欧美在线观看 | 91激情| 91看片黄色 | 色综合久久精品亚洲国产 | 欧美理论视频 | 粉嫩av网址| 久久123| 免费黄色大片网站 | 韩国美女啪啪 | 国产农村妇女精品一区二区 | 欧美国产日韩在线 | 亚洲精品久久久狠狠狠爱 | 国产第56页 | 白嫩情侣偷拍呻吟刺激 | 亚洲手机在线 | 激情六月婷| 成人免费视频国产免费 | 亚洲丝袜在线视频 | 日本精品一二三区 | a在线播放 | 狠狠撸视频 | 林天顾悦瑶笔趣阁 | 午夜av影视 | 欧美三级视频 | 国产农村妇女精品一二区 | 操女人逼逼视频 | 中国一区二区三区 | 久久亚洲精精品中文字幕早川悠里 | 国产真实乱偷精品视频 | 欧美日韩精品三区 | 亚洲精品乱码久久久久久日本蜜臀 | 成人免费看 | 少妇特黄a一区二区三区 | 欧美片一区二区 | 在线观看网址你懂的 | 日韩免费看片 | 一区二区三区久久久久 | 人妻精品久久久久中文 | 久久久视| 国内久久 | 欧美69精品久久久久久不卡 | 亚洲成人精 | 美女扒开腿让人桶爽 | 欧美日韩亚洲色图 | 日韩精品中文字幕在线播放 | 日韩精品一区二区三区网站 | 九九国产精品视频 | 亚洲一区www | 精品成人18 | 4438全国成人免费 | 男人日女人在线观看 | 91超碰人人| 女性裸体瑜伽无遮挡 | 影音先锋成人在线 | 欧美日韩不卡一区二区三区 | 国产成人无码精品亚洲 | 蜜桃传媒一区二区亚洲av | 免费观看av | 亚洲视频在线观看视频 | 免费无码毛片一区二区app | 国产少妇在线 | 公交顶臀绿裙妇女配视频 | 久久精品视 | 国语播放老妇呻吟对白 | 原创真实夫妻啪啪av | 在线成人一区二区 | 日产电影一区二区三区 | www.日本高清 | 污视频91 | 少妇aaaa| 影音先锋在线中文字幕 | 女人久久 | 性xxxx欧美老肥妇牲乱 |