站長資訊網
        最全最豐富的資訊網站

        完全掌握Java單例模式

        本篇文章給大家帶來了關于java的相關知識,其中主要介紹了關于單例模式的相關問題,指一個類只有一個實例,且該類能自行創建這個實例的一種模式,下面我們一起來看一下,希望對大家有幫助。

        完全掌握Java單例模式

        推薦學習:《java視頻教程》

        單例模式:

        首先在Java中有23種設計模式:

        • 創建型模式: 工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
        • 結構型模式: 適配器模式、裝飾者模式、代理模式、外觀模式、橋接模式、組合模式、享元模式
        • 行為型模式::策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

        1、什么是單例模式:

        定義:
        指一個類只有一個實例,且該類能自行創建這個實例的一種模式。可以避免因打開多個任務管理器窗口而造成內存資源的浪費,或出現各個窗口顯示內容的不一致等錯誤。比如咱們電腦是不是只能打開一個任務管理器?對吧,這就是為了防止資源浪費和其他錯誤。

        項目中一般可以通過單例模式來獲取同一個對象來調用工具方法,這樣的好處是節約內存資源,我沒有必要創建多個不同的對象,因為這樣消耗內存資源

        簡而言之: 單例就是程序只有一個實例,該類負責創建自己的對象,同時要確保只有一個對象創建

        單例模式的特點:

        1. 構造器私有
        2. 持有自己類型的屬性
        3. 對外提供獲取實例的靜態方法

        單例模式的結構圖:
        完全掌握Java單例模式

        2、單例模式的優缺點:

        優點:

        1. 減少了內存的開銷
        2. 避免對資源的多重占用
        3. 設置全局訪問點,可以優化和共享資源的訪問

        缺點(參考自互聯網):

        1. 一般沒有接口,擴展困難。如果要擴展,則除了修改原來的代碼,沒有第二種途徑,違背開閉原則
        2. 在并發測試中,單例模式不利于代碼調試。在調試過程中,如果單例中的代碼沒有執行完,也不能模擬生成一個新的對象
        3. 單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則

        看一張單例模式的思維導圖:

        3、懶漢模式(比較常用)

        懶漢模式特征是延遲初始化,在調用方法獲取實例的時候才會實例化對象
        線程不安全,嚴格意義上來說不是單例模式,優勢是在獲取實例才會創建對象因此更節省內存開銷

        Demo:

        public class SingLeton {      //1、有自己類型的屬性     private static SingLeton instance;      //2、構造器私有化     private SingLeton(){}      //3、對外提供獲取實例的靜態方法     public static SingLeton getInstance(){         if (instance == null){             instance = new SingLeton();         }         return instance;     }}

        測試類:

        public class Test {     public static void main(String[] args) {          //判斷是否產生的是同一個對象         SingLeton s1 = SingLeton.getInstance();         SingLeton s2 = SingLeton.getInstance();         System.out.println(s1 == s2);     }}

        輸出:

        true

        注意:

        關于懶漢模式線程非安全

        現在知道懶漢模式的線程是非安全的,那么就需要使用鎖(synchronized )來同步:

        /**  *   保證 instance 在所有線程中同步  */public class SingLeton2 {          //1、有自己類型的屬性         private static volatile SingLeton2 instance ;                      //2、構造器私有化         private SingLeton2() {         }          public static synchronized SingLeton2 getInstance() {             //getInstance 方法前加同步             if (instance == null) {                 instance = new SingLeton2();             }             return instance;         }     }

        如果是寫多線程,則不要刪除上例代碼中的關鍵字 volatile 和 synchronized,否則將存在線程非安全的問題。如果不刪除這兩個關鍵字就能保證線程安全,但是每次訪問時都要同步,會影響性能,且消耗

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品1024视频| 四虎精品亚洲一区二区三区| 久久青青草原精品国产软件| 97精品人妻一区二区三区香蕉| 亚洲?V无码乱码国产精品| 91精品全国免费观看青青| 少妇亚洲免费精品| 四虎国产精品永久地址99| 久久99国产综合精品免费| 久久久久人妻精品一区三寸蜜桃| 欧美精品第欧美第12页| 色欲久久久天天天综合网精品| 久久久久国产精品三级网| 久久国产成人精品麻豆| 亚洲AV永久无码精品网站在线观看| 精品第一国产综合精品蜜芽| 国产精品视频网| 国产亚洲欧美精品永久| 亚洲精品高清国产一线久久| 精品久久久久久无码人妻热| 99久久精品九九亚洲精品| 久久亚洲国产午夜精品理论片| 97精品伊人久久大香线蕉app| 欧美性videos高清精品| 中文字幕精品亚洲无线码二区| 久久伊人精品青青草原日本| 国精品无码A区一区二区| 国产精品亚洲高清一区二区 | 久久99精品久久久久久野外| 91精品啪在线观看国产电影| 国产精品久久永久免费| 99久久免费国产精品热| 国产精品露脸国语对白| 国产麻豆精品一区二区三区v视界| 日韩人妻精品一区二区三区视频| 亚洲国产精品成人精品无码区 | 亚洲A∨精品一区二区三区| 久久夜色精品国产| 亚洲AV无码乱码精品国产| 亚洲一区爱区精品无码| 亚洲无码精品浪潮|