<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                #單例模式 --- ###定義 >保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 >Singleton:負責創建Singleton類自己的唯一實例,并提供一個getInstance的方法,讓外部來訪問這個類的唯一實例。 * 餓漢式: ``` private static Singleton uniqueInstance = new Singleton(); ``` * 懶漢式 ``` private static Singleton uniqueInstance = null; ``` ###功能 單例模式是用來保證這個類在運行期間只會被創建一個類實例,另外,單例模式還提供了一個全局唯一訪問這個類實例的訪問點,就是getInstance方法。 ###范圍 Java里面實現的單例是一個虛擬機的范圍。因為裝載類的功能是虛擬機的,所以一個虛擬機在通過自己的ClassLoader裝載餓漢式實現單例類的時候就會創建一個類的實例。 懶漢式單例有延遲加載和緩存的思想 ###優缺點 * 懶漢式是典型的時間換空間 * 餓漢式是典型的空間換時間 --- * 不加同步的懶漢式是線程不安全的。比如,有兩個線程,一個是線程A,一個是線程B,它們同時調用getInstance方法,就可能導致并發問題。 * 餓漢式是線程安全的,因為虛擬機保證只會裝載一次,在裝載類的時候是不會發生并發的。 --- 如何實現懶漢式的線程安全? 加上synchronized即可 ``` public static synchronized Singleton getInstance(){} ``` 但這樣會降低整個訪問的速度,而且每次都要判斷。可以用雙重檢查加鎖。 雙重加鎖機制,指的是:并不是每次進入getInstance方法都需要同步,而是先不同步,進入方法過后,先檢查實例是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。進入同步塊后,再次檢查實例是否存在,如果不存在,就在同步的情況下創建一個實例。這是第二重檢查。 雙重加鎖機制的實現會使用一個關鍵字volatile,它的意思是:被volatile修飾的變量的值,將不會被本地線程緩存,所有對該變量的讀寫都是直接操作共享內存,從而確保多個線程能正確的處理該變量。 ``` /** * 雙重檢查加鎖的單例模式 * @author dream * */ public class Singleton { /** * 對保存實例的變量添加volitile的修飾 */ private volatile static Singleton instance = null; private Singleton(){ } public static Singleton getInstance(){ //先檢查實例是否存在,如果不存在才進入下面的同步塊 if(instance == null){ //同步塊,線程安全的創建實例 synchronized (Singleton.class) { //再次檢查實例是否存在,如果不存在才真正的創建實例 instance = new Singleton(); } } return instance; } } ``` ###一種更好的單例實現方式 ``` public class Singleton { /** * 類級的內部類,也就是靜態類的成員式內部類,該內部類的實例與外部類的實例 * 沒有綁定關系,而且只有被調用時才會裝載,從而實現了延遲加載 * @author dream * */ private static class SingletonHolder{ /** * 靜態初始化器,由JVM來保證線程安全 */ private static Singleton instance = new Singleton(); } /** * 私有化構造方法 */ private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.instance; } } ``` 根據《高效Java第二版》中的說法,單元素的枚舉類型已經成為實現Singleton的最佳方法。 ``` package example6; /** * 使用枚舉來實現單例模式的示例 * @author dream * */ public class Singleton { /** * 定義一個枚舉的元素,它就代表了Singleton的一個實例 */ uniqueInstance; /** * 示意方法,單例可以有自己的操作 */ public void singletonOperation(){ //功能樹立 } } ``` --- ###本質 控制實例數量 ###何時選用單例模式 當需要控制一個類的實例只能有一個,而且客戶只能從一個全局訪問點訪問它時,可以選用單例模式,這些功能恰好是單例模式要解決的問題。
                  <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>

                              哎呀哎呀视频在线观看