<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 單例設計模式之懶漢實現+雙重檢查鎖定+內存模型 ### 一個簡簡單單的單例設計模式之懶漢,就會涉及到雙重檢查鎖定DCL以及指令重排帶來的安全隱患并且設計到了內存模式。 ### 重點需要了解DCL、指令重排以及volatile關鍵字和new一個對象的整個過程 ### 直接看下面的代碼,里面的注釋寫的非常詳細 ### ~~~ package com.goldnecis.設計模式.單例模式.design; //1、單例模式(懶漢模式) //利用DCL(Double-Checked Locking)雙重檢查鎖定是一種用于多線程環境下延遲初始化的優化技術,再結合懶加載(Lazy Initialization)和單例模式(Singleton Pattern)實現了最終可滿足多線程環境下的單例模式 public class SingletonLazy { //4.7、為什么要使用static?因為getInstance是static,至于getInstance為什么是static下面有講解,在static方法當中只能使用靜態成員變量和靜態方法,除非你實例化一個對象!所以instance也是static //在4.6當中提到的new的時候在多線程環境下有可能會發生指令重排,所以我們使用volatile關鍵字來修飾 所以得重點了解volatile關鍵字的作用 //在Java中,使用volatile關鍵字來修飾變量可以實現多線程之間的數據共享。當一個變量被聲明為volatile時,它將具有以下特點: //可見性:對一個volatile變量的寫操作會立即被其他線程可見,即保證了修改的值對其他線程是可見的。 //有序性:對于volatile變量的讀寫操作,編譯器和處理器都會進行相應的指令重排,保證了指令的執行順序。 //這里我們正是利用了volatile關鍵字可以防止指令重排的特性避免被實例化出多個對象 private static volatile SingletonLazy instance; //2、構造方法私有化 防止在外部進行實例化 只能在單例類的內部實例化返回 private SingletonLazy(){} //3、單例對象的方法 可理解為處理各種業務邏輯 供外界調用 public void process(){ System.out.println("我是單例設計模式"); } //4、供外界調用生成單例對象的方法 只能是靜態方法 通過類名稱來調用 因為構造方法當中禁止外界實例化單例類 //4.4、有可能你會問為什么不對getInstance方法加synchronized呢?因為這樣鎖的粒度太大,并發場景下肯定影響性能,不如減小鎖的粒度控制到方法體內部的具體邏輯當中去 public static SingletonLazy getInstance(){ //4.1、第一重檢查 避免不必要的同步 if(instance == null){ //4.3、因為在多線程環境下A B 鎖定同時進來有可能會實例化多個對象,所以我們通過synchronized來實現線程同步以防止被實例化出來多個對象 synchronized (SingletonLazy.class){ //4.5、第二重檢查 再次判斷instance是否為空 確保只有一個線程實例化對象 if(instance == null){ //4.6、instance = new SingletonLazy(); 并不是原?性操作 // * ①、分配空間給對象 // * ②、在空間內創建對象 // * ③、將對象賦值給引?instance // 假如線程 1-3-2順序(不要以為就是按照123的順序進行new實例化,jvm虛擬機在編譯的時候會進行指令重拍有可能是132),會把值寫會主內存,其他線程就會讀取到instance最新的值,但是這個是不完全的對象就會導致錯誤 // 我們該如何避免指令重拍呢?java當中new一個對象也有幾率發生指令重排!!! // java已經為我們提供了完整的解決方案就是volatile關鍵字 去看4.7 instance = new SingletonLazy(); } } } //4.2、如果已經存在則直接返回該單例實例對象 return instance; } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看