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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

[设计模式] ------ 单例模式

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

單例模式,是眾多設(shè)計(jì)模式中,寫法最多,套路最多,坑最多,面試被問最多的設(shè)計(jì)模式。
基本上,單例模式在面試中已經(jīng)被問爛了,依稀記得我的上家公司面試我的時(shí)候,說到設(shè)計(jì)模式,直接就說,寫一種設(shè)計(jì)模式,但單例除外。
但不得不說,單例由于其概念簡(jiǎn)單,實(shí)用性廣的特點(diǎn),在項(xiàng)目中很是常見。

概念:

單例模式就是確保一個(gè)類只有一個(gè)實(shí)例的設(shè)計(jì)模式。
設(shè)計(jì)的思路無非就是先new一個(gè)實(shí)例,以后都用這個(gè)實(shí)例就行了。
難點(diǎn)在于什么時(shí)機(jī)new出這個(gè)實(shí)例,以及如何確保有且只有這一個(gè)實(shí)例。

五種常見的單例實(shí)現(xiàn)

第一種:餓漢式(新手寫法)

提前加載,所以也無法延遲加載,效率不高,不推薦

public class HungurySingleton { //缺點(diǎn),無法延時(shí)加載,沒有使用就已經(jīng)加載了private static final HungurySingleton mInstance = new HungurySingleton();private HungurySingleton(){}public static HungurySingleton getHunguryInstance(){return mInstance;} }

第二種:懶漢式(入門寫法)

沒有提前加載,但多線程下并發(fā)可能會(huì)出現(xiàn)多個(gè)實(shí)例

public class LazySingleton {private static LazySingleton mInstance;private LazySingleton(){}public static LazySingleton getmInstance(){if(mInstance == null){//就是這里,如果兩個(gè)線程并發(fā)訪問,里面的new語句就會(huì)執(zhí)行兩次mInstance = new LazySingleton();}return mInstance;} }

第三種:雙重檢查鎖(能寫出這個(gè),就有點(diǎn)東西了)

很明顯,這樣寫,就不怕上面的那種并發(fā)問題了

public class DLCSingleton {private static volatile DLCSingleton mInstance =null; //volatile關(guān)鍵字是為了禁止編譯器對(duì) volatile關(guān)鍵字修飾的變量進(jìn)行重排序,并保證volatile變量的讀操作發(fā)生在寫操作之后private DLCSingleton(){}public static DLCSingleton getmInstance(){if(mInstance == null){ //第一次檢查synchronized (DLCSingleton.class){ //同步代碼塊if(mInstance == null){ //第二次檢查mInstance = new DLCSingleton();}}}return mInstance;} }

第四種:靜態(tài)內(nèi)部類實(shí)現(xiàn)(高手寫法)

利用靜態(tài)內(nèi)部類是在被調(diào)用時(shí)才會(huì)被加載,算是延遲加載
static final 修飾instance,初始化后就不會(huì)被修改,保證線程安全

public class StaticInnerSingleton { //完成了懶漢式的延遲加載,同時(shí)static保證了線程安全。private StaticInnerSingleton(){}public static StaticInnerSingleton getIntance(){return SingletonHolder.mIntance;}private static class SingletonHolder{ //私有的,初始化的時(shí)候,沒有調(diào)用getIntance方法則不會(huì)加載//static,final是jvm提供的同步機(jī)制,初始化后就無法修改了private static final StaticInnerSingleton mIntance = new StaticInnerSingleton(); } }

第五種:(牛人寫法)

枚舉做單例,think in java中的神思想,雖然我從來沒見過誰在項(xiàng)目中實(shí)戰(zhàn)用到
但看這個(gè)網(wǎng)上說的熱火朝天,也是各種好處,比如寫法簡(jiǎn)單,線程安全

public enum EnumSingleton {SPRING,SUMMER,AUTUMN,WINTER; }

總結(jié):

我只是列出常用的,當(dāng)然,還有其他版本
比如靜態(tài)代碼塊的寫法,
還有雙重檢查鎖前一個(gè)版本,就是沒有第一步判空的寫法,
還有用synchronized修飾方法的寫法等等。

是我的話,一般情況下,
確保項(xiàng)目肯定沒有并發(fā)的話,懶漢寫法就沒問題了。
一考慮到并發(fā),就用雙重檢查鎖的寫法,是常用而且穩(wěn)定的。
至于枚舉寫法,總之我還沒有習(xí)慣這么寫,可以嘗試用用。

以上是個(gè)人意見,歡迎評(píng)論指正。

總結(jié)

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

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