双亲委派模型

简介: 双亲委派模型

双亲委派模型

在介绍双亲委派模型前,我们需要引入类加载器的概念

绝大部分Java程序都会使用到以下3种系统提供的类加载器:

  • 启动类加载器(Bootstrap ClassLoader)  :JDK中的常用类大都由启动类加载器加载,如java.lang.String、java.util.List等。需要特别说明的是,启动类Main class也由启动类加载器加载。
  • 扩展类加载器(Extension ClassLoader):位于rt.jar中,其被用于JavaFX的开发之中。
  • 应用程序类加载器(Application ClassLoader): 启动类Main class、其他如工程中编写的类、maven引用的类,都会被放置在类路径下。Main class由启动类加载器加载,其他类由应用程序类加载器加载。

但是,JVM建议用户将应用程序类加载器作为自定义类加载器的父类加载器。则类加载的双亲委派模型如图:

image.png

定义

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。

双亲委派模型的工作过程是:

  • 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
  • 每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。
  • 只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。

比如:现在自定义类中有一个String类,它不会从自身类中寻找String类(即使自身有自己实现的String类),而是在其父类(Application ClassLoader)寻找,如果还没找到,那么找其父类的父类(Extension ClassLoader),再没找到的话就找(Bootstrap ClassLoader),如果最终还没找到,将抛出ClassNotFoundException异常。

作用

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。因此,使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处:类随着它的类加载器一起具备了一种带有优先级的层次关系。


相关文章
|
Python 容器
Matplotlib中的titles(标题)、labels(标签)和legends(图例)
本文讨论Python的Matplotlib绘图库中可用的不同标记选项。
392 0
基于51单片机的简单交通灯程序
基于51单片机的简单交通灯程序
223 2
|
Cloud Native Linux Go
开源哲学:自由、共享与合作
开源哲学:自由、共享与合作
241 0
开源哲学:自由、共享与合作
|
移动开发 算法
秒懂算法 | A*搜索
本篇内容包括了A*搜索算法的原理精解以及2个例题。
913 1
秒懂算法 | A*搜索
|
设计模式 SQL 开发框架
【Java设计模式 面向对象设计思想】六 再谈MVC贫血模式与DDD领域驱动开发
【Java设计模式 面向对象设计思想】六 再谈MVC贫血模式与DDD领域驱动开发
541 1
|
应用服务中间件 网络安全 nginx
docker--网络和特权模式
docker--网络和特权模式
|
存储 SQL 关系型数据库
海量物联网设备元数据存储引擎选型和演进
# 前言 之前参加DataFun社区举办的线上活动(2022.3.26 DataFunSummit大数据存储架构峰会),作为讲师分享了一站式物联网存储产品的架构设计的主题,本文是当天的演讲稿整理,在ATA上面也记录一下。感谢DataFun社区和整理编辑李瑶。 # 演讲内容 ## 导读 本文将结合一个常见的物联网场景分享其存储引擎架构和设计。通过对团队在过去一段时间承接的一些设备元数据案例进行总
1177 12
海量物联网设备元数据存储引擎选型和演进
|
存储 网络协议 算法
TFTP 协议(修订版 2)
TFTP 是一种用于传输文件的非常简单的协议。它的名字就是由此而来的,Trivial File Transfer Protocol 或 TFTP。每个非终端数据包都被单独确认。本文档描述了协议及其数据包类型。该文件还解释了一些设计决策背后的原因。
760 0
TFTP 协议(修订版 2)
|
小程序 JavaScript 前端开发
目前为止最全的微信小程序项目实例
目前为止最全的微信小程序项目实例
600 0
|
PyTorch 算法框架/工具 索引
Pytorch 常见运算(mul、mm、dot、mv)
Pytorch 常见运算(mul、mm、dot、mv)
604 0