双亲委派机制 详解(手画详图)面试高频 你值得拥有!!!
受多種情況的影響,又開始看JVM 方面的知識。
1、Java 實(shí)在過于內(nèi)卷,沒法不往深了學(xué)。
2、面試題問的多,被迫學(xué)習(xí)。
3、純粹的好奇。
很喜歡一句話:“八小時內(nèi)謀生活,八小時外謀發(fā)展。”
— 望別日與君相見時,君已有所成。
共勉
地點(diǎn):湖南--小城市邵陽
作者:博主 🤸?♂?
雙親委派機(jī)制 詳解(手畫詳圖)面試高頻 你值得擁有!!!
- 一、概述
- 二、雙親委派機(jī)制原理
- 原理:
- 小故事
- 圖示:
- 代碼解釋:
- 三、雙親委派機(jī)制作用
- 自言自語
一、概述
? 雙親委派機(jī)制是當(dāng)類加載器需要加載某一個.class字節(jié)碼文件時,則首先會把這個任務(wù)委托給他的上級類加載器,遞歸這個操作,如果上級沒有加載該.class文件,自己才會去加載這個.class。這是一種任務(wù)委派模式。
二、雙親委派機(jī)制原理
原理:
- 如果一個類加載器收到了要加載某個類的請求,它要做的首要事情不是加載,而是將這個請求委托給父類的加載器去執(zhí)行。
- 如果父類加載器還存在其父類加載器,則進(jìn)一步向上委托,依次遞歸,請求最終將到達(dá)頂層的啟動類加載器;
- 如果父類加載器可以完成類加載任務(wù),就成功返回,倘若父類加載器無法完成此加載任務(wù),子加載器才會嘗試自己去加載,這就是雙親委派模式。
小故事
用一個小故事來加深大家的印象:
1、你看到餐桌上有個雞腿,看到麻麻非常幸苦。你就說:麻麻你次這個雞腿吧。麻麻又看到桌上的奶奶,就講媽:次這個雞腿補(bǔ)補(bǔ)身子吧。奶奶高興的說:我媳婦孝順啊,我今天也來嘗嘗這個孝順味道的雞腿啦。
2、你看到餐桌上有個雞腿,看到麻麻非常幸苦。你就說:麻麻你次這個雞腿吧。麻麻又看到桌上奶奶在,就講媽:次這個雞腿補(bǔ)補(bǔ)身子把。奶奶高興的說:我媳婦有這個孝順心就好了,你每天上班次外賣,對身體不好,這個雞腿給你次。麻麻拿到手上,又反手把雞腿夾給我,講:這個雞腿還是得你次,你現(xiàn)在正在長身體,不補(bǔ)一補(bǔ)長不高。???♂?
這就是雙親委派機(jī)制,不知道看完這個餐桌小故事,大家有沒有懂勒。
圖示:
代碼解釋:
我在我自己的項(xiàng)目中創(chuàng)建了 一個java.lang 的包 ,然后創(chuàng)建了一個 String 類。
再準(zhǔn)備一個測試類,引用這個String類。
String 類 里面就一個靜態(tài)代碼塊。
代碼可以運(yùn)行,輸出如下:
并沒有輸出我的String 里面的static 靜態(tài)代碼塊,證明使用的仍然是 jdk 自帶的。
原因是什么呢?
一步一步分析。
我們自定義一個類,你要想加載的話,應(yīng)該是用 Application ClassLoader(系統(tǒng)類加載器、應(yīng)用程序加載器)進(jìn)行加載。但是這個時候又牽扯到了 雙親委派機(jī)制。
1、當(dāng)我們要加載這個自定義String時,
2、先是讓應(yīng)用程序加載器(Application ClassLoader)加載,但是發(fā)現(xiàn)它上面還有擴(kuò)展類加載器(Extension ClassLoader)
3、接著委托給擴(kuò)展類加載器(Extension ClassLoader),突然發(fā)現(xiàn)它上面還有Bootstrap ClassLoader (啟動類加載器)
4、就又接著委托到了Bootstrap ClassLoader (啟動類加載器)。啟動加載器一看,這不是 java.lang 包下的嗎,這是我的任務(wù)啊,急忙把他加載啦,然后成功返回。所以這里使用的 new String() 實(shí)際使用的還是 java 中 String。
這樣子可以防止什么樣問題的發(fā)生呢?
你想啊,你寫了一個項(xiàng)目,里面用了Jdk 核心類,像String.java,Integer.java,Date.java這種核心類,如果這種核心類能夠被隨意更改,第一、這很有可能導(dǎo)致整個項(xiàng)目的崩潰,第二、會影響到Java 虛擬機(jī)的穩(wěn)定性。
三、雙親委派機(jī)制作用
- 確保Java核心類庫的安全:所有的Java應(yīng)用都至少會引用java.lang.Object類,也就是說在運(yùn)行期,java.lang.Object類會被記載到Java虛擬機(jī)當(dāng)中;如果這個加載過程是由Java應(yīng)用自己的類加載器所完成的,那么可能會在JVM中存在多個版本的java.lang.Object類,而且這些類還是不兼容的、相互不可見的(因?yàn)槊臻g的原因)。借助父親委托機(jī)制,Java核心類庫中的類的加載工作都是由啟動類加載器來統(tǒng)一完成的,從而確保了Java應(yīng)用所使用的都是同一個版本的Java核心類庫,他們之間是互相兼容的。
- 確保Java核心類庫提供的類不會被自定義的類所替代。
- 不同的類加載器可以為相同名稱(binary name)的類創(chuàng)建額外的命名空間。相同名稱的類可以并存在Java虛擬機(jī)中,只需要用不同的類加載器來加他們即可,不同類加載器所加載的類是不兼容的,這就相當(dāng)于在Java虛擬機(jī)內(nèi)部創(chuàng)建了一個又一個相互隔離的Java類空間。
- 防止重復(fù)加載同一個.class。通過委托去向上面問一問,加載過了,就不用再加載一遍。保證數(shù)據(jù)安全。
自言自語
劃水的一篇哈,我們都加油,放肆愛!!!
一個玻璃展示罩的原木底座
共勉
總結(jié)
以上是生活随笔為你收集整理的双亲委派机制 详解(手画详图)面试高频 你值得拥有!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小学五年级就已经开始编程啦吗???
- 下一篇: JVM-虚拟机栈详解 附面试高频题 (手