欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

 更新時間:2023年10月12日 11:45:38   作者:jacheut  
這篇文章主要為大家介紹了jvm雙親委派 vs 破壞雙親委派對比來理解加載器的權(quán)責(zé)分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

雙親委派模型

對于任意一個類,都需要由加載它的類加載器和這個類本身來一同確立其在Java虛擬機中的唯一性。

為什么需要雙親委派

如果不是同一個類加載器加載,即使是相同的class文件,也會出現(xiàn)判斷不相同的情況,從而引發(fā)一些意想不到的情況,為了保證相同的class文件,在使用的時候,是相同的對象,jvm設(shè)計的時候,采用了雙親委派的方式來加載類。

雙親委派好處

  • 避免同一個類被多次加載;
  • 每個加載器只能加載自己范圍內(nèi)的類;

缺點:

頂層的啟動類加載器的代碼無法訪問到底層的類加載器。

每一個類都有一個對應(yīng)它的類加載器。系統(tǒng)中的 ClassLoder 在協(xié)同工作的時候會默認使用雙親委派模型 。即在類加載的時候,系統(tǒng)會首先判斷當(dāng)前類是否被加載過。已經(jīng)被加載的類會直接返回,否則才會嘗試加載。類加載的時候,首先會把該請求委派該父類加載器的 loadClass() 處理,因此所有的請求最終都應(yīng)該傳送到頂層的啟動類加載器 BootstrapClassLoader中。當(dāng)父類加載器無法處理時,才由自己來處理。特別當(dāng)父類加載器為null時,會使用啟動類加載器 BootstrapClassLoader 作為父類加載器。

父類加載器有自己的加載范圍,范圍內(nèi)沒有找到,則不加載,并返回給子類。

jvm提供了三種系統(tǒng)加載器:

  • 啟動類加載器(Bootstrap ClassLoader):C++實現(xiàn),在java里無法獲取,負責(zé)加載/lib下的類。
  • 擴展類加載器(Extension ClassLoader): Java實現(xiàn),可以在java里獲取,負責(zé)加載/lib/ext下的類。
  • 系統(tǒng)類加載器/應(yīng)用程序類加載器(Application ClassLoader):是與我們接觸對多的類加載器,我們寫的代碼默認就是由它來加載,ClassLoader.getSystemClassLoader返回的就是它。

破壞雙親委派

為什么需要破壞雙親委派?

因為在某些情況下父類加載器需要委托子類加載器去加載class文件。受到加載范圍的限制,父類加載器無法加載到需要的文件,以Driver接口為例,由于Driver接口定義在jdk當(dāng)中的,而其實現(xiàn)由各個數(shù)據(jù)庫的服務(wù)商來提供,比如mysql的就寫了MySQL Connector,那么問題就來了,DriverManager(也由jdk提供)要加載各個實現(xiàn)了Driver接口的實現(xiàn)類,然后進行管理,但是DriverManager由啟動類加載器加載,只能記載JAVA_HOME的lib下文件,而其實現(xiàn)是由服務(wù)商提供的,由系統(tǒng)類加載器加載,這個時候就需要啟動類加載器來委托子類來加載Driver實現(xiàn),從而破壞了雙親委派,這里僅僅是舉了破壞雙親委派的其中一個情況。

破壞雙親委派的實現(xiàn)

我們結(jié)合Driver來看一下在spi(Service Provider Inteface)中如何實現(xiàn)破壞雙親委派。
先從DriverManager開始看,平時我們通過DriverManager來獲取數(shù)據(jù)庫的Connection:
在調(diào)用DriverManager的時候,會先初始化類,調(diào)用其中的靜態(tài)塊:

可以看到,load方法調(diào)用獲取了當(dāng)前線程中的上下文類加載器,那么上下文類加載器放的是什么加載器呢?

在sun.misc.Launcher中,我們找到了答案,在Launcher初始化的時候,會獲取AppClassLoader,然后將其設(shè)置為上下文類加載器,而這個AppClassLoader,就是之前上文提到的系統(tǒng)類加載器Application ClassLoader,所以上下文類加載器默認情況下就是系統(tǒng)加載器。

以上就是淺談jvm雙親委派和破壞雙親委派的詳細內(nèi)容,更多關(guān)于jvm雙親委派的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談java中為什么實體類需要實現(xiàn)序列化

    淺談java中為什么實體類需要實現(xiàn)序列化

    下面小編就為大家?guī)硪黄獪\談java中為什么實體類需要實現(xiàn)序列化。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java?不同版本的?Switch語句

    Java?不同版本的?Switch語句

    本文主要介紹了Java不同版本的Switch語句,自Java13以來,Switch表達式就被添加到Java核心庫中,下面我們將介紹舊的Java?Switch語句和新的Switch語句的區(qū)別,需要的朋友可以參考一下
    2022-06-06
  • Java中Swing類實例講解

    Java中Swing類實例講解

    這篇文章主要介紹了Java中Swing類實例講解,文中用代碼實例講解的很清楚,有需要的同學(xué)可以研究下
    2021-02-02
  • 解決RedisTemplate的key默認序列化器的問題

    解決RedisTemplate的key默認序列化器的問題

    這篇文章主要介紹了解決RedisTemplate的key默認序列化器的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Mybatis使用typeHandler加密的實現(xiàn)

    Mybatis使用typeHandler加密的實現(xiàn)

    本文詳細介紹了如何在Mybatis中使用typeHandler對特定字段進行加密處理,涵蓋了從引入依賴、配置Mybatis,到實現(xiàn)typeHandler繼承類和配置mapper層的詳細步驟,為需要在項目中實現(xiàn)字段加密的開發(fā)者提供了參考和借鑒
    2024-09-09
  • Java 實戰(zhàn)項目錘煉之在線購書商城系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)項目錘煉之在線購書商城系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+mysql+servlet+ajax實現(xiàn)一個在線購書商城系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 詳解MyBatisPlus如何實現(xiàn)分頁和查詢操作

    詳解MyBatisPlus如何實現(xiàn)分頁和查詢操作

    這篇文章主要為大家詳細介紹了MyBatisPlus是如何實現(xiàn)分頁和查詢操作的,文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • Spring Boot整合Redis的完整步驟

    Spring Boot整合Redis的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合Redis的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java實現(xiàn)二分查找算法實例分析

    Java實現(xiàn)二分查找算法實例分析

    這篇文章主要介紹了Java實現(xiàn)二分查找算法,實例分析了二分查找算法的原理與相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Spring MVC 處理一個請求的流程

    Spring MVC 處理一個請求的流程

    Spring MVC是Spring系列框架中使用頻率最高的部分。不管是Spring Boot還是傳統(tǒng)的Spring項目,只要是Web項目都會使用到Spring MVC部分。因此程序員一定要熟練掌握MVC部分。本篇博客簡要分析Spring MVC處理一個請求的流程。
    2021-02-02

最新評論