国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java設計模式之單例模式淺析

Java設計模式之單例模式淺析

2022-02-16 10:59吾日三省賈斯汀 Java教程

這篇文章主要給大家介紹了關于Java單例模式,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

 

什么是設計模式?

百科:

設計模式是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結。

設計模式是軟件行業(yè)的通用的設計標準,在Java同樣通用,主要有23種設計模式如下:

Java設計模式之單例模式淺析

有的小伙伴可能會問,這么多,學得完嗎?

答:不好意思,不要太自信了,一般人還真學不完,不過一些常用的設計模式,例如上圖中標紅的單例模式、工廠模式、代理模式等設計模式,還是需要花些時間和精力去多多了解一下,相信會對自己在程序設計或寫代碼時有很大的幫助。

本文主要來聊一聊設計模式中創(chuàng)建型的單例模式,進入正文~

 

單例模式是什么?

學習Java的小伙伴,相信都寫過Class類吧,創(chuàng)建某個類實例化對象的核心是new MyClass()來實現(xiàn),如果沒有任何設計規(guī)范,在日常開發(fā)寫代碼時,如果實例被用的地方很多,每次調用的時候都通過new MyClass()得到實例化對象,代碼重復而且頻繁的創(chuàng)建對象還影響性能,而有些場景我們只需要提供該類的一個實例即可,例如平時比較常見的線程池、日志對象、緩存等,一般只需要確保有一個實例即可,這種確保某個類只有一個實例并且能夠類自身提供自動創(chuàng)建實例化對象的設計模式即稱為單例模式。

 

單例模式設計的原則是什么?

  • 構造方法私有化:既然是單例,就不能將類的構造函數(shù)暴露在外面,因此需要重寫構造函數(shù)為私有化;
  • 要考慮線程安全:多線程環(huán)境下,要確保不會構造出多個實例對象。

 

Java實現(xiàn)單例模式的5種方式?

關于Java實現(xiàn)單例模式的有幾種方式,網(wǎng)上有很多說法,有5種、6種甚至7種實現(xiàn)方式,本文出于單例模式設計的兩個主要原則構造方法私有化和要考慮線程安全,不考慮線程安全的其他實現(xiàn)方式?jīng)]有任何意義,主要有5種實現(xiàn)方式:

Java設計模式之單例模式淺析

 

懶漢

使用懶漢式寫法,主要是通過synchronized修飾實例化方法getInstance,保證了線程安全,并且只有調用getInstance時才初始化,顧此得名懶漢。

懶漢寫法1:

/**
 * 單例模式之懶漢寫法1
 */
public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    public synchronized static Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

懶漢寫法2:

該寫法等價于寫法1,原因在于關鍵字synchronized的靈活運用,放在方法上修飾,加鎖的對象是Singleton,等效于將synchronized移到方法內(nèi)部作為一個同步塊,并通過括號中的Singleton.class顯示指定鎖對象,效果是一樣的。

/**
 * 單例模式之懶漢寫法2
 */
public class Singleton {
    private static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance(){
        synchronized(Singleton.class) {
            if (instance == null) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}

 

餓漢

餓漢寫法,只需要定義一個static靜態(tài)變量instance = new Singleton(),簡單的理解為在類加載時,也會完成單例對象的實例化工作。

/**
 * 單例模式之餓漢
 */
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    }
}

細心的小伙伴會發(fā)現(xiàn)該過程并沒有使用到synchronized關鍵字,那會不會線程不安全呢?答案是,不會,如果你大概了解過Java虛擬機即JVM(Java Virtual Machine),那你可能知道類加載過程為:加載 -> 驗證 ->解析 ->初始化,而初始化階段是執(zhí)行類構造器<clinit>()方法的過程,<clinit>()方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)語句塊中的語句合成產(chǎn)生的。

《深入理解Java虛擬機》類加載機制章節(jié)部分說明:

虛擬機會保證一個類的<clinit>()方法在多線程環(huán)境中被正確地加鎖、同步,如果多個線程同時如初始化一個類,那么只會有一個線程去執(zhí)行這個類的<clinit>()方法,其他線程都需要阻塞等待,知道活動線程執(zhí)行<clinit>()方法完畢。

 

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

靜態(tài)內(nèi)部類這種方式,其實就是在類的內(nèi)部創(chuàng)建一個static SingletonInner靜態(tài)內(nèi)部類,然后在靜態(tài)內(nèi)部類的內(nèi)部再定義一個static final修飾的靜態(tài)常量INSTANCE = new Singleton(),同樣static修飾的SingletonInner靜態(tài)內(nèi)部類,會在JVM加載類時完成類的初始化并完成自己定義的靜態(tài)常量單例實例化過程。

/**
 * 單例模式之靜態(tài)內(nèi)部類
 */
public class Singleton {
    private static class SingletonInner{
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonInner.INSTANCE;
    }
}

 

雙重校驗鎖DCL(Double Check Lock)

DCL寫法,其實與單例模式之懶漢寫法2區(qū)別在于,synchronized同步塊外面再套一層判斷,并且使用了能確保線程安全核心volatile關鍵字修飾instance,表明單例變量是內(nèi)存共享的,能夠保證在多線程環(huán)境下的即時可見性。

/**
 * 單例模式之雙重校驗鎖DCL
 */
public class Singleton {
    private volatile static Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance(){
        if ( instance  == null ){
            synchronized (Singleton.class){
                if (instance  == null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

 

枚舉(num)

枚舉方式很容易被大家給忽略掉了,但這種方式我覺得是最簡單且又友好的一種推薦創(chuàng)建單例的方式,通過enum修飾Singleton單例類,僅需定義一個INSTANCE,然后在靜態(tài)方法實例化方法getInstance中直接返回INSTANCE即可。

/**
 * 單例模式之枚舉
 */
public enum Singleton {
    INSTANCE;
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

 

總結

設計模式之單例模式,看似挺簡單,其實還涉及了枚舉enum、同步鎖synchronized、JVM類加載機制、多線程volatile關鍵字的使用等Java的N個知識點。

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

原文鏈接:https://blog.csdn.net/JustinQin/article/details/120668592

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 综合色九九 | 可以在线观看的av网站 | 91久久九色 | 国产色区 | 亚洲成人免费影院 | 欧美 日韩 综合 | 亚洲福利网站 | 精品视频久久 | 中文在线一区 | 欧美精品www | 日韩一级免费观看 | 欧洲一区二区三区 | 亚洲日本中文字幕 | 日韩成人av在线 | 午夜免费福利视频 | 噜噜噜视频在线观看 | 激情综合在线观看 | 一区亚洲| 午夜精品美女久久久久av福利 | 国产精品女同一区二区久久夜 | 黄色免费网站 | 成人久久久精品乱码一区二区三区 | 国产欧美精品一区二区三区四区 | 久久毛片 | 久久免费国产精品 | 成人一区二区三区在线观看 | 亚洲视频在线观看网址 | 亚洲国产成人精品久久久国产成人一区 | 亚洲一区二区中文 | 成人h视频| 在线永久免费观看日韩a | 成人小视频在线观看 | 欧美日韩亚洲成人 | 亚洲在线 | 日韩精品在线观看免费 | 国产精品影视 | 亚洲国产一区二区三区四区 | 黄色高清网站 | 亚洲精品一区二区三区蜜桃久 | 久久777| 国产一区中文字幕 |