欧美日韩午夜精品不卡综合-欧美日韩系列-欧美日韩小视频-欧美日韩性-成人五月网-成人五级毛片免费播放

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 企資快報 » 品牌 » 正文

單例模式你寫對了嗎?

放大字體  縮小字體 發(fā)布日期:2023-02-28 19:43:49    作者:馮馨代    瀏覽次數(shù):39
導(dǎo)讀

前言我們都知道,單例模式是設(shè)計模式里最簡單得模式,無論是代碼還是模式得理解都是最簡單得,但是那么簡單得東西,你真得寫對了么?單例模式單例模式——確保一個類只有一個實(shí)例,并提供全局訪問點(diǎn)。要點(diǎn):確保程序

前言

我們都知道,單例模式是設(shè)計模式里最簡單得模式,無論是代碼還是模式得理解都是最簡單得,但是那么簡單得東西,你真得寫對了么?

單例模式

單例模式——確保一個類只有一個實(shí)例,并提供全局訪問點(diǎn)。

要點(diǎn):

  • 確保程序中一個類最多只有一個實(shí)例。
  • 提供訪問這個實(shí)例得全局點(diǎn)。

    乍一看,確實(shí)簡單,也很好理解,看看怎么實(shí)現(xiàn)得,代碼:

    public class RedisSingleton { private static RedisSingleton redisSingleton; private RedisSingleton(){ } public static RedisSingleton getInstance(){ if (redisSingleton == null){ redisSingleton = new RedisSingleton(); } return redisSingleton; }}

    說明:目得為了演示,大家不需要關(guān)心Redis得內(nèi)容。

    簡單吧,把構(gòu)造器 private 不讓別人進(jìn)行實(shí)例化,然后提供一個對外實(shí)例化得靜態(tài)方法,如果想使用這個實(shí)例,那就必須通過 getInstance() 方法進(jìn)行獲取具體得實(shí)例,是不是滿足了單例模式得2個要點(diǎn)?確實(shí)是,但是,有句“古話”說得好:程序員要把任何一個應(yīng)用都當(dāng)成多線程應(yīng)用。

    提問:如果有多個線程同時去訪問getInstance() ,拿到得能確保是同一個實(shí)例么?

    public static RedisSingleton getInstance(){ if (redisSingleton == null){ redisSingleton = new RedisSingleton(); } return redisSingleton;}

    那咋搞?這不是違背了單例得核心原則(最多只有一個實(shí)例)了么?有經(jīng)驗(yàn)得同學(xué),可能已經(jīng)意識到了,給這段代碼加鎖啊[贊]。

    給 getInstance 加同步鎖

    我們在 getInstance() 方法上加 synchronized 關(guān)鍵字實(shí)現(xiàn)同步鎖,這個時候,每個人進(jìn)入這個方法前,都需要等待上一個線程結(jié)束之后,才能進(jìn)入這個方法,這個時候就可以保證最多只有一個實(shí)例了。代碼:

    public static synchronized RedisSingleton getInstance(){ if (redisSingleton == null){ redisSingleton = new RedisSingleton(); } return redisSingleton;}

    打完收工~!

    后來,項目越來越牛B了,自己寫得這個單例越來越多得地方在使用,然后他們就發(fā)現(xiàn)自己寫得代碼怎么越來越慢,經(jīng)過排查,就是因?yàn)樽约簩懙眠@個單例引起得,因?yàn)椴还苣愣嗌偃?,你都必須先等待上一個人拿完了他才能繼續(xù)拿,已經(jīng)驗(yàn)證影響別人得使用了,咋搞?當(dāng)然是優(yōu)化了(誰叫甲方是Babababa,哈哈,開玩笑)。

    使用 volatile 做雙重檢查

    在靜態(tài)變量上用volatile 關(guān)鍵字進(jìn)行修飾,保證變量可見性(多線程下),禁止jvm對該變量進(jìn)行指令重排,保證了有序性。

    public class RedisSingleton { private static volatile RedisSingleton redisSingleton; private RedisSingleton(){ } public static synchronized RedisSingleton getInstance(){ // 第1次檢測 if (redisSingleton == null){ synchronized (RedisSingleton.class){ // 第2次檢查 if (redisSingleton == null){ redisSingleton = new RedisSingleton(); } } } return redisSingleton; }}

    在上面得代碼中,synchronized 只會鎖其中一個片段,而且因?yàn)関olatile 只會執(zhí)行一次,所以確保了最多一個實(shí)例得特性。

    嗯~~ 是不是有點(diǎn)復(fù)雜,有沒有簡單點(diǎn)得,有得!有個更簡單得,因?yàn)樗焐镁€程安全,以及默認(rèn)得private 得構(gòu)造器,那就是使用枚舉實(shí)現(xiàn)單例模式。

    使用枚舉實(shí)現(xiàn)單例模式(推薦)

    public enum RedisSingleton { INSTANCE; public void set(String key, Object value){ // 其他代碼 } public String getString(String key){ // 其他代碼 return ""; } public static void main(String[] args) { // test System.out.println(RedisSingleton.INSTANCE.getString("key")); }}

    簡單吧,但是得從我們正常使用枚舉得思維跳出來。

    總結(jié)

    程序員應(yīng)該把任何一個程序都當(dāng)成是多線程。共勉~

  •  
    (文/馮馨代)
    免責(zé)聲明
    本文僅代表作發(fā)布者:馮馨代個人觀點(diǎn),本站未對其內(nèi)容進(jìn)行核實(shí),請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

    粵ICP備16078936號

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 久久成人性色生活片 | 特黄特黄aaaa级毛片免费看 | 色成人亚洲 | 欧美日韩视频一区二区三区 | 九一福利视频 | 国产天堂亚洲精品 | 日本高清毛片视频在线看 | 国产亚洲精品久久久久久久 | 欧美视频在线观看 | 日韩一级欧美一级一级国产 | 日本精品视频一视频高清 | 99久久精品免费国产一区二区三区 | 日韩精品不卡 | 久久丁香 | 精品特级一级毛片免费观看 | 国产一区二区在线播放 | 黄www.| 中文字幕在线视频在线看 | 国产精品久久久久影院色老大 | 免费观看毛片视频 | 国产精品黄页网站在线播放免费 | 国产一区二区三区四区五区tv | 亚洲欧美一区二区三区在线 | 成人影院一区二区三区 | 亚洲精品亚洲人成毛片不卡 | 97视频网站 | 午夜三级毛片 | 成人美女网 | 国产精品怡红院在线观看 | 又黄又免费的网站 | 全免费a级毛片免费毛视频 全午夜免费一级毛片 | 日韩精品一区二区三区 在线观看 | 国产成人资源 | 在线国产网站 | 另类在线视频 | 日韩在线观看视频网站 | aaa级大片| 免费人成在线观看网站 | 欧美亚洲综合网 | avtt亚洲一区中文字幕 | 欧美久久久久久久一区二区三区 |