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

溫馨提示×

溫馨提示×

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

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

Java中單例模式怎么用

發布時間:2022-02-28 09:15:57 來源:億速云 閱讀:135 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Java中單例模式怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

    注意

    1、單例類只能有一個實例。

    2、單例類必須自己創建自己的唯一實例。

    3、單例類必須給所有其他對象提供這一實例。

    優點

    1.在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。

    2.避免對資源的多重占用(比如寫文件操作)。

    缺點

    1.沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。

    使用場景

    1.要求生產唯一序列號。

    2.WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。

    3.創建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。

    一、實現方式

    package com.asurplus.common.singleton.style1;
    import lombok.extern.slf4j.Slf4j;
    import java.util.Objects;
    @Slf4j
    public class ResUtils {
        private volatile static ResUtils instance = null;
        /**
         * 私有的構造方法
         */
        private ResUtils() {
        }
        /**
         * 提供獲取實例的方法
         *
         * @return
         */
        public static ResUtils getInstance() {
            // 為空才創建
            if (Objects.isNull(instance)) {
                // 避免并發操作時
                synchronized (ResUtils.class) {
                    // 為空才創建
                    if (Objects.isNull(instance)) {
                        // 創建新對象
                        instance = new ResUtils();
                        log.info("創建了對象");
                    }
                }
            }
            return instance;
        }
    }

    我們將其構造方法私有化,從而外部無法創建實例,并且我們提供了獲取唯一實例的方法,這樣我們就能從外部得到該實例。

    二、實現方式

    package com.asurplus.common.singleton.style2;
    import lombok.extern.slf4j.Slf4j;
    @Slf4j
    public class ResUtils2 {
        /**
         * 靜態內部類
         */
        private static class ResUtils2Holder {
            private static ResUtils2 instance = new ResUtils2();
        }
        /**
         * 提供獲取實例的方法
         *
         * @return
         */
        public static ResUtils2 getInstance() {
            return ResUtils2Holder.instance;
        }
    }

    我們使用靜態內部類的方法創建實例,因為 JVM 只會加載一次的原理,所以最終只會創建一個實例,并且提供了獲取實例的方法,這樣我們就能從外部得到該實例。

    三、測試

    package com.asurplus.common.singleton;
    import com.asurplus.common.singleton.style1.ResUtils;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    /**
     * 單例模式
     */
    public class TestMain {
        public static void main(String[] args) {
            // 創建線程池
            ExecutorService executorService = Executors.newFixedThreadPool(10);
            for (int i = 0; i < 100; i++) {
                executorService.execute(ResUtils::getInstance);
            }
            executorService.shutdown();
        }
    }

    輸出結果

    Java中單例模式怎么用

    可以看出,我們獲取了 100 次實例,只創建了一個實例,從而實現了我們的單例模式。

    感謝各位的閱讀!關于“Java中單例模式怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

    向AI問一下細節

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

    AI

    三穗县| 贵溪市| 罗源县| 贵港市| 湘潭县| 文安县| 旬邑县| 平湖市| 甘谷县| 多伦县| 宁津县| 宜章县| 台前县| 东安县| 卢氏县| 肇源县| 怀远县| 栾城县| 娄烦县| 英吉沙县| 城步| 都兰县| 陆河县| 福清市| 西盟| 广昌县| 本溪市| 阿勒泰市| 夏邑县| 石泉县| 繁昌县| 扶绥县| 固安县| 绥棱县| 奉节县| 宁陕县| 高安市| 洛阳市| 英德市| 醴陵市| 措美县|