首页 > 编程语言 >Java(5)-双亲委派机制

Java(5)-双亲委派机制

时间:2024-05-04 13:44:20浏览次数:19  
标签:委派 缓存 Java 双亲 机制 加载

如何理解双亲委派机制

双亲委派机制是Java中类加载器加载类的一种方法,可以想象一个大家庭中的孩子想要一本书来阅读:
在这个家庭中,孩子会先向他的父亲(子类加载器)要这本书,如果没有这本书,他的父亲就会去向孩子的祖父(父类加载器)要这本书。这个过程会一直持续,直到到达家族中的最高辈分,通常是引导类加载器(Bootstrap ClassLoader)
如果在这一连串的查询中,任何一个家长找到了这本书,他就会将书传给请求的孩子。这样做的好处是,确保了所有人都在使用同一版本的书籍,避免了可能出现的混乱或不一致。
如果整个家族中没有人有这本书,那么最初被问到的父亲(子类加载器)可能会决定去书店(文件系统或其他来源)买一本。一旦买到书,他会按照同样的路径,把书传递回去给孩子。
这种机制确保了Java环境中类的加载是有序的,可以避免类的重复加载,并且有助于保持安全和整洁的代码环境。它也帮助系统维护者更好地控制类的版本和提供统一的行为
我们再用比较书面的表达重新理解双亲委派机制的流程:
1. 缓存查找:当一个类加载请求发生时,类加载器首先检查其内部缓存,看是否已经加载过请求的类。如果找到了,就直接返回该类,不再进行任何加载。
2. 双亲委派:如果在自己的缓存中没有找到该类,类加载器会遵循双亲委派模型,请求其父类加载器进行加载。这个过程会一直向上递归,直至最顶层的类加载器(通常是引导类加载器)。[类加载序列:自定义类加载器 -> 应用程序类加载器 -> 扩展类加载器 -> 启动类加载器]
3. 自行加载:如果所有的父类加载器都不能加载该类(即它们的缓存中也没有这个类,并且它们尝试从自己的资源中加载失败),控制权最终会回到发起请求的类加载器。这时,如果该类加载器有权从文件系统或其他资源中加载类,它将尝试自行加载这个类。
4. 缓存结果:无论类是由哪个类加载器加载的,一旦加载成功,该类的定义会被存储在相应加载器的缓存中,以便未来可以快速访问。

双亲委派机制用了什么设计模式

GPT告诉我的,可能有误。
双亲委派机制在Java的类加载器中使用了代理模式(Proxy Pattern)。这种模式涉及到使用一个代理对象来控制对另一个对象的访问。在双亲委派模型中,每个类加载器(子类加载器)在尝试加载类时,首先会代理请求给其父类加载器,这种代理继续向上直至达到最顶层的类加载器,通常是引导类加载器。
这种设计允许系统保持类加载的顺序和层次,同时确保每个类只被加载一次,防止重复加载同一个类。通过这种代理方式,Java的类加载机制能够提供一个更加安全和可控的环境,因为最上层的类加载器控制了所有下层加载器的加载行为,保证了系统类的优先加载和应用类的隔离。这样不仅有利于安全性,也有助于避免类的版本冲突。

为什么要用双亲委派模型

  1. 避免类的重复加载: 通过委派给⽗类加载器加载类,可以确保同⼀个类不会被多个类加载器重复加载。这有助于节省内存资源,并确保类之间的互操作性。
  2. 保护Java核心类库:由于双亲委派机制的存在,用户自定义的类加载器无法直接加载java核心类库,有助于保护核心类库的安全性,防止恶意代码篡改或者破坏。
  3. 维护类加载器的层次结构:双亲委派模式使得各级类加载器可以按照⼀定的层次结构来组织和管理。这有助于降低类加载器的复杂性,简化类加载过程。

双亲委派机制的缺点

  1. 类版本冲突:当不同的库或框架需要不同版本的同一个类时,双亲委派模型可能会导致问题。由于类加载器首先会尝试从父加载器那里加载类,因此可能最终使用的是一个不符合当前需要的版本。这在大型应用或多模块应用中尤其成问题,可能需要精细地管理类路径和加载器的结构。
  2. 加载器行为的僵化:双亲委派模型在设计上是僵化的,因为它强制要求所有的加载请求必须遵循固定的父到子的顺序。这限制了更灵活的加载策略,比如动态加载或热替换类,这些策略在某些应用开发中可能非常有用。
  3. 调试和故障排查难度增加:当类加载问题发生时,由于类加载过程涉及多个加载器和可能的递归委派,这使得调试和故障排查变得更加复杂。开发者需要清晰地理解各个加载器的层级和作用,才能有效地定位和解决问题。
  4. 灵活性降低:在某些情况下,开发者可能需要绕过标准的类加载机制来满足特定的需求,如在运行时动态地替换或修改类的行为。由于双亲委派模型的严格性,这些需求可能难以实现,或者需要采用更复杂的解决方案。
  5. 影响插件化架构:在插件化的应用框架中,双亲委派模型可能会阻碍插件之间的类隔离。例如,如果两个插件依赖于不同版本的同一个库,标准的双亲委派模型可能不足以解决这种隔离需求,需要额外的技术手段来处理。

如何打破双亲委派模型

类的加载方式默认都是双亲委派。
如果我们有一个类想通过自定义的类加载器来加载,而不是通过系统默认的类加载器,就需要打破双亲委派机制。
双亲委派的机制是ClassLoader中的loadClass方法实现的,打破双亲委派,其实就是重写这个方法,来用我们自己的方式来实现即可。
面试必备:什么时候要打破双亲委派机制?什么是双亲委派? (图解+秒懂+史上最全) - 疯狂创客圈 - 博客园

标签:委派,缓存,Java,双亲,机制,加载
From: https://www.cnblogs.com/marigo/p/18172233

相关文章

  • java exception and finally return
    exceptioncategorythrowableallbelongstothrowableerrorStackOverFlowOutOfMemoryruntimeexceptionArrayIndexOutOfBoundsExceptionNullPointerExceptioncheckecexception(needtocatchorthrows)catch最好设置一个兜底的匹配原则匹配的原则是:如果抛出的异......
  • java: 无效的目标发行版: 17 , 解决方案
    问题描述解决方案......
  • JavaScript--元素偏移量(offset)
    一、offset是什么 1、offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态得到元素的位置(偏移)、大小(元素内容+padding+border);2、获得元素距离带有定位父元素的位置;3、注意:返回的数据都不带单位; offset系列常用属性:element.offsetHeight返回任何一个元素的高......
  • JAVA-Agent探针打印方法执行的返回值
     1、创建一个maven项目,不要用springboot的 引入依赖<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependenc......
  • day30-JavaScript(2)
    1、BOM对象BOM:Broswerobjectmodel,即浏览器提供我们开发者在javascript用于操作浏览器的对象。1.1、window对象窗口方法//BOMBrowserobjectmodel浏览器对象模型//js中最大的一个对象.整个浏览器窗口出现的所有东西都是window对象的内容.console.log(window);......
  • 新人小白第一天学Java
    我对计算机知识学习是比较感兴趣的,但是说实在话计算机语言学习我还是第一次接触,也是0基础学习。虽然不知道会学成什么样子,但我会不断坚持的去学习,希望会收到好的效果。我从事文员的这个工作岗位已经十多年了,虽然平时对计算机办公软件的使用和一般维护有所应用,但对于在计算机语言方......
  • typescript仅仅是为了给javascript增加类型而对java的一个仿制吗
    如果是这样,我不直接学习java或者c#就好了吗?(不考虑前端编程这个因素)或者换句话说,typescript跟java在语法语义有什么不同吗?能给编程带来什么帮助吗?带着这个疑问,翻了一下现有的资料,找到typescript官网的一段解释,觉得有点意思,翻出来,供大家参考。https://www.typescriptlang.org/doc......
  • Java(4)-十大排序算法
    更好的总结:RUNOOB.COM十大经典排序算法冒泡排序冒泡排序的基本思想是比较数组中相邻的两个元素,根据比较结果交换它们的位置,让较大的元素排到数组末尾。遍历过程:首轮遍历:从数组的第一个元素开始,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置,从而第一遍遍......
  • Java线程池核心线程用尽后为何优先排队而不是继续创建线程直至最大线程数?
    前阵子在v2ex上看到这篇帖子讨论这个问题,有意思的是这个如此基础的问题在Javaer的世界里并没有广泛的共识,下面的回答也是七嘴八舌的,刚好在《JavaPerformace》上看到对这个问题的解释,尝试总结一下。原因书中对线程池的解释基于以下几点前提:如果CPU已经跑满,增加线程并不能提高......
  • 一份透心凉的北森java冷面(面经)
    1.对于分布式的理解2.几台机器合作怎么保证高可用3.es打了几个节点4.为什么es快5.es的build和body的区别6.es想进行时间范围搜索,用到什么命令和接口7.es的索引有哪些8.redis为什么搜索快9.在什么地方使用了redis10.将数据直接放到本地内存里更快,为什么用redis11.分布式......