<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Optimus_7

      博客園 首頁 新隨筆 聯系 訂閱 管理

      1. 單例模式的核心:兩私一公

        1. 本單例類的private的static屬性

          private static Object instance,用于接收本單例類的單例實例。

        2. 本單例類的private的構造方法

          防止別的類通過new 的方式創建。

          (但是可以被反射破解)

        3. 本單例類的public的static方法getInstance

          因為別的類不能拿到對象,所以只能通過類名點方法觸發創建對象。即Public靜態方法。

      2. 餓漢模式

        (類加載時構造實例,耗時)(線程安全)

        為什么叫餓漢:因為是Hungry 類初始化時創建單例,而不是需要時再創建單例。

      public class Hungry {
          private static Hungry instance = new Hungry();
          private Hungry() {
          }
          public static Hungry getInstance() {
              return instance;
          }
      }

      3. 普通懶漢模式

        (N個線程同時調用getInstance,會忽略if (instance == null) ,會生成N個Lazy類的實例,即N個單例實例,線程不安全)(單線程場景沒毛病)

        為什么叫懶漢:因為是需要時再創建單例,而不是類加載時創建單例。

      public class Lazy {
          private static Lazy instance;
          private Lazy (){
          }
          public static Lazy getInstance() {
              if (instance == null) {
                  instance = new Lazy();
              }
              return instance;
          }
      }

       

      4. 普通懶漢模式——>Synchronized 懶漢模式

        (雖然線程安全,但是在高并發的情況下,所有線程都必須執行synchronized方法,串行性能下降)

      public class SyncLazy {
          private static SyncLazy instance;
      
          private SyncLazy() {
          }
      
          public static synchronized SyncLazy getInstance() {
              if (instance == null) {
                  instance = new SyncLazy();
              }
              return instance;
          }
      }

       

      5. 普通懶漢模式——>Synchronized 懶漢模式——> Volatile + DCL( Double Check Lock)

        此模式在Synchronized 懶漢模式的基礎上:

          1. synchronized方法改為方法內部的synchronized塊 + synchronized塊外部加了一個判空的邏輯

          2. singleton屬性被volatile修飾

       

        改動1的原因: 

          避免了所有線程都執行synchronized方法,提高效率。而是改為只有第一次創建單例時且有并發競爭時的兩個線程才會執行synchronized方法

       

        改動2的原因: 

          而Volatile的作用有兩個:

          1. 可見性:線程A實例化屬性之后,Volatile刷入主存

          2. 防止指令重排:

            singleton = new Singleton();的正常順序是:

            1. 聲明屬性時,為對象分配堆空間,初始時為null(3行)

            2. 堆中初始化對象(11行的后半句),為Store指令。

            3. 棧中的指針指向堆的地址空間(11行的后=前半句),為Load指令。

           但是沒有Volatile修飾singleton 屬性時,

            2和3會發生指令重排,如果3排到了線程A退出monitorexit+B線程monitorenter+B線程判空的之后,則B線程判空結果為true,則B線程又會創建一個單例實例,所以此時堆中就會有兩個實例。

            所以,為了防止指令Store-Load重排,使用Volatile修飾singleton 屬性

       

      public class Singleton {
      
         private volatile static Singleton singleton;
      
         private Singleton(){}
      
         public static Singleton getInstance(){
             if(singleton == null){
                 synchronized (Singleton.class){
                     if(singleton == null){
                         singleton = new Singleton();
                     }
                 }
             }
             return singleton;
         }
      }

       

      6. 普通懶漢模式——>靜態內部類模式

        靜態內部類的靜態屬性的初始化(即創建目標單例實例)時機:訪問靜態內部類的靜態屬性時(即調用Singleton類 點 getInstance()方法時)

        靜態內部類天然防止多線程問題。

       

        為什么是懶漢模式而不是餓漢模式:

          因為餓漢模式實在類加載時就已經創建完單例了,而懶漢模式則是需要時(即訪問靜態內部類的靜態屬性時)再創建。

          

      public class Singleton { 
          private Singleton(){
          }
          public static Singleton getInstance(){  
              return SingletonHolder.Instance;  
          }  
          private static class SingletonHolder {  
              private static final Singleton Instance = new Singleton();  
          }  
      } 

       

      7. FAQ 

        7.4 如何防止反射攻擊DCL:

          以上的單例模式實現雖然很好,但是如果使用反射為私有構造函數setAccessible,然后通過私有構造函數.newInstance()的話,就會把單例模式破解。因為是觸發了第二次new對象。

          我們可以稍作修改防止這種反射攻擊:

          把構造函數改成:

         private Singleton(){
              if (instance!= null) {
                  throw new RunTimeException(“單例模式不允許創建多個實例”)       
              }
          }
          // instance代表的是單例類里面的存放單例的那個屬性。

       

       

           

       

       

      posted on 2020-08-10 20:55  Optimus_7  閱讀(289)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品久荜中文字幕| 国产亚洲一二三区精品| 阿拉善盟| 偷拍精品一区二区三区| 最近中文字幕完整版hd| 久久99精品久久久久久9| 女厕偷窥一区二区三区| 久久国产成人午夜av影院| 欧美喷潮最猛视频| 重口SM一区二区三区视频| 野花社区在线观看视频| 亚洲精品国产综合麻豆久久99 | 97人人添人人澡人人澡人人澡 | 美女黄网站人色视频免费国产 | 熟妇女人妻丰满少妇中文字幕| 国产激情一区二区三区四区| 亚洲欧美成人a∨观看| 国自产在线精品一本无码中文| 内射老妇bbwx0c0ck| 国产精品成人一区二区三| 欧洲中文字幕一区二区| 免费十八禁一区二区三区| 中文字幕av日韩有码| 国偷自产一区二区三区在线视频| 安溪县| 亚洲高清免费在线观看| 久久国产免费观看精品3| 92国产精品午夜福利免费| 乱色精品无码一区二区国产盗 | 少妇粗大进出白浆嘿嘿视频| 成人区人妻精品一区二蜜臀| 免费观看添你到高潮视频| 极品少妇无套内射视频| 免费无码AV一区二区波多野结衣| 精品国产乱弄九九99久久| 丁香花在线影院观看在线播放| 一级做a爰片在线播放| 又黄又爽又色的免费网站| 亚洲中文字幕五月五月婷| 日韩中文字幕人妻一区| 免费无码无遮挡裸体视频在线观看|