亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談一下Java的雙親委派模式

 更新時(shí)間:2023年04月27日 08:53:39   作者:索碼理  
這篇文章主要介紹了一下Java的雙親委派模式,雙親委派指得是,JVM在加載類(lèi)時(shí),會(huì)委派給ExtClassLoader和BootstrapClassLoader進(jìn)?加載,如果沒(méi)加載到才由??進(jìn)?加載,需要的朋友可以參考下

說(shuō)起雙親委派模型,不得不說(shuō)一下類(lèi)加載器。

類(lèi)加載器是什么?

當(dāng)我們編譯Java類(lèi)時(shí),JVM會(huì)創(chuàng)建與平臺(tái)和機(jī)器無(wú)關(guān)的字節(jié)碼。字節(jié)碼存儲(chǔ)在.class文件中。當(dāng)我們嘗試使用一個(gè)類(lèi)時(shí),類(lèi)加載器就會(huì)把它加載到內(nèi)存中,然后把字節(jié)碼文件轉(zhuǎn)成Class對(duì)象。通俗的說(shuō)類(lèi)加載器就是將.class文件轉(zhuǎn)成Class對(duì)象的。

類(lèi)加載器分類(lèi)

啟動(dòng)類(lèi)加載器(Bootstrap Class Loader):負(fù)責(zé)加載存放在 <JAVA_HOME>\lib目錄下的類(lèi),或者被-Xbootclasspath參數(shù)所指定的路徑中存放的類(lèi)。比如:rt.jar、java.lang.*包下的類(lèi)。

擴(kuò)展類(lèi)加載器(Extension Class Loader):負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中所有的類(lèi)庫(kù)。

應(yīng)用程序類(lèi)加載器(Application Class Loader):負(fù)責(zé)加載用戶(hù)類(lèi)路徑上所有的類(lèi)庫(kù)。

雙親委派模型工作流程

當(dāng)類(lèi)加載器收到加載類(lèi)的請(qǐng)求時(shí),它首先會(huì)把請(qǐng)求委派給父加載器去完成,每一層都如此,直到把請(qǐng)求委派給最頂層的啟動(dòng)類(lèi)加載器,只有當(dāng)父加載器無(wú)法加載委派過(guò)來(lái)的類(lèi)時(shí),子加載器才會(huì)加載。

JVM在加載?個(gè)類(lèi)時(shí),會(huì)調(diào)?AppClassLoader的loadClass?法來(lái)加載這個(gè)類(lèi),不過(guò)在這個(gè)?法中,會(huì)先使?ExtClassLoader的loadClass?法來(lái)加載類(lèi),同樣ExtClassLoader的loadClass?法中會(huì)先使?BootstrapClassLoader來(lái)加載類(lèi),如果BootstrapClassLoader加載到了就直接成功,如果 BootstrapClassLoader沒(méi)有加載到,那么ExtClassLoader就會(huì)??嘗試加載該類(lèi),如果沒(méi)有加載到,那么則會(huì)由AppClassLoader來(lái)加載這個(gè)類(lèi)。

雙親委派模型

所以,雙親委派指得是,JVM在加載類(lèi)時(shí),會(huì)委派給ExtClassLoader和BootstrapClassLoader進(jìn)?加載,如果沒(méi)加載到才由??進(jìn)?加載。

這里說(shuō)的雙親并不是說(shuō)類(lèi)加載器之間是以繼承方式實(shí)現(xiàn)的,而是以組合的方式實(shí)現(xiàn)的,通過(guò)源碼可以證實(shí)這點(diǎn):

java.lang.ClassLoader#loadClass

private final ClassLoader parent;

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

同時(shí),通過(guò)源碼我們也可以看到類(lèi)加載器的加載流程是跟我們描述的一樣的:先檢查請(qǐng)求加載的類(lèi)型是否已經(jīng)被加載過(guò),若沒(méi)有則調(diào)用父加載器的loadClass()方法,若父加載器為空則默認(rèn)使用啟動(dòng)類(lèi)加載器作為父加載器。假如父類(lèi)加載器加載失敗,拋出ClassNotFoundException異常的話,才調(diào)用自己的findClass()方法嘗試進(jìn)行加載。

雙親委派模型好處

保證唯一性,避免重復(fù)加載:類(lèi)的加載隨著它的類(lèi)加載器一起具備了層級(jí)關(guān)系,通過(guò)這種層級(jí)關(guān)系避免了重復(fù)加載,父類(lèi)加載器加載了該類(lèi),子加載器就無(wú)需加載了。

避免核心類(lèi)被篡改:核心類(lèi)由啟動(dòng)類(lèi)加載器加載,即使用戶(hù)自定義同名核心類(lèi)也不會(huì)被加載。

到此這篇關(guān)于淺談一下Java的雙親委派模式的文章就介紹到這了,更多相關(guān)java雙親委派模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的JDBC和橋接模式詳解

    Java的JDBC和橋接模式詳解

    下面小編就為大家?guī)?lái)一篇Java的JDBC和橋接模式(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • Maven Plugin的@Mojo和@Execute的具體使用

    Maven Plugin的@Mojo和@Execute的具體使用

    本文主要介紹了Maven Plugin的@Mojo和@Execute的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java中\(zhòng)n和\r區(qū)別

    Java中\(zhòng)n和\r區(qū)別

    本文主要介紹了Java中\(zhòng)n和\r區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • SpringBoot中驗(yàn)證用戶(hù)上傳的圖片資源的方法

    SpringBoot中驗(yàn)證用戶(hù)上傳的圖片資源的方法

    這篇文章主要介紹了在SpringBoot中驗(yàn)證用戶(hù)上傳的圖片資源,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    這篇文章主要介紹了JavaWeb中struts2文件上傳下載功能的實(shí)現(xiàn),在Web應(yīng)用系統(tǒng)開(kāi)發(fā)中,文件上傳和下載功能是非常常用的功能,需要的朋友可以參考下
    2016-05-05
  • 微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))

    微信小程序獲取手機(jī)號(hào)的完整實(shí)例(Java后臺(tái)實(shí)現(xiàn))

    我們?cè)谧鲂〕绦蜷_(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)涉及到用戶(hù)身份的問(wèn)題,最普遍的就是我們要獲取用戶(hù)的手機(jī)號(hào)碼,下面這篇文章主要給大家介紹了關(guān)于微信小程序獲取手機(jī)號(hào)的完整實(shí)例,后臺(tái)由Java實(shí)現(xiàn),需要的朋友可以參考下
    2022-06-06
  • Springboot常用注解及作用說(shuō)明

    Springboot常用注解及作用說(shuō)明

    這篇文章主要介紹了Springboot常用注解及作用說(shuō)明,Springboot開(kāi)發(fā)中注解是非常重要的不可或缺的,那么Springboot中有哪些常用的注解呢,今天我們就來(lái)看一下這些注解和其作用,需要的朋友可以參考下
    2023-08-08
  • java基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)全局唯一ID的示例

    java基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)全局唯一ID的示例

    本文主要介紹了java基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)全局唯一ID的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 詳解Spring Security的formLogin登錄認(rèn)證模式

    詳解Spring Security的formLogin登錄認(rèn)證模式

    對(duì)于一個(gè)完整的應(yīng)用系統(tǒng),與登錄驗(yàn)證相關(guān)的頁(yè)面都是高度定制化的,非常美觀而且提供多種登錄方式。這就需要Spring Security支持我們自己定制登錄頁(yè)面,也就是本文給大家介紹的formLogin模式登錄認(rèn)證模式,感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • 沒(méi)有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    沒(méi)有編輯器的環(huán)境下是如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目的?

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著在沒(méi)有編輯器的環(huán)境下如何創(chuàng)建Servlet(Tomcat+Java)項(xiàng)目展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論