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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                單例模式(Singleton):是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。好處主要有:1、某些類創建比較頻繁,對于一些大型的對象,這是一筆很大的系統開銷。2、省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力。 單例模式主要有兩種實現方式:1、懶漢式;2、餓漢式 ##一、uml建模 ![](https://box.kancloud.cn/2016-02-19_56c7196d64b8f.jpg) ##二、代碼實現: ###1、懶漢式 ~~~ /** * 示例:單例--單例對象能保證在一個JVM中,該對象只有一個實例存在。 * * 缺點:這種做法在多線程環境下,不安全 * * 懶漢式 */ class Singleton { /** * 持有私有靜態變量(也稱類變量),防止被引用 * * 此處賦值為null,目的是實現延遲加載 (因為有些類比較龐大,所以延遲加載有助于提升性能) */ private static Singleton instance = null; /**私有構造方法,防止被實例化 */ private Singleton() { } /**靜態工廠方法,創建實例 --只不過這里是創建自己,而且只能創建一個 */ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public void info() { System.out.println("this is a test method..."); } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); /** * 調用普通方法 */ s1.info(); Singleton s2 = Singleton.getInstance(); /** * 運行結果為true,說明s1、s2這兩個類變量都指向內存中的同一個對象 */ System.out.println(s1 == s2); } } ~~~ ### 2、餓漢式 ~~~ /** * 餓漢式 */ class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } public void info() { System.out.println("this is a test method..."); } } /** * 客戶端測試類 * * @author Leo */ public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); /** * 調用普通方法 */ s1.info(); Singleton s2 = Singleton.getInstance(); /** * 運行結果為true,說明s1、s2這兩個類變量都指向內存中的同一個對象 */ System.out.println(s1 == s2); } } ~~~ ### 3、如果考慮多線程,那么getInstance()方法要加同步synchronized,這時餓漢式比懶漢式要好,盡管資源利用率要差,但是不用同步。 ~~~ /** * * 考慮多線程的時候,下面這種做法可以參考一下:--懶漢式 * * 在創建類的時候進行同步,所以只要將創建和getInstance()分開,單獨為創建加synchronized關鍵字 * * 這種做法考慮性能的話,整個程序只需創建一次實例,所以性能也不會有什么影響。 * * @author Leo */ public class SingletonTest { private static SingletonTest instance = null; private SingletonTest() { } private static synchronized void syncInit() { if (instance == null) { instance = new SingletonTest(); } } public static SingletonTest getInstance() { if (instance == null) { syncInit(); } return instance; } } ~~~ ##三、總結 單例模式保證了一個類只有一個實例,且提供一個訪問全局點的方式,更加靈活的保證了實例的創建和訪問約束。系統中只有一個實例,因此構造方法應該為私有餓漢式:類加載時直接創建靜態實例;懶漢式:第一次需要時才創建一個實例,那么getInstance方法要加同步 餓漢式比懶漢式要好,盡管資源利用率要差,但是不用同步。
                  <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>

                              哎呀哎呀视频在线观看