五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

尊嘟假嘟?雙親委派機(jī)制

2023-08-14 21:01 作者:Java3y  | 我要投稿

面試官要不你今天來(lái)詳細(xì)講講雙親委派機(jī)制?

候選者:嗯,好的。

候選者:上次提到了:class文件是通過(guò)「類(lèi)加載器」裝載至JVM中的

候選者:為了防止內(nèi)存中存在多份同樣的字節(jié)碼,使用了雙親委派機(jī)制(它不會(huì)自己去嘗試加載類(lèi),而是把請(qǐng)求委托給父加載器去完成,依次向上)

候選者:JDK 中的本地方法類(lèi)一般由根加載器(Bootstrp loader)裝載,JDK 中內(nèi)部實(shí)現(xiàn)的擴(kuò)展類(lèi)一般由擴(kuò)展加載器(ExtClassLoader )實(shí)現(xiàn)裝載,而程序中的類(lèi)文件則由系統(tǒng)加載器(AppClassLoader )實(shí)現(xiàn)裝載。


候選者:這應(yīng)該很好理解吧?

面試官:雀食(確實(shí))!

面試官順著話題,我想問(wèn)問(wèn),打破雙親委派機(jī)制是什么意思?

候選者:很好理解啊,意思就是:只要我加載類(lèi)的時(shí)候,不是從APPClassLoader->Ext ClassLoader->BootStrap ClassLoader 這個(gè)順序找,那就算是打破了啊

候選者:因?yàn)榧虞dclass核心的方法在LoaderClass類(lèi)的loadClass方法上(雙親委派機(jī)制的核心實(shí)現(xiàn))

候選者:那只要我自定義個(gè)ClassLoader,重寫(xiě)loadClass方法(不依照往上開(kāi)始尋找類(lèi)加載器),那就算是打破雙親委派機(jī)制了。

面試官:這么簡(jiǎn)單?

候選者:嗯,就是這么簡(jiǎn)單

面試官那你知道有哪個(gè)場(chǎng)景破壞了雙親委派機(jī)制嗎?

候選者:最明顯的就Tomcat啊

面試官:詳細(xì)說(shuō)說(shuō)?

候選者:在初學(xué)時(shí)部署項(xiàng)目,我們是把war包放到tomcat的webapp下,這意味著一個(gè)tomcat可以運(yùn)行多個(gè)Web應(yīng)用程序(:

候選者:是吧?

面試官:嗯..

候選者:那假設(shè)我現(xiàn)在有兩個(gè)Web應(yīng)用程序,它們都有一個(gè)類(lèi),叫做User,并且它們的類(lèi)全限定名都一樣,比如都是com.yyy.User。但是他們的具體實(shí)現(xiàn)是不一樣的

候選者:那么Tomcat是如何保證它們是不會(huì)沖突的呢?

候選者:答案就是,Tomcat給每個(gè) Web 應(yīng)用創(chuàng)建一個(gè)類(lèi)加載器實(shí)例(WebAppClassLoader),該加載器重寫(xiě)了loadClass方法,優(yōu)先加載當(dāng)前應(yīng)用目錄下的類(lèi),如果當(dāng)前找不到了,才一層一層往上找(:

候選者:那這樣就做到了Web應(yīng)用層級(jí)的隔離


面試官嗯,那你還知道Tomcat還有別的類(lèi)加載器嗎?

候選者:嗯,知道的

候選者:并不是Web應(yīng)用程序下的所有依賴都需要隔離的,比如Redis就可以Web應(yīng)用程序之間共享(如果有需要的話),因?yàn)槿绻姹鞠嗤?,沒(méi)必要每個(gè)Web應(yīng)用程序都獨(dú)自加載一份啊。

候選者:做法也很簡(jiǎn)單,Tomcat就在WebAppClassLoader上加了個(gè)父類(lèi)加載器(SharedClassLoader),如果WebAppClassLoader自身沒(méi)有加載到某個(gè)類(lèi),那就委托SharedClassLoader去加載。

候選者:(無(wú)非就是把需要應(yīng)用程序之間需要共享的類(lèi)放到一個(gè)共享目錄下嘛)

面試官:嗯..

候選者:為了隔絕Web應(yīng)用程序與Tomcat本身的類(lèi),又有類(lèi)加載器(CatalinaClassLoader)來(lái)裝載Tomcat本身的依賴

候選者:如果Tomcat本身的依賴和Web應(yīng)用還需要共享,那么還有類(lèi)加載器(CommonClassLoader)來(lái)裝載進(jìn)而達(dá)到共享

候選者:各個(gè)類(lèi)加載器的加載目錄可以到tomcat的catalina.properties配置文件上查看

候選者:我稍微畫(huà)下Tomcat的類(lèi)加載結(jié)構(gòu)圖吧,不然有點(diǎn)抽象


面試官:嗯,還可以,我聽(tīng)懂了,有點(diǎn)意思。

面試官順便,我想問(wèn)下,JDBC你不是知道嗎,聽(tīng)說(shuō)它也是破壞了雙親委派模型的,你怎么理解的。

候選者:Eumm,這個(gè)有沒(méi)有破壞,見(jiàn)仁見(jiàn)智吧。

候選者:JDBC定義了接口,具體實(shí)現(xiàn)類(lèi)由各個(gè)廠商進(jìn)行實(shí)現(xiàn)嘛(比如MySQL)

候選者:類(lèi)加載有個(gè)規(guī)則:如果一個(gè)類(lèi)由類(lèi)加載器A加載,那么這個(gè)類(lèi)的依賴類(lèi)也是由「相同的類(lèi)加載器」加載。

候選者:我們用JDBC的時(shí)候,是使用DriverManager進(jìn)而獲取Connection,DriverManager在java.sql包下,顯然是由BootStrap類(lèi)加載器進(jìn)行裝載

候選者:當(dāng)我們使用DriverManager.getConnection()時(shí),得到的一定是廠商實(shí)現(xiàn)的類(lèi)。

候選者:但BootStrap ClassLoader會(huì)能加載到各個(gè)廠商實(shí)現(xiàn)的類(lèi)嗎?

候選者:顯然不可以啊,這些實(shí)現(xiàn)類(lèi)又沒(méi)在java包中,怎么可能加載得到呢

面試官:嗯..

候選者:DriverManager的解決方案就是,在DriverManager初始化的時(shí)候,得到「線程上下文加載器」

候選者:去獲取Connection的時(shí)候,是使用「線程上下文加載器」去加載Connection的,而這里的線程上下文加載器實(shí)際上還是App ClassLoader

候選者:所以在獲取Connection的時(shí)候,還是先找Ext ClassLoader和BootStrap ClassLoader,只不過(guò)這倆加載器肯定是加載不到的,最終會(huì)由App ClassLoader進(jìn)行加載


面試官:嗯..

候選者:那這種情況,有的人覺(jué)得破壞了雙親委派機(jī)制,因?yàn)楸緛?lái)明明應(yīng)該是由BootStrap ClassLoader進(jìn)行加載的,結(jié)果你來(lái)了一手「線程上下文加載器」,改掉了「類(lèi)加載器」

候選者:有的人覺(jué)得沒(méi)破壞雙親委派機(jī)制,只是改成由「線程上下文加載器」進(jìn)行類(lèi)加載,但還是遵守著:「依次往上找父類(lèi)加載器進(jìn)行加載,都找不到時(shí)才由自身加載」。認(rèn)為”原則”上是沒(méi)變的。

面試官:那我了解了

本文總結(jié)

  • 前置知識(shí):JDK中默認(rèn)類(lèi)加載器有三個(gè):AppClassLoader、Ext ClassLoader、BootStrap ClassLoader。AppClassLoader的父加載器為Ext ClassLoader、Ext ClassLoader的父加載器為BootStrap ClassLoader。這里的父子關(guān)系并不是通過(guò)繼承實(shí)現(xiàn)的,而是組合。
  • 什么是雙親委派機(jī)制:加載器在加載過(guò)程中,先把類(lèi)交由父類(lèi)加載器進(jìn)行加載,父類(lèi)加載器沒(méi)找到才由自身加載。
  • 雙親委派機(jī)制目的:為了防止內(nèi)存中存在多份同樣的字節(jié)碼(安全)
  • 類(lèi)加載規(guī)則:如果一個(gè)類(lèi)由類(lèi)加載器A加載,那么這個(gè)類(lèi)的依賴類(lèi)也是由「相同的類(lèi)加載器」加載。
  • 如何打破雙親委派機(jī)制:自定義ClassLoader,重寫(xiě)loadClass方法(只要不依次往上交給父加載器進(jìn)行加載,就算是打破雙親委派機(jī)制)
  • 打破雙親委派機(jī)制案例:Tomcat
  • 為了Web應(yīng)用程序類(lèi)之間隔離,為每個(gè)應(yīng)用程序創(chuàng)建WebAppClassLoader類(lèi)加載器
  • 為了Web應(yīng)用程序類(lèi)之間共享,把ShareClassLoader作為WebAppClassLoader的父類(lèi)加載器,如果WebAppClassLoader加載器找不到,則嘗試用ShareClassLoader進(jìn)行加載
  • 為了Tomcat本身與Web應(yīng)用程序類(lèi)隔離,用CatalinaClassLoader類(lèi)加載器進(jìn)行隔離,CatalinaClassLoader加載Tomcat本身的類(lèi)
  • 為了Tomcat與Web應(yīng)用程序類(lèi)共享,用CommonClassLoader作為CatalinaClassLoader和ShareClassLoader的父類(lèi)加載器
  • ShareClassLoader、CatalinaClassLoader、CommonClassLoader的目錄可以在Tomcat的catalina.properties進(jìn)行配置
  • 線程上下文加載器:由于類(lèi)加載的規(guī)則,很可能導(dǎo)致父加載器加載時(shí)依賴子加載器的類(lèi),導(dǎo)致無(wú)法加載成功(BootStrap ClassLoader無(wú)法加載第三方庫(kù)的類(lèi)),所以存在「線程上下文加載器」來(lái)進(jìn)行加載。

對(duì)線面試官PDF版本,可+V: java3yyy 免費(fèi)領(lǐng)取


尊嘟假嘟?雙親委派機(jī)制的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
肇州县| 宁化县| 九龙城区| 嵩明县| 宕昌县| 宝应县| 保德县| 马公市| 哈巴河县| 伊宁市| 九寨沟县| 卢氏县| 荔波县| 泸州市| 曲阜市| 英德市| 如皋市| 浮梁县| 黄平县| 瑞丽市| 应城市| 张家口市| 措美县| 平顶山市| 乌兰浩特市| 侯马市| 县级市| 南郑县| 余江县| 安达市| 南康市| 黎川县| 惠安县| 进贤县| 南平市| 章丘市| 万载县| 涞源县| 仙桃市| 鲁甸县| 清原|