<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網(wǎng)

      掃一掃關(guān)注

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

      單例模式你寫對了嗎?

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

      前言我們都知道,單例模式是設(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)行實例化,然后提供一個對外實例化得靜態(tài)方法,如果想使用這個實例,那就必須通過 getInstance() 方法進(jìn)行獲取具體得實例,是不是滿足了單例模式得2個要點?確實是,但是,有句“古話”說得好:程序員要把任何一個應(yīng)用都當(dāng)成多線程應(yīng)用。

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

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

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

      給 getInstance 加同步鎖

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

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

      打完收工~!

      后來,項目越來越牛B了,自己寫得這個單例越來越多得地方在使用,然后他們就發(fā)現(xiàn)自己寫得代碼怎么越來越慢,經(jīng)過排查,就是因為自己寫得這個單例引起得,因為不管你多少人,你都必須先等待上一個人拿完了他才能繼續(xù)拿,已經(jīng)驗證影響別人得使用了,咋搞?當(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 只會鎖其中一個片段,而且因為volatile 只會執(zhí)行一次,所以確保了最多一個實例得特性。

      嗯~~ 是不是有點復(fù)雜,有沒有簡單點得,有得!有個更簡單得,因為它天生得線程安全,以及默認(rèn)得private 得構(gòu)造器,那就是使用枚舉實現(xiàn)單例模式。

      使用枚舉實現(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ā)布者:馮馨代個人觀點,本站未對其內(nèi)容進(jìn)行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(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

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 国产日韩精品欧美一区喷水 | 天堂久久久久久中文字幕| 免费国产在线观看老王影院| 日本久久久久亚洲中字幕| 高h辣肉嗨文公交车| 国产成人欧美一区二区三区| 肥大bbwbbw高潮喷水| 中文字幕无码日韩欧毛| 国产乡下三级全黄三级bd| 日本乱偷人妻中文字幕| 色综合久久天天综线观看| 亚洲理论电影在线观看| 国产精品日韩欧美一区二区| 色国产精品一区在线观看| 丰满妇女做a级毛片免费观看| 国产-第1页-浮力影院| 成人性生活免费视频| 精品伊人久久大香线蕉网站| tstye.cn| 亚洲妇女水蜜桃av网网站| 国产浮力第一影院| 日本成人在线播放| 秋霞免费一级毛片| 91亚洲欧美综合高清在线| 久久精品这里热有精品2015| 国产亚洲综合久久系列| 婷婷五月综合激情| 视频一区二区三区欧美日韩| 一边摸一边桶一边脱免费视频 | 高清一级做a爱免费视| 中文字幕一区精品| 亚洲综合区图片小说区| 妞干网手机视频| 美女被a到爽视频在线观看| 亚洲欧美成人影院| 欧美日韩精品一区二区三区高清视频| 麻豆69堂免费视频| 2022福利视频| 91xav在线| 97色伦图片97综合影院久久| 一区二区三区中文|