成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試必問:什么是雙親委派模型?

開發 前端
雙親委派模型是和 Java 中多個類加載器(啟動類加載器、擴展加載器、應用程序類加載器)的運行規則,通過這個(雙親委派模型)規則可以避免類的非安全問題和類被重復加載的問題,但它也遇到了一些問題,比如 JNDI 和 JDBC 不能通過這個規則進行加載,它需要通過打破雙親委派的模型的方式來加載。

雙親委派模型是 Java 類加載器的一種工作模式,通過這種工作模式,Java 虛擬機將類文件加載到內存中,這樣就保證了 Java 程序能夠正常的運行起來。那么雙親委派模型究竟說的是啥呢?接下來我們一起來看。

1.類加載器

雙親委派模型針對的是 Java 虛擬機中三個類加載器的,這三個類加載器分別是:

  1. 啟動類加載器(Bootstrap ClassLoader)
  2. 擴展類加載器(Extension ClassLoader)
  3. 應用程序類加載器(Application ClassLoader)

如下圖所示:

圖片

這 3 個類加載器的作用如下。

1.1 啟動類加載器

啟動類加載器(Bootstrap ClassLoader)是由 C++ 實現的,它是用來加載 <JAVA_HOME>\jre\lib\rt.jar 和 resources.jar 等 jar 包的,如下圖所示:

圖片

接下來我們寫個代碼測試一下 rt 類加載器的打印:

public class ClassLoaderExample {
public static void main(String[] args) {
// rt 類下的 ClassLoader 打印
System.out.println("rt classloader:" + String.class.getClassLoader());
}
}

以上程序的執行結果如下圖所示:

圖片

問題來了,為什么打印的不是“Bootstrap ClassLoader”而是 null 呢?這是因為啟動類加載器(Bootstrap ClassLoader)是由 C++ 實現的,而這個 C++ 實現的類加載器在 Java 中是沒有與之對應的類的,所以拿到的結果是 null。

1.2 擴展類加載器

擴展類加載器是用來加載 <JAVA_HOME>\jre\lib\ext 目錄下 jar 包的,如下圖所示:

圖片

接下來我們使用代碼來演示一下 ext 類加載器,示例代碼如下:

public class ClassLoaderExample {
public static void main(String[] args) {
// ext 類下 classloader 打印
System.out.println("ext classloader:" +
sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());
}
}

以上程序的執行結果如下圖所示:

圖片

1.3 應用程序類加載器

應用程序類加載器是用來加載 classpath 也就是用戶的所有類的,接下來我們寫代碼測試一下應用程序類加載器的打印,實現代碼如下:

public class ClassLoaderExample {
public static void main(String[] args) {
System.out.println("application classloader:" +
ClassLoaderExample.class.getClassLoader());
}
}

以上程序的執行結果如下圖所示:

圖片

2.雙親委派模型

雙親委派模型的執行流程是這樣的:

1、當加載一個類時,會先從應用程序類加載器的緩存里查找相應的類,如果能找到就返回對象,如果找不到就執行下面流程;

2、在擴展加載器緩存中查找相應的類,如果能找到就返回對象,如果找不到就繼續下面流程;

3、在啟動類加載器中查詢相應的類,如果找到就返回對象,如果找不到就繼續下面流程;

4、在擴展加載器中查找并加載類,如果能找到就返回對象,并將對象加入到緩存中,如果找不到就繼續下面流程;

5、在應用程序類加載器中查找并加載類,如果能找到就返回對象,并將對象加入到緩存中,如果找不到就返回 ClassNotFound 異常。加載流程如下圖所示:

圖片

一般“雙親”指的是“父親”和“母親”,而在這里“雙親”指的是類加載類先向上找,再向下找的流程就叫做雙親委派模型。

3.優缺點分析

3.1 優點

雙親委派模型的優點有兩個:1、安全。2、避免重復加載。

3.1.1 安全

在安全方面的表現時,當使用雙親委派模型時,用戶就不能偽造一些不安全的系統類了,比如 jre 里面已經提供了 String 類在啟動類加載時加載,那么用戶自定義再自定義一個不安全的 String 類時,按照雙親委派模型就不會再加載用戶定義的那個不安全的 String 類了,這樣就可以避免非安全問題的發生了。

3.1.2 避免重復加載

使用雙親委派模型也可以避免一個類被重復加載,當一個類被加載之后,因為使用的雙親委派模型,這樣不會出現多個類加載器都將同一個類重復加載的情況了。

3.2 缺點

雙親委派模型的典型問題是加載 SPI 實現類的場景,比如 JNDI(Java Naming and Directory Interface,Java 命名與目錄接口)服務,它的代碼由啟動類加載器去加載(在 JDK 1.3 時放進 rt.jar),但 JNDI 的目的就是對資源進行集中管理和查找,它需要調用獨立廠商實現部部署在應用程序的 classpath 下的 JNDI 接口提供者(SPI, Service Provider Interface)的代碼,但啟動類加載器不可能“認識”之些代碼,這就雙親委派模型的問題,JDBC 也是同樣的問題。

總結

雙親委派模型是和 Java 中多個類加載器(啟動類加載器、擴展加載器、應用程序類加載器)的運行規則,通過這個(雙親委派模型)規則可以避免類的非安全問題和類被重復加載的問題,但它也遇到了一些問題,比如 JNDI 和 JDBC 不能通過這個規則進行加載,它需要通過打破雙親委派的模型的方式來加載。

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2023-12-06 12:11:43

類加載器雙親委派模型

2025-04-07 04:25:00

JDBCAPI加載器

2021-03-01 08:54:39

開發雙親委派

2023-08-04 08:53:42

2023-06-07 08:08:43

JVM內存模型

2021-12-27 08:22:18

Kafka消費模型

2023-02-15 07:03:41

跨域問題面試安全

2024-06-24 08:24:57

2024-07-05 09:31:37

2020-09-29 15:24:07

面試數據結構Hashmap

2023-02-17 08:02:45

@Autowired@Resource

2023-02-01 07:15:16

2021-01-06 09:51:19

類加載器雙親委派模型

2020-07-28 08:59:22

JavahreadLocal面試

2021-12-09 12:22:28

MyBatis流程面試

2021-05-12 16:27:55

Java雙親模型

2021-12-06 11:03:57

JVM性能調優

2024-03-27 09:15:27

2020-10-12 18:00:39

JavaAQS代碼

2022-01-05 09:55:26

asynawait前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕 在线观看 | 盗摄精品av一区二区三区 | 九九综合九九 | 午夜在线视频一区二区三区 | 欧美日韩国产精品 | 1000部精品久久久久久久久 | 韩国主播午夜大尺度福利 | 国产伦精品一区二区三区精品视频 | 久久极品| 欧美电影大全 | 三级成人在线观看 | 亚洲小说图片 | 精品视频一区二区三区在线观看 | 国产精品视频久久久 | 久久中文高清 | 国产精品一区二区三区四区 | 国产一区二区在线免费观看 | 精品视频在线免费观看 | 国产午夜在线 | 国产在线观看一区二区 | av片免费 | 国产精品综合色区在线观看 | 四虎永久免费黄色影片 | 成人在线一区二区 | 伊人网站在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产这里只有精品 | 偷拍第一页 | 最新中文字幕在线播放 | 视频在线一区二区 | 国产精品区二区三区日本 | www.久久国产精品 | 欧美日韩一区二区电影 | 欧美日韩黄| 国产精品久久国产愉拍 | 中文字幕久久精品 | 毛片大全| 狠狠躁夜夜躁人人爽天天高潮 | 成人乱人乱一区二区三区软件 | 黄色片网此 | 91亚洲国产成人久久精品网站 |