最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中常用的設(shè)計模式之單例模式詳解

 更新時間:2022年02月28日 09:42:12   作者:Asurplus、  
這篇文章主要為大家詳細(xì)介紹了Java中常用的設(shè)計模式之單例模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

注意

1、單例類只能有一個實(shí)例。

2、單例類必須自己創(chuàng)建自己的唯一實(shí)例。

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

優(yōu)點(diǎn)

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

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

缺點(diǎn)

1.沒有接口,不能繼承,與單一職責(zé)原則沖突,一個類應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來實(shí)例化。

使用場景

1.要求生產(chǎn)唯一序列號。

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

3.創(chuàng)建的一個對象需要消耗的資源過多,比如 I/O 與數(shù)據(jù)庫的連接等。

一、實(shí)現(xiàn)方式

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;
    /**
     * 私有的構(gòu)造方法
     */
    private ResUtils() {
    }
    /**
     * 提供獲取實(shí)例的方法
     *
     * @return
     */
    public static ResUtils getInstance() {
        // 為空才創(chuàng)建
        if (Objects.isNull(instance)) {
            // 避免并發(fā)操作時
            synchronized (ResUtils.class) {
                // 為空才創(chuàng)建
                if (Objects.isNull(instance)) {
                    // 創(chuàng)建新對象
                    instance = new ResUtils();
                    log.info("創(chuàng)建了對象");
                }
            }
        }
        return instance;
    }
}

我們將其構(gòu)造方法私有化,從而外部無法創(chuàng)建實(shí)例,并且我們提供了獲取唯一實(shí)例的方法,這樣我們就能從外部得到該實(shí)例。

二、實(shí)現(xiàn)方式

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

我們使用靜態(tài)內(nèi)部類的方法創(chuàng)建實(shí)例,因?yàn)?JVM 只會加載一次的原理,所以最終只會創(chuàng)建一個實(shí)例,并且提供了獲取實(shí)例的方法,這樣我們就能從外部得到該實(shí)例。

三、測試

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) {
        // 創(chuàng)建線程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 100; i++) {
            executorService.execute(ResUtils::getInstance);
        }
        executorService.shutdown();
    }
}

輸出結(jié)果

輸出結(jié)果

可以看出,我們獲取了 100 次實(shí)例,只創(chuàng)建了一個實(shí)例,從而實(shí)現(xiàn)了我們的單例模式。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • SpringBoot?整合?Grizzly的過程

    SpringBoot?整合?Grizzly的過程

    Grizzly?是一個高性能的、異步的、非阻塞的?HTTP?服務(wù)器框架,它可以與?Spring?Boot?一起提供比傳統(tǒng)的?Tomcat?或?Jetty?更高的吞吐量和更低的延遲,這篇文章主要介紹了SpringBoot?整合?Grizzly的過程,需要的朋友可以參考下
    2025-01-01
  • Springboot?jpa使用sum()函數(shù)返回結(jié)果如何被接收

    Springboot?jpa使用sum()函數(shù)返回結(jié)果如何被接收

    這篇文章主要介紹了Springboot?jpa使用sum()函數(shù)返回結(jié)果如何接收,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中Set集合的使用和底層原理解析

    Java中Set集合的使用和底層原理解析

    這篇文章主要介紹了Java中Set集合的使用和底層原理,Set集合的功能上基本上與Collection的API一致, Set集合沒有擴(kuò)展額外的API,本文通過示例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-12-12
  • 深入理解java的spring-ioc的使用

    深入理解java的spring-ioc的使用

    這篇文章主要介紹了java的spring-ioc的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • springboot 整合druid數(shù)據(jù)庫密碼加密功能的實(shí)現(xiàn)代碼

    springboot 整合druid數(shù)據(jù)庫密碼加密功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了springboot 整合druid數(shù)據(jù)庫密碼加密功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java實(shí)現(xiàn)即時通信的完整步驟分享

    java實(shí)現(xiàn)即時通信的完整步驟分享

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)即時通信的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java使用正則抓取網(wǎng)頁郵箱

    java使用正則抓取網(wǎng)頁郵箱

    這篇文章主要為大家詳細(xì)介紹了java使用正則抓取網(wǎng)頁郵箱的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 5種Java經(jīng)典創(chuàng)建型模式詳解

    5種Java經(jīng)典創(chuàng)建型模式詳解

    這篇文章主要為大家詳細(xì)介紹了5種Java經(jīng)典創(chuàng)建型模式,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JAVA Spring Boot 自動配置實(shí)現(xiàn)原理詳解

    JAVA Spring Boot 自動配置實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了詳解SpringBoot自動配置原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • java?-jar命令及SpringBoot通過java?-jav啟動項(xiàng)目的過程

    java?-jar命令及SpringBoot通過java?-jav啟動項(xiàng)目的過程

    本篇文章將為大家講述關(guān)于 SpringBoot 項(xiàng)目工程完成后,是如何通過 java-jar 命令來啟動的,以及介紹 java-jar 命令的詳細(xì)內(nèi)容,對SpringBoot java?-jav啟動過程感興趣的朋友跟隨小編一起看看吧
    2023-05-05

最新評論

平利县| 东至县| 双城市| 望江县| 长沙县| 潢川县| 繁峙县| 乡宁县| 定兴县| 乡城县| 东源县| 和林格尔县| 建水县| 开阳县| 孝昌县| 曲周县| 株洲县| 托里县| 桂东县| 平定县| 郧西县| 红桥区| 新乡市| 彩票| 河南省| 喀喇沁旗| 昭平县| 扎鲁特旗| 津市市| 纳雍县| 石狮市| 博客| 达拉特旗| 邵武市| 江孜县| 商丘市| 宾阳县| 邛崃市| 额济纳旗| 莆田市| 襄城县|