中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java單例創建方式有哪些

發布時間:2022-02-14 10:52:12 來源:億速云 閱讀:163 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Java單例創建方式有哪些”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java單例創建方式有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    定義

    單例設計模式,就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法(靜態方法)

    使用場景

    • 對于一些需要頻繁創建銷毀的對象

    • 重量級的對象

    • 經常使用到的對象

    • 工具類對象

    • 數據源

    • session

    單例模式八種方式

    餓漢式(靜態常量)

    代碼

    /**
     * 餓漢式(靜態常量)
     * 優勢:簡單,避免多線程的同步問題
     * 劣勢:無懶加載,內存浪費
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton1 {
        // 私有化構造方法
        private Singleton1(){}
    
        // 靜態常量
        private static final Singleton1 singleton1 = new Singleton1();
    
        // 對外提供公共方法
        public static Singleton1 getSingleton1(){
            return singleton1;
        }
    }

    分析

    • 優勢:簡單,避免多線程的同步問題

    • 劣勢:無懶加載,內存浪費

    餓漢式(靜態代碼塊)

    代碼

    /**
     * 餓漢式(靜態代碼塊)
     * 優勢:簡單,避免多線程的同步問題
     * 劣勢:無懶加載,內存浪費
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton2 {
        // 私有化構造方法
        private Singleton2(){}
    
        private static final Singleton2 singleton2;
    
        // 靜態代碼塊
        static {
            singleton2 = new Singleton2();
        }
    
        // 對外提供公共方法
        public static Singleton2 getSingleton2(){
            return singleton2;
        }
    }

    分析

    • 優勢:簡單,避免多線程的同步問題

    • 劣勢:無懶加載,內存浪費

    懶漢式(線程不安全)

    代碼

    /**
     * 懶漢式(線程不安全)
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton3 {
        // 私有化構造方法
        private Singleton3(){}
    
        // 內部屬性
        private static Singleton3 singleton3;
    
        // 對外提供公共方法
        public static Singleton3 getSingletons(){
            if(singleton3 == null){
                singleton3 = new Singleton3();
            }
            return singleton3;
        }
    }

    分析

    • 優勢:起到了懶加載的效果 不會造成內存浪費

    • 劣勢:線程不安全 不推薦這種方式的

    懶漢式(同步方法)

    代碼

    /**
     * 懶漢式(同步方法)
     * 優勢:解決了線程同步問題
     * 劣勢:使用synchronized同步關鍵字,性能太低
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton4 {
        // 私有化構造方法
        private Singleton4(){}
    
        // 內部屬性
        private static Singleton4 singleton4;
    
        // 對外提供公共方法
        public static synchronized Singleton4 getSingleton4(){
            if(singleton4 == null){
                singleton4 = new Singleton4();
            }
            return singleton4;
        }
    }

    分析

    • 優勢:解決了線程安全問題,

    • 劣勢:效率太低

    懶漢式(同步代碼塊)

    代碼

    /**
     * 懶漢式(同步代碼塊)
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton5 {
        // 私有化構造方法
        private Singleton5(){}
    
        // 內部屬性
        private static Singleton5 singleton5;
    
        // 對外提供公共方法
        public static Singleton5 getSingleton5(){
            if (singleton5 == null){
                synchronized (Singleton5.class){
                    singleton5 = new Singleton5();
                }
            }
            return singleton5;
        }
    }

    分析

    • 優勢:起到了懶加載的效果 不會造成內存浪費

    • 劣勢:線程不安全 不推薦這種方式的

    雙重檢查鎖方式

    代碼

    /**
     * 雙重檢查鎖機制
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton6 {
        // 私有化構造方法
        private Singleton6(){}
    
        // 內部屬性
        private volatile static Singleton6 singleton6;
    
        // 對外提供公共方法
        public static Singleton6 getSingleton6(){
            if (singleton6 == null){
                synchronized (Singleton6.class){
                    if(singleton6 == null){
                        singleton6 = new Singleton6();
                    }
                }
            }
            return singleton6;
        }
    }

    分析

    • 實現了懶加載,效率很高,解決了線程安全

    靜態內部類方式

    代碼

    /**
     * 靜態內部類
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    public class Singleton7 {
        // 私有化構造方法
        private Singleton7(){}
    
        // 內部類
        private static class SingleInstance{
            public static final Singleton7 singleton7 = new Singleton7();
        }
    
        // 對外提供公共方法
        public static Singleton7 getSingleton7(){
            return SingleInstance.singleton7;
        }
    }

    分析

    • 不會出現線程安全問題 JVM來幫我們保證了線程的安全性

    • 利用靜態內部類的特點,效率也很高,

    • 實際開發中推薦使用的

    枚舉方式

    代碼

    定義單例對象

    /**
     * @desc:
     * @author:liyajie
     * @createTime:2022/2/11 10:25
     * @version:1.0
     */
    public class Singleton {
    
        public void hello(){
            System.out.println("hello");
        }
    }

    定義枚舉實例化單例對象

    /**
     * 枚舉方式
     * @author:liyajie
     * @createTime:2022/2/10 15:50
     * @version:1.0
     */
    enum Singleton8 {
        // 相當于public static final Singleton8 INSTANCE;
        // 保證了枚舉實例只能被實例化一次
        INSTANCE;
    
        // 定義單例變量
        private Singleton singleton;
    
        // 枚舉構造方法,該構造方法是private,執行構造方法的時候,同時創建我們的單例對象
        Singleton8() {
            singleton = new Singleton();
        }
    
        // 對外提供公共方法
        public Singleton getSingleton() {
            return singleton;
        }
    }

    使用方法Singleton8.INSTANCE.getSingleton()即可獲取我們的單例對象了

    分析

    • 簡單,避免了線程安全問題

    • 實際開發中推薦使用的

    讀到這里,這篇“Java單例創建方式有哪些”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    桂阳县| 商河县| 中阳县| 四川省| 东兰县| 西平县| 南郑县| 辉县市| 剑河县| 博客| 镇原县| 永康市| 松溪县| 阜新| 金昌市| 民丰县| 台安县| 前郭尔| 普兰店市| 岳阳县| 武穴市| 图木舒克市| 搜索| 广饶县| 南京市| 绍兴县| 牙克石市| 阿合奇县| 南投县| 长沙县| 通州市| 康乐县| 潮州市| 牡丹江市| 临城县| 墨竹工卡县| 丹凤县| 分宜县| 绥江县| 阳高县| 阳新县|