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

全面解析Java設(shè)計模式之單例模式

 更新時間:2017年12月21日 16:57:05   作者:天陰的時候  
這篇文章主要幫助大家全面解析Java設(shè)計模式之單例模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java設(shè)計模式之單例模式的具體代碼,供大家參考,具體內(nèi)容如下

概念:

單例模式:一個類中只有一個實例。

一個類有且僅有一個實例,并且提供了一個全局的訪問點。

使用該模式的起因:

  當(dāng)我們在瀏覽網(wǎng)站時,有些網(wǎng)站會顯示“當(dāng)前在線人數(shù)”。通常,實現(xiàn)這個功能的辦法是將登陸的每一個IP存儲在一個內(nèi)存、文件或者數(shù)據(jù)庫中,每多一個IP,就實現(xiàn)“+1”。一般就是用一個方法,比如add(),實現(xiàn)“+1”的功能,比如用“update”語句,先獲取數(shù)據(jù)庫中存儲的數(shù)據(jù),再+1,更新數(shù)據(jù)庫中的數(shù)據(jù),,然后保存;顯示在頁面時,再通過另外的方法獲取數(shù)據(jù)庫中的數(shù)據(jù)即可。但是,當(dāng)多個用戶同時登陸時,如果每一個都要new一個對象,然后再通過“對象.方法名”調(diào)用執(zhí)行add()方法,再將數(shù)據(jù)存儲到數(shù)據(jù)庫中,這樣就會導(dǎo)致多個用戶無法將實際的用戶數(shù)據(jù)準(zhǔn)確的記錄到數(shù)據(jù)庫中。所以,把這個計數(shù)器設(shè)計為一個全局對象(所有人都使用這一個對象,而不是用一個,new一個),所有人都共用同一份數(shù)據(jù),就可以避免類似的問題,這就是我們所說的單例模式的其中的一種應(yīng)用。 

同樣的,還有其他場景中,也會遇到相似的情景,使用到類似的思路。比如:

   1.外部資源:每臺計算機有若干個打印機,但只能有一個PrinterSpooler,以避免兩個打印作業(yè)同時輸出到打印機。內(nèi)部資源:大多數(shù)軟件都有一個(或多個)屬性文件存放系統(tǒng)配置,這樣的系統(tǒng)應(yīng)該有一個對象管理這些屬性文件
   2. Windows的Task Manager(任務(wù)管理器)就是很典型的單例模式(這個很熟悉吧),想想看,是不是呢,你能打開兩個windows task manager嗎? 不信你自己試試看哦~
   3. windows的Recycle Bin(回收站)也是典型的單例應(yīng)用。在整個系統(tǒng)運行過程中,回收站一直維護著僅有的一個實例。
   4. 網(wǎng)站的計數(shù)器,一般也是采用單例模式實現(xiàn),否則難以同步。
   5. 應(yīng)用程序的日志應(yīng)用,一般都何用單例模式實現(xiàn),這一般是由于共享的日志文件一直處于打開狀態(tài),因為只能有一個實例去操作,否則內(nèi)容不好追加。
   6. Web應(yīng)用的配置對象的讀取,一般也應(yīng)用單例模式,這個是由于配置文件是共享的資源。
   7. 數(shù)據(jù)庫連接池的設(shè)計一般也是采用單例模式,因為數(shù)據(jù)庫連接是一種數(shù)據(jù)庫資源。數(shù)據(jù)庫軟件系統(tǒng)中使用數(shù)據(jù)庫連接池,主要是節(jié)省打開或者關(guān)閉數(shù)據(jù)庫連接所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因為何用單例模式來維護,就可以大大降低這種損耗。
   8. 多線程的線程池的設(shè)計一般也是采用單例模式,這是由于線程池要方便對池中的線程進行控制。
   9. 操作系統(tǒng)的文件系統(tǒng),也是大的單例模式實現(xiàn)的具體例子,一個操作系統(tǒng)只能有一個文件系統(tǒng)。
   10. HttpApplication 也是單位例的典型應(yīng)用。熟悉ASP.Net(IIS)的整個請求生命周期的人應(yīng)該知道HttpApplication也是單例模式,所有的HttpModule都共享一個HttpApplication實例。 

總結(jié)起來,單例模式的一般應(yīng)用場景為:

    1.需要頻繁實例化然后銷毀的對象。

    2.創(chuàng)建對象時耗時過多或者耗資源過多,但又經(jīng)常用到的對象。

      3.有狀態(tài)的工具類對象。

    4.頻繁訪問數(shù)據(jù)庫或者文件的對象。

    5.資源共享的情況下,避免由于資源操作時導(dǎo)致的性能或損耗等。如上述中的日志文件、應(yīng)用配置等。

    6.控制資源的情況下,方便資源之間的互相通信。如線程池等。

特點:

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

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

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

單例模式要素: 

   1.私有構(gòu)造方法
   2.私有靜態(tài)引用指向自己實例
   3.以自己實例為返回值的公有靜態(tài)方法 

實現(xiàn)單例模式的三種方法:

1.餓漢式:單例實例在類裝載時就構(gòu)建,急切初始化。(預(yù)先加載法)

/**
* 餓漢式(推薦)
*
*/
public class Test {
    private Test() {
    }
    public static Test instance = new Test();
    public Test getInstance() {
        return instance;
    }
}

優(yōu)點 

    1.線程安全
    2.在類加載的同時已經(jīng)創(chuàng)建好一個靜態(tài)對象,調(diào)用時反應(yīng)速度快

缺點 

    資源效率不高,可能getInstance()永遠(yuǎn)不會執(zhí)行到,但執(zhí)行該類的其他靜態(tài)方法或者加載了該類(class.forName),那么這個實例仍然初始化

2.懶漢式:單例實例在第一次被使用時構(gòu)建,延遲初始化。

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
       //多個線程判斷instance都為null時,在執(zhí)行new操作時多線程會出現(xiàn)重復(fù)情況
            instance = new Singleton2();
        }
        return instance;
    }
}

優(yōu)點 

    避免了餓漢式的那種在沒有用到的情況下創(chuàng)建事例,資源利用率高,不執(zhí)行g(shù)etInstance()就不會被實例,可以執(zhí)行該類的其他靜態(tài)方法。

缺點 

    懶漢式在單個線程中沒有問題,但多個線程同事訪問的時候就可能同事創(chuàng)建多個實例,而且這多個實例不是同一個對象,雖然后面創(chuàng)建的實例會覆蓋先創(chuàng)建的實例,但是還是會存在拿到不同對象的情況。解決這個問題的辦法就是加鎖synchonized,第一次加載時不夠快,多線程使用不必要的同步開銷大。

3.雙重檢測

class Test {
    private Test() {
    }
    public static Test instance = null;

    public static Test getInstance() {
        if (instance == null) {
            synchronized (Test.class) {
                if (instance == null) {
                    instance = new Test();
                }
            }
        }
        return instance;
    }
}

優(yōu)點 

    資源利用率高,不執(zhí)行g(shù)etInstance()就不被實例,可以執(zhí)行該類其他靜態(tài)方法

缺點 

    第一次加載時反應(yīng)不快,由于java內(nèi)存模型一些原因偶爾失敗

4.靜態(tài)內(nèi)部類

class Test {
    private Test() {
    }

    private static class SingletonHelp {
        static Test instance = new Test();
    }

    public static Test getInstance() {
        return SingletonHelp.instance;
    }
}

優(yōu)點 

    資源利用率高,不執(zhí)行g(shù)etInstance()不被實例,可以執(zhí)行該類其他靜態(tài)方法

缺點 

    第一次加載時反應(yīng)不夠快

總結(jié): 

    一般采用餓漢式,若對資源十分在意可以采用靜態(tài)內(nèi)部類,不建議采用懶漢式及雙重檢測

 以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaEE多線程中阻塞隊列的項目實踐

    JavaEE多線程中阻塞隊列的項目實踐

    本文主要介紹了JavaEE多線程中阻塞隊列的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java架構(gòu)師的5大基本能力你知道嗎

    Java架構(gòu)師的5大基本能力你知道嗎

    這篇文章主要為大家介紹了Java架構(gòu)師的基本能力,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-01-01
  • 排查Failed?to?validate?connection?com.mysql.cj.jdbc.ConnectionImpl

    排查Failed?to?validate?connection?com.mysql.cj.jdbc.Connec

    這篇文章主要介紹了Failed?to?validate?connection?com.mysql.cj.jdbc.ConnectionImpl問題排查,具有很好的參考價值,希望對大家有所幫助
    2023-02-02
  • SpringBoot 之啟動流程詳解

    SpringBoot 之啟動流程詳解

    SpringBoot 是一個基于 Spring 框架的快速開發(fā)框架,旨在簡化 Spring 應(yīng)用程序的開發(fā)和部署。在本文中,我們將深入分析 SpringBoot 啟動過程的源代碼,并提供必要的解釋和說明
    2023-04-04
  • 深入理解Java設(shè)計模式之外觀模式

    深入理解Java設(shè)計模式之外觀模式

    這篇文章主要介紹了JAVA設(shè)計模式之外觀模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • Java實現(xiàn)插入排序,希爾排序和歸并排序

    Java實現(xiàn)插入排序,希爾排序和歸并排序

    這篇文章主要為大家詳細(xì)介紹了插入排序,希爾排序和歸并排序的多種語言的實現(xiàn)(JavaScript、Python、Go語言、Java),感興趣的小伙伴可以了解一下
    2022-12-12
  • Java實現(xiàn)Executors類創(chuàng)建常見線程池

    Java實現(xiàn)Executors類創(chuàng)建常見線程池

    本文主要介紹了Java實現(xiàn)Executors類創(chuàng)建常見線程池,在Java中,可以通過Executors工廠類提供四種常見類型的線程池,下面就來介紹一下這四種的方法實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • SpringBoot注冊第三方Bean的方法總結(jié)

    SpringBoot注冊第三方Bean的方法總結(jié)

    眾所周知,SpringBoot默認(rèn)會掃描啟動類所在的包及其子包,一般我們都是在需要的類上通過注解的方式去將Bean注冊交給IOC進行管理,但是注冊第三方Bean的方案卻不支持,所以本文給大家介紹了SpringBoot注冊第三方Bean的方法,需要的朋友可以參考下
    2024-01-01
  • 如何實現(xiàn)自己的spring boot starter

    如何實現(xiàn)自己的spring boot starter

    這篇文章主要介紹了如何實現(xiàn)自己的spring boot starter,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • mybatis-plus實現(xiàn)四種lambda表達(dá)式方式

    mybatis-plus實現(xiàn)四種lambda表達(dá)式方式

    使用了lambda表達(dá)式 可以通過方法引用的方式來使用實體字段名的操作,本文主要介紹了mybatis-plus實現(xiàn)四種lambda表達(dá)式方式,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06

最新評論

丹巴县| 平果县| 瓦房店市| 会理县| 买车| 策勒县| 富平县| 乌苏市| 买车| 广东省| 宁河县| 凉山| 牟定县| 宜宾市| 红桥区| 鄂伦春自治旗| 彰化市| 浪卡子县| 十堰市| 凤城市| 迁安市| 铜陵市| 辽阳市| 沁水县| 盖州市| 巴林右旗| 绥滨县| 厦门市| 资溪县| 浠水县| 兴业县| 开封县| 长垣县| 延川县| 永安市| 台东县| 韶山市| 桐城市| 梁河县| 准格尔旗| 筠连县|