更多課程 選擇中心
        Java培訓

        400-111-8989

        Java培訓 > Java教程  > 正文

        Java設計單例模式你用對了嗎?

        • 發布:佚名
        • 來源:互聯網
        • 時間:2016-06-28 17:12

        單例模式是設計模式中最簡單的,只有一個單例類,沒有其他的層次結構與抽象。該模式需要確保該類只能生成一個對象,通常是該類需要消耗太多的資源或者沒有沒有多個實例的理由。程序員在java模式設計的時候應該如何更好地使用單例模式呢?本文達內java培訓(www.sabdns.com)專家為大家詳解Java單例模式的用法,看看對你有沒有用:

        為何需要單例模式

        對于系統中的某些類來說,只有一個實例很重要,例如,一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。

        單例模式設計要點

        保證該類只有一個實例。將該類的構造方法定義為私有方法,這樣其他處的代碼就無法通過調用該類的構造方法來實例化該類的對象,提供一個該實例的訪問點。一般由該類自己負責創建實例,并提供一個靜態方法作為該實例的訪問點。

        餓漢 vs. 懶漢

        餓漢 聲明實例引用時即實例化

        懶漢 靜態方法第一次被調用前不實例化,也即懶加載。對于創建實例代價大,且不定會使用時,使用懶加載模式可以減少開銷。

        實現單例模式的九種方法

        線程不安全的懶漢 - 多線程不可用

        1. package com.jasongj.singleton1;
        2. public class Singleton {
        3.   private static Singleton INSTANCE;
        4.   private Singleton() {};
        5.   public static Singleton getInstance() {
        6.     if (INSTANCE == null) {
        7.       INSTANCE = new Singleton();
        8.     }
        9.     return INSTANCE;
        10.   }
        11. }

        優點:達到了Lazy Loading的效果

        缺點:只有在單線程下能保證只有一個實例,多線程下有創建多個實例的風險

        同步方法下的懶漢 - 可用,不推薦

        1. package com.jasongj.singleton2;
        2. public class Singleton {
        3.   private static Singleton INSTANCE;
        4.   private Singleton() {};
        5.   public static synchronized Singleton getInstance() {
        6.     if (INSTANCE == null) {
        7.       INSTANCE = new Singleton();
        8.     }
        9.     return INSTANCE;
        10.   }
        11. }

        優點:線程安全,可確保正常使用下(不考慮通過反射調用私有構造方法)只有一個實例

        缺點:每次獲取實例都需要申請鎖,開銷大,效率低

        同步代碼塊下的懶漢 - 不可用

        1. package com.jasongj.singleton3;
        2. public class Singleton {
        3.   private static Singleton INSTANCE;
        4.   private Singleton() {};
        5.   public static Singleton getInstance() {
        6.     if (INSTANCE == null) {
        7.       synchronized (Singleton.class) {
        8.         INSTANCE = new Singleton();
        9.       }
        10.     }
        11.     return INSTANCE;
        12.   }
        13. }

        優點:不需要在每次調用時加鎖,效率比上一個高

        缺點:雖然使用了synchronized,但本質上是線程不安全的。

        不正確雙重檢查(Double Check)下的懶漢 - 不推薦

        1. package com.jasongj.singleton4;
        2. public class Singleton {
        3.   private static Singleton INSTANCE;
        4.   private Singleton() {};
        5.   public static Singleton getInstance() {
        6.     if (INSTANCE == null) {
        7.       synchronized(Singleton.class){
        8.         if(INSTANCE == null) {
        9.           INSTANCE = new Singleton();
        10.         }
        11.       }
        12.     }
        13.     return INSTANCE;
        14.   }
        15. }

        優點:使用了雙重檢查,很大程度上避免了線程不安全,同時也避免了不必要的鎖開銷

        缺點:依然存在創建多個實例的可能。因為每個線程都有自己的一份拷貝,并不能保證實例化后將INSTANCE的引用拷回主內存,不能保證對其它線程立即可見,所以仍然有可能造成多個實例被創建

        正確雙重檢查(Double Check)下的懶漢 - 推薦

        1. package com.jasongj.singleton5;
        2. public class Singleton {
        3.   private static volatile Singleton INSTANCE;
        4.   private Singleton() {};
        5.   public static Singleton getInstance() {
        6.     if (INSTANCE == null) {
        7.       synchronized (Singleton.class) {
        8.         if (INSTANCE == null) {
        9.           INSTANCE = new Singleton();
        10.         }
        11.       }
        12.     }
        13.     return INSTANCE;
        14.   }
        15. }

        優點:使用了雙重檢查,同時使用volatile修飾INSTANCE,避免由于多線性同步和可見性問題造成的多實例

        缺點:NA

        靜態常量 餓漢 - 推薦

        1. package com.jasongj.singleton6;
        2. public class Singleton {
        3.   private static final Singleton INSTANCE = new Singleton();
        4.   private Singleton() {};
        5.   public static Singleton getInstance() {
        6.     return INSTANCE;
        7.   }
        8. }

        優點:實現簡單,無線程同步問題

        缺點:在類裝載時完成實例化。若該實例一直未被使用,則會造成資源浪費

        靜態代碼塊 餓漢 可用

        1. package com.jasongj.singleton7;
        2. public class Singleton {
        3.   private static Singleton INSTANCE;
        4.   static{
        5.     INSTANCE = new Singleton();
        6.   }
        7.   private Singleton() {};
        8.   public static Singleton getInstance() {
        9.     return INSTANCE;
        10.   }
        11. }

        優點:無線程同步問題

        缺點:類裝載時創建實例,無Lazy Loading。實例一直未被使用時,會浪費資源

        靜態內部類 推薦

        1. package com.jasongj.singleton8;
        2. public class Singleton {
        3.   private Singleton() {};
        4.   public static Singleton getInstance() {
        5.     return InnerClass.INSTANCE;
        6.   }
        7.   private static class InnerClass {
        8.     private static final Singleton INSTANCE = new Singleton();
        9.   }
        10. }

        優點:無線程同步問題,實現了懶加載(Lazy Loading)。因為只有調用getInstance時才會裝載內部類,才會創建實例

        缺點:NA

        枚舉 不推薦

        1. package com.jasongj.singleton9;
        2. public enum Singleton {
        3.   INSTANCE;
        4.   
        5.   public void whatSoEverMethod() { }
        6. }

        優點:無線程同步問題,且能防止通過反射創建新的對象

        缺點:使用的是枚舉,而非類。同時單一實例的訪問點也不是一般單例模式的靜態方法

        以上就是達內java培訓(www.sabdns.com)專家為大家介紹的java單例模式的使用方法和推薦實現單例模式的九種方法,相信能對你的學習有啟發。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:貪吃蛇游戲的Java實現過程(教程)
        下一篇:JavaScript 世界萬物誕生記
        2021版Java學習路線圖(超詳細)

        2021版Java學習路線圖(超詳細)

        Java面向對象系列全套視頻教程(更新中...)

        Java面向對象系列全套視頻教程(更新中...)

        從事Java后端開發,要學習哪些知識和技能?

        從事Java后端開發,要學習哪些知識和技能?

        Java后端開發需要掌握哪些技能?

        Java后端開發需要掌握哪些技能?

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        貴州省

        福建省

        • 達內廈門軟件園中心
        廣西省

        海南省

        国产高清情侣视频2019年,限制电影福利在线观看,23伊人大香蕉 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>