91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

《設計模式筆記》之03簡潔高效的聊聊單例模式

發布時間:2020-03-31 04:18:13 來源:網絡 閱讀:108 作者:陸永劍講師 欄目:編程語言

設計模式是優秀程序員的必備技能,在面試中也會經常提到。

前言

IT行業是跳槽率較高的行業,這就不頻繁的去面試。我作為面試官,如果候選者其他知識都OK的話,最后就會提到<b>設計模式</b>相關的內容。如果回答的一知半解的話,我會跟他說讓他來做項目。如果回答的比較好的話,會直接安排到產品組。

作用

保證了系統內存中該類只有一個對象實例,節省系統資源。對于需要頻繁創建銷毀的對象,提高系統性能

場景

需要頻繁創建、銷毀的對象,創建對象耗時過多或耗費資源過多,但又經常用到的對象。

代碼

單例模式是設計模式中比較簡單的一種。絕大多數程序員對單例模式都比較熟悉(我剛開始學的時候,好多次都沒堅持把23種設計模式學完,造成的后果就是單例模式反反復復學了好多遍【狗頭】)。

單例模式在業界分為8種。這么多種其實不用全都學習,主要關注下線程安全的3種即可。(其他的就不要再學習,人為的增加難度了)。

  1. 雙重檢查

    public class Singleton {
    
       // 私有化構造器,方式直接通過new的方式創建
       private Singleton() {}
    
       // 提供全局的實例對象,接收創建值(懶加載)
       private static volatile Singleton instance;
    
       // 提供獲取實例的方法
       public static Singleton getInstance() {
    
           //重點1:通過 instance == null 判斷當前 instance是否為null,如果不等于null,直接返回值
           if (instance == null) {
               //重點2:通過synchronized關鍵字控制線程安全
               synchronized (Singleton.class) {
                   //重點3:synchronized內只有一個線程在執行,這時候根據對象是否為null,判斷是否創建。
                   if (instance == null) {
                       instance = new Singleton();
                   }
               }
           }
           return instance;
       }
    
        public void method(){}
    }
    • 問題1:為什么 instance 要判斷2次是否 == null ?

      synchronized (Singleton.class) {           
      if (instance == null) {
       instance = new Singleton();
      }
      }
      //1.synchronized內部的instance == null是防止重復創建實例的。比如有兩個線程A,B. A在進入到synchronized的時候,B可能也在synchronized外等待了。A線程創建instance成功后,B再進入線程,此時可根據synchronized內部的instantce == null來控制B直接使用,防止重新創建。
      //2.synchronized外部的instance == null 是控制效率的。如果此時已經存在instance對象時,再來一個線程C,此時無需執行synchronized部分代碼,直接返回。提高了執行效率。(都知道synchronized比較慢【狗頭】)
    • 問題2:volatile是干嗎的?

      volatile這個關鍵字是個很大的話題,涉及到內存模型。

      簡單來講:volatile讓變量每次在使用的時候,都從主存中取。而不是從各個線程的“工作內存”。

  2. 靜態內部類

    利用靜態內部類的加載機制來實現的單例

    public class Singleton {
    
       private Singleton() {}
    
       //1.靜態內部類機制:在Singleton加載的時候,SingletonInstance類不會立即被加載。實現了懶加載的功能
       //2.在調用SingletonInstance.INSTANCE會立即加載,且是線程安全的。
       public static class SingletonInstance {
           private static final Singleton INSTANCE = new Singleton();
       }
       // 提供獲取實例的方法
       public static Singleton getInstance() {
           return SingletonInstance.INSTANCE;
       }
    
       public void method(){}
    }
  3. 枚舉

    推薦使用,利用枚舉的機制實現單例。不僅能避免多線程同步問題,還能防止反序列化重新創建新的對象。

    public enum Singleton {
       INSTANCE;
       public void method(){}
    }
    • 問題1:public void method(){} 是干嗎的?

      我在開始學習時也遇到這個問題,懂的自然懂,不懂的很困惑。網上搜資料也都寫的一模一樣。

      答案很簡單,一句話。使用單例模式,是為了創建唯一的實例。那么創建了這個實例之后,用它干嗎呢?對,自然是要調用它所在的類的方法。public void method(){}就是你要調用的方法。

      其他的教程中雙重檢查 靜態內部類 只寫了獲取實例,沒有寫public void method(){} ,所以才造成困惑。細心的童鞋可能注意到了,我這三個單例模式都寫了public void method(){}。趕快為了我的細心點個贊吧。

    最后溫馨提醒下,枚舉最簡單,也是推薦方法,趕快多練習幾遍,面試時秒殺面試官吧!

jdk中單例的應用

java.lang.Runtime

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    /**
     * Returns the runtime object associated with the current Java application.
     * Most of the methods of class <code>Runtime</code> are instance
     * methods and must be invoked with respect to the current runtime object.
     *
     * @return  the <code>Runtime</code> object associated with the current
     *          Java application.
     */
    public static Runtime getRuntime() {
        return currentRuntime;
    }

    /** Don't let anyone else instantiate this class */
    private Runtime() {}

}
其他應用

數據源、session工廠等

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓮安县| 绩溪县| 三原县| 金门县| 吉安县| 永兴县| 高州市| 崇仁县| 济阳县| 济南市| 罗源县| 类乌齐县| 察隅县| 侯马市| 平罗县| 上杭县| 育儿| 夏津县| 大宁县| 永城市| 青海省| 五原县| 峡江县| 大英县| 桃源县| 眉山市| 普安县| 札达县| 怀化市| 新干县| 辉南县| 葫芦岛市| 仙居县| 紫阳县| 田阳县| 恩平市| 长宁区| 大洼县| 玉门市| 电白县| 女性|