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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

研磨设计模式之 单例模式-3

發(fā)布時(shí)間:2025/7/14 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 研磨设计模式之 单例模式-3 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

3.3? 延遲加載的思想

??????? 單例模式的懶漢式實(shí)現(xiàn)方式體現(xiàn)了延遲加載的思想,什么是延遲加載呢?
??????? 通俗點(diǎn)說,就是一開始不要加載資源或者數(shù)據(jù),一直等,等到馬上就要使用這個(gè)資源或者數(shù)據(jù)了,躲不過去了才加載,所以也稱Lazy Load,不是懶惰啊,是“延遲加載”,這在實(shí)際開發(fā)中是一種很常見的思想,盡可能的節(jié)約資源。
??????? 體現(xiàn)在什么地方呢?看如下代碼:


?

3.4? 緩存的思想

??????? 單例模式的懶漢式實(shí)現(xiàn)還體現(xiàn)了緩存的思想,緩存也是實(shí)際開發(fā)中非常常見的功能。
??????? 簡單講就是,如果某些資源或者數(shù)據(jù)會(huì)被頻繁的使用,而這些資源或數(shù)據(jù)存儲在系統(tǒng)外部,比如數(shù)據(jù)庫、硬盤文件等,那么每次操作這些數(shù)據(jù)的時(shí)候都從數(shù)據(jù)庫或者硬盤上去獲取,速度會(huì)很慢,會(huì)造成性能問題。
??????? 一個(gè)簡單的解決方法就是:把這些數(shù)據(jù)緩存到內(nèi)存里面,每次操作的時(shí)候,先到內(nèi)存里面找,看有沒有這些數(shù)據(jù),如果有,那么就直接使用,如果沒有那么就獲取它,并設(shè)置到緩存中,下一次訪問的時(shí)候就可以直接從內(nèi)存中獲取了。從而節(jié)省大量的時(shí)間,當(dāng)然,緩存是一種典型的空間換時(shí)間的方案。
??????? 緩存在單例模式的實(shí)現(xiàn)中怎么體現(xiàn)的呢?

?3.5? Java中緩存的基本實(shí)現(xiàn)

??????? 引申一下,看看在Java開發(fā)中的緩存的基本實(shí)現(xiàn),在Java中最常見的一種實(shí)現(xiàn)緩存的方式就是使用Map,基本的步驟是:

  • 先到緩存里面查找,看看是否存在需要使用的數(shù)據(jù)
  • 如果沒有找到,那么就創(chuàng)建一個(gè)滿足要求的數(shù)據(jù),然后把這個(gè)數(shù)據(jù)設(shè)置回到緩存中,以備下次使用
  • 如果找到了相應(yīng)的數(shù)據(jù),或者是創(chuàng)建了相應(yīng)的數(shù)據(jù),那就直接使用這個(gè)數(shù)據(jù)。

?還是看看示例吧,示例代碼如下:

/*** Java中緩存的基本實(shí)現(xiàn)示例*/ public class JavaCache {/*** 緩存數(shù)據(jù)的容器,定義成Map是方便訪問,直接根據(jù)Key就可以獲取Value了* key選用String是為了簡單,方便演示*/private Map<String,Object> map = new HashMap<String,Object>();/*** 從緩存中獲取值* @param key 設(shè)置時(shí)候的key值* @return key對應(yīng)的Value值*/public Object getValue(String key){//先從緩存里面取值Object obj = map.get(key);//判斷緩存里面是否有值if(obj == null){//如果沒有,那么就去獲取相應(yīng)的數(shù)據(jù),比如讀取數(shù)據(jù)庫或者文件//這里只是演示,所以直接寫個(gè)假的值obj = key+",value";//把獲取的值設(shè)置回到緩存里面map.put(key, obj);}//如果有值了,就直接返回使用return obj;} }

??????? 這里只是緩存的基本實(shí)現(xiàn),還有很多功能都沒有考慮,比如緩存的清除,緩存的同步等等。當(dāng)然,Java的緩存還有很多實(shí)現(xiàn)方式,也是非常復(fù)雜的,現(xiàn)在有很多專業(yè)的緩存框架,更多緩存的知識,這里就不再去討論了。

?

3.6? 利用緩存來實(shí)現(xiàn)單例模式

??????? 其實(shí)應(yīng)用Java緩存的知識,也可以變相實(shí)現(xiàn)Singleton模式,算是一個(gè)模擬實(shí)現(xiàn)吧。每次都先從緩存中取值,只要?jiǎng)?chuàng)建一次對象實(shí)例過后,就設(shè)置了緩存的值,那么下次就不用再創(chuàng)建了。
??????? 雖然不是很標(biāo)準(zhǔn)的做法,但是同樣可以實(shí)現(xiàn)單例模式的功能,為了簡單,先不去考慮多線程的問題,示例代碼如下:

/*** 使用緩存來模擬實(shí)現(xiàn)單例*/ public class Singleton {/*** 定義一個(gè)缺省的key值,用來標(biāo)識在緩存中的存放*/private final static String DEFAULT_KEY = "One";/*** 緩存實(shí)例的容器*/private static Map<String,Singleton> map = new HashMap<String,Singleton>();/*** 私有化構(gòu)造方法*/private Singleton(){//}public static Singleton getInstance(){//先從緩存中獲取Singleton instance = (Singleton)map.get(DEFAULT_KEY);//如果沒有,就新建一個(gè),然后設(shè)置回緩存中if(instance==null){instance = new Singleton();map.put(DEFAULT_KEY, instance);}//如果有就直接使用return instance;} }

??????? 是不是也能實(shí)現(xiàn)單例所要求的功能呢?其實(shí)實(shí)現(xiàn)模式的方式有很多種,并不是只有模式的參考實(shí)現(xiàn)所實(shí)現(xiàn)的方式,上面這種也能實(shí)現(xiàn)單例所要求的功能,只不過實(shí)現(xiàn)比較麻煩,不是太好而已,但在后面擴(kuò)展單例模式的時(shí)候會(huì)有用。
??????? 另外,模式是經(jīng)驗(yàn)的積累,模式的參考實(shí)現(xiàn)并不一定是最優(yōu)的,對于單例模式,后面會(huì)給大家一些更好的實(shí)現(xiàn)方式。


3.7? 單例模式的優(yōu)缺點(diǎn)

?

1:時(shí)間和空間
??????? 比較上面兩種寫法:懶漢式是典型的時(shí)間換空間,也就是每次獲取實(shí)例都會(huì)進(jìn)行判斷,看是否需要?jiǎng)?chuàng)建實(shí)例,費(fèi)判斷的時(shí)間,當(dāng)然,如果一直沒有人使用的話,那就不會(huì)創(chuàng)建實(shí)例,節(jié)約內(nèi)存空間。
??????? 餓漢式是典型的空間換時(shí)間,當(dāng)類裝載的時(shí)候就會(huì)創(chuàng)建類實(shí)例,不管你用不用,先創(chuàng)建出來,然后每次調(diào)用的時(shí)候,就不需要再判斷了,節(jié)省了運(yùn)行時(shí)間。

2:線程安全
(1)從線程安全性上講,不加同步的懶漢式是線程不安全的,比如說:有兩個(gè)線程,一個(gè)是線程A,一個(gè)是線程B,它們同時(shí)調(diào)用getInstance方法,那就可能導(dǎo)致并發(fā)問題。如下示例:

?程序繼續(xù)運(yùn)行,兩個(gè)線程都向前走了一步,如下:



?

可能有些朋友會(huì)覺得文字描述還是不夠直觀,再來畫個(gè)圖說明一下,如圖4所示:



?????????????????????????????????????????????????????? 圖4? 懶漢式單例的線程問題示意圖

??????? 通過圖4的分解描述,明顯可以看出,當(dāng)A、B線程并發(fā)的情況下,會(huì)創(chuàng)建出兩個(gè)實(shí)例來,也就是單例的控制在并發(fā)情況下失效了。


(2)餓漢式是線程安全的,因?yàn)樘摂M機(jī)保證了只會(huì)裝載一次,在裝載類的時(shí)候是不會(huì)發(fā)生并發(fā)的。

(3)如何實(shí)現(xiàn)懶漢式的線程安全呢?
??????? 當(dāng)然懶漢式也是可以實(shí)現(xiàn)線程安全的,只要加上synchronized即可,如下:

public static synchronized Singleton getInstance(){}

???????? 但是這樣一來,會(huì)降低整個(gè)訪問的速度,而且每次都要判斷,也確實(shí)是稍微慢點(diǎn)。那么有沒有更好的方式來實(shí)現(xiàn)呢?

(4)雙重檢查加鎖
??????? 可以使用“雙重檢查加鎖”的方式來實(shí)現(xiàn),就可以既實(shí)現(xiàn)線程安全,又能夠使性能不受到大的影響。那么什么是“雙重檢查加鎖”機(jī)制呢?
??????? 所謂雙重檢查加鎖機(jī)制,指的是:并不是每次進(jìn)入getInstance方法都需要同步,而是先不同步,進(jìn)入方法過后,先檢查實(shí)例是否存在,如果不存在才進(jìn)入下面的同步塊,這是第一重檢查。進(jìn)入同步塊過后,再次檢查實(shí)例是否存在,如果不存在,就在同步的情況下創(chuàng)建一個(gè)實(shí)例,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了多次在同步情況下進(jìn)行判斷所浪費(fèi)的時(shí)間。
??????? 雙重檢查加鎖機(jī)制的實(shí)現(xiàn)會(huì)使用一個(gè)關(guān)鍵字volatile,它的意思是:被volatile修飾的變量的值,將不會(huì)被本地線程緩存,所有對該變量的讀寫都是直接操作共享內(nèi)存,從而確保多個(gè)線程能正確的處理該變量。
??????? 注意:在Java1.4及以前版本中,很多JVM對于volatile關(guān)鍵字的實(shí)現(xiàn)有問題,會(huì)導(dǎo)致雙重檢查加鎖的失敗,因此雙重檢查加鎖的機(jī)制只能用在Java5及以上的版本。
??????? 看看代碼可能會(huì)更清楚些,示例代碼如下:

public class Singleton {/*** 對保存實(shí)例的變量添加volatile的修飾*/private volatile static Singleton instance = null;private Singleton(){ }public static Singleton getInstance(){//先檢查實(shí)例是否存在,如果不存在才進(jìn)入下面的同步塊if(instance == null){//同步塊,線程安全的創(chuàng)建實(shí)例synchronized(Singleton.class){//再次檢查實(shí)例是否存在,如果不存在才真的創(chuàng)建實(shí)例if(instance == null){instance = new Singleton();}}}return instance;} } ??

???????? 這種實(shí)現(xiàn)方式既可使實(shí)現(xiàn)線程安全的創(chuàng)建實(shí)例,又不會(huì)對性能造成太大的影響,它只是在第一次創(chuàng)建實(shí)例的時(shí)候同步,以后就不需要同步了,從而加快運(yùn)行速度。
???????? 提示:由于volatile關(guān)鍵字可能會(huì)屏蔽掉虛擬機(jī)中一些必要的代碼優(yōu)化,所以運(yùn)行效率并不是很高,因此一般建議,沒有特別的需要,不要使用。也就是說,雖然可以使用雙重加鎖機(jī)制來實(shí)現(xiàn)線程安全的單例,但并不建議大量采用,根據(jù)情況來選用吧。

?

未完待續(xù)

?

轉(zhuǎn)載于:https://www.cnblogs.com/sjms/archive/2010/08/30/1812303.html

總結(jié)

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

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

主站蜘蛛池模板: 免费av在线网 | 色七七在线 | 亚洲自拍偷拍av | 国产亚洲视频在线观看 | 天堂网av中文字幕 | 中国少妇无码专区 | 国产精品99精品无码视 | 欧美日韩一区二区在线观看视频 | 成人69视频 | 久久久久9999| 夜夜骚视频 | 蜜臀av夜夜澡人人爽人人 | 亚洲欧美国产精品专区久久 | 日本乱码视频 | 国产福利短视频 | 日韩三级在线免费观看 | 国产美女被遭强高潮免费网站 | 欧美日日骚 | 欧美日韩一级视频 | 少妇色欲网 | 综合色视频 | 综合久久精品 | 国产精品yy | 谁有毛片网站 | 亚洲在线视频免费观看 | 亚洲www在线 | 天天躁日日躁狠狠躁喷水 | av综合色| 日韩精品免费播放 | 天天摸天天操天天射 | 青青艹在线视频 | www.欧美| 日韩黄色短片 | 国产无遮挡又黄又爽 | 男人看片网站 | 欧美成人精品一区二区男人小说 | 欧美日韩人妻精品一区在线 | 免费观看一区二区三区毛片 | 午夜宫 | 裸体男女树林做爰 | 一本大道综合伊人精品热热 | 国产一区二区视频在线免费观看 | 欧美视频在线播放 | 欧美一区二区三区系列电影 | 中文第一页 | 在线视频一区二区 | 韩国一区二区三区在线观看 | 中文字幕影片免费在线观看 | 亚洲精品www久久久 一级aaa毛片 | 免费看黄色一级片 | 日本男男激情gay办公室 | 亚洲天堂成人在线 | 农村妇女精品一区二区 | 欧美日韩在线视频播放 | 亚洲喷水 | 国产日韩精品在线观看 | 精品国产乱码久久久久久久软件 | 国产精品久久国产精品 | 亚州一级 | 韩日免费av | 99在线观看| 性色av一区二区三区红粉影视 | 美女在线免费视频 | 色戒在线免费 | 欧美精品久久久 | 国产精品久久亚洲 | 国产又黄又爽视频 | 天天干天天操天天爽 | 欧美人与禽zozzozzo | 午夜在线免费视频 | 99精品欧美 | 日韩一级完整毛片 | 91久久国产视频 | 2024国产精品 | 熊猫电影yy8y全部免费观看 | 熟妇女人妻丰满少妇中文字幕 | 丝袜脚交免费网站xx | 国产福利精品在线观看 | 131美女爱做视频 | 亚洲日本国产 | 国产精品一区二区三区四 | 精品无码久久久久成人漫画 | 卡通动漫亚洲综合 | 中文字幕人妻互换av久久 | 国产精品女人久久久 | 丝袜av在线播放 | 激情小说一区 | 中文字幕在线不卡视频 | 国产不卡视频在线播放 | 婷婷开心激情网 | 国产精品一区久久久 | 日本护士╳╳╳hd少妇 | av导航网 | hs网站在线观看 | 日韩欧美亚洲一区 | 欧美激情网站 | 成人一级影片 | 1024亚洲天堂 | 爱露出 |