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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

大话设计模式—单例模式

發(fā)布時間:2024/4/14 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话设计模式—单例模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

單例模式:

1、保證一個類僅有一個實例,并提供一個訪問它的全局訪問點;
2、當(dāng)一個全局使用的類被頻繁的創(chuàng)建和銷毀;或者你要控制實例的數(shù)目,節(jié)省系統(tǒng)資源的時候,可以考慮使用單例模式;
3、實現(xiàn):判斷系統(tǒng)是否存在這個單例,如果存在則返回,否則,創(chuàng)建;
4、構(gòu)造函數(shù)私有;

注意:

1、單例類只能有一個實例。
2、單例類必須自己創(chuàng)建自己的唯一實例。
3、單例類必須給所有其他對象提供這一實例。

單例模式的幾種實現(xiàn)方式:

1、懶漢式(lazy loading)

package com.dfcDemo;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;/*** 第一次調(diào)用才初始化,避免內(nèi)存浪費。* 但是必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。* getInstance() 的性能對應(yīng)用程序不是很關(guān)鍵(該方法使用不太頻繁)* @author lmb**/ public class SingletonLazy {private static Log logger = LogFactory.getLog(SingletonLazy.class);private static SingletonLazy instance;private SingletonLazy(){logger.info("singleton is constructing");}public static synchronized SingletonLazy getInstance(){if(instance == null){instance = new SingletonLazy();//用到該類實例的時候再去初始化}return instance;}public static void main(String[] args) {logger.info("main方法開始執(zhí)行---");//同時開啟100個線程去調(diào)用getInstance()方法for (int i = 0; i <= 100; i++) {new Thread(new Runnable(){@Overridepublic void run() {SingletonLazy.getInstance();}}).start();}logger.info("main方法執(zhí)行結(jié)束---");} }

運行結(jié)果:

2016-03-17 11:16:04 INFO com.dfcDemo.SingletonLazy - main方法開始執(zhí)行--- 2016-03-17 11:16:04 INFO com.dfcDemo.SingletonLazy - singleton is constructing 2016-03-17 11:16:04 INFO com.dfcDemo.SingletonLazy - main方法執(zhí)行結(jié)束---

2、餓漢式

package com.dfcDemo;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;/*** 類加載時就初始化,浪費內(nèi)存* @author lmb**/ public class SingletonHungry {private static Log logger = LogFactory.getLog(SingletonHungry.class);private static SingletonHungry instance = new SingletonHungry();//首次加載該類的時候就初始化private SingletonHungry(){logger.info("singleton is constructing");}public static SingletonHungry getInstance(){return instance;}public static void main(String[] args) {logger.info("main方法開始執(zhí)行---");//同時開啟100個線程去調(diào)用getInstance()方法for (int i = 0; i <= 100; i++) {new Thread(new Runnable(){@Overridepublic void run() {SingletonHungry.getInstance();}}).start();}logger.info("main方法執(zhí)行結(jié)束---");} }

運行結(jié)果:

2016-03-17 11:16:23 INFO com.dfcDemo.SingletonHungry - singleton is constructing 2016-03-17 11:16:23 INFO com.dfcDemo.SingletonHungry - main方法開始執(zhí)行--- 2016-03-17 11:16:23 INFO com.dfcDemo.SingletonHungry - main方法執(zhí)行結(jié)束---

3、雙檢鎖/雙重校驗鎖(DCL,即 double-checked locking)

實現(xiàn)原理:我們不讓線程每次都加鎖,而只是在實例未被創(chuàng)建的時候再加鎖。同時也能保證多線程的安全,對于instance存在的情況就直接返回;當(dāng)instance不存在,并且同時有兩個線程調(diào)用getInstance()方法時,它們都可以通過第一重instance == null判斷,然后由于synchronizd鎖機制,兩個線程只有一個能進(jìn)入,另一個在外排隊等候,必須要其中的一個進(jìn)入并出來之后另一個才能進(jìn)入。如果沒有了第二重的instance == null的判斷,則第一個線程創(chuàng)建了實例,第二個線程還是可以載繼續(xù)創(chuàng)建實例的。

package com.dfcDemo;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;/*** 這種方式采用雙鎖機制,安全且在多線程情況下能保持高性能;* getInstance() 的性能對應(yīng)用程序很關(guān)鍵* @author lmb**/ public class SingletonDCL {private static Log logger = LogFactory.getLog(SingletonDCL.class);/*** 用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的最新的值,* 即jvm虛擬機只是保證從主內(nèi)存加載到線程工作內(nèi)存的值是最新的;*/private volatile static SingletonDCL instance;private SingletonDCL(){logger.info("singleton is constructing");}public static SingletonDCL getInstance(){if (instance == null) {synchronized (SingletonDCL.class) {if (instance == null) {instance = new SingletonDCL();//用到該類實例的時候再去初始化}}}return instance;}public static void main(String[] args) {logger.info("main方法開始執(zhí)行---");//同時開啟100個線程去調(diào)用getInstance()方法for (int i = 0; i <= 100; i++) {new Thread(new Runnable(){@Overridepublic void run() {SingletonDCL.getInstance();}}).start();}logger.info("main方法執(zhí)行結(jié)束---");} }

運行結(jié)果:

2016-03-17 11:30:55 INFO com.dfcDemo.SingletonDCL - main方法開始執(zhí)行--- 2016-03-17 11:30:55 INFO com.dfcDemo.SingletonDCL - singleton is constructing 2016-03-17 11:30:55 INFO com.dfcDemo.SingletonDCL - main方法執(zhí)行結(jié)束---

比較:

由于餓漢式,即靜態(tài)初始化的方式,它是類一加載就實例化的對象,所以要提前占用系統(tǒng)資源。而懶漢式,又會面臨著多線程訪問的安全性問題,需要做雙重鎖定這樣的處理才可以保證安全。所以,到底是用哪一種方式取決于實際的需求。

實用類與單例類比較:

實用類通常也會采用私有化的構(gòu)造方法來避免其有實例,但它們還是有很多不同的:

1、實例類不保存狀態(tài),僅提供一些靜態(tài)方法或靜態(tài)屬性,而單例類是有狀態(tài)的;
2、實用類不能用于繼承和多態(tài),而單例類雖然實例唯一,但是可以有子類來繼承;
3、實用類是一些方法屬性的集合而單例卻有著唯一的對象實例。

超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。