聊一聊双亲委派模式

news2024/12/1 0:37:57

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

说起双亲委派模型,不得不说一下类加载器。

类加载器是什么?

当我们编译Java类时,JVM会创建与平台和机器无关的字节码。字节码存储在.class文件中。当我们尝试使用一个类时,类加载器就会把它加载到内存中,然后把字节码文件转成Class对象。通俗的说类加载器就是将.class文件转成Class对象的。

类加载器分类

  1. 启动类加载器(Bootstrap Class Loader):负责加载存放在
    <JAVA_HOME>\lib目录下的类,或者被-Xbootclasspath参数所指定的路径中存放的类。比如:rt.jarjava.lang.*包下的类。

  2. 扩展类加载器(Extension Class Loader):负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所指定的路径中所有的类库。

  3. 应用程序类加载器(Application Class Loader):负责加载用户类路径上所有的类库。

双亲委派模型工作流程

当类加载器收到加载类的请求时,它首先会把请求委派给父加载器去完成,每一层都如此,直到把请求委派给最顶层的启动类加载器,只有当父加载器无法加载委派过来的类时,子加载器才会加载。

JVM在加载⼀个类时,会调⽤AppClassLoader的loadClass⽅法来加载这个类,不过在这个⽅法中,会先使⽤ExtClassLoader的loadClass⽅法来加载类,同样ExtClassLoader的loadClass⽅法中会先使⽤BootstrapClassLoader来加载类,如果BootstrapClassLoader加载到了就直接成功,如果
BootstrapClassLoader没有加载到,那么ExtClassLoader就会⾃⼰尝试加载该类,如果没有加载到,那么则会由AppClassLoader来加载这个类。

双亲委派模型

所以,双亲委派指得是,JVM在加载类时,会委派给ExtClassLoader和BootstrapClassLoader进⾏加载,如果没加载到才由⾃⼰进⾏加载。

这里说的双亲并不是说类加载器之间是以继承方式实现的,而是以组合的方式实现的,通过源码可以证实这点:

java.lang.ClassLoader#loadClass

private final ClassLoader parent;

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

同时,通过源码我们也可以看到类加载器的加载流程是跟我们描述的一样的:先检查请求加载的类型是否已经被加载过,若没有则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。假如父类加载器加载失败,抛出ClassNotFoundException异常的话,才调用自己的findClass()方法尝试进行加载。

双亲委派模型好处

  • 保证唯一性,避免重复加载:类的加载随着它的类加载器一起具备了层级关系,通过这种层级关系避免了重复加载,父类加载器加载了该类,子加载器就无需加载了。

  • 避免核心类被篡改:核心类由启动类加载器加载,即使用户自定义同名核心类也不会被加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro174版本新功能介绍之移动画布不闪屏设置

Allegro174版本新功能介绍之移动画布不闪屏设置 Allegro在升级到174版本后,在移动画布的时候,视图数据量比较大的情况,会出现闪屏现象 Allegro在切换到Open GL模式下,这个现象会有所缓解,具体操作如下 选择Setup选择User-preferences

【Ansible】ansible 基础知识

ansible 文章目录ansible一、ansible Ad-Hoc 命令1.命令格式2.模块类型3.联机帮助4.常用模块4.1 command & shell 模块4.2 script 模块4.3 copy 模块4.4 yum_repository4.5 yum 模块4.6 systemd 模块4.7 group 模块4.8 user 模块4.9 file 模块4.10 cron 模块4.11 template …

SIE高级副总裁:关于PS VR2定价、设计、内容的思考

2023年2月22日&#xff0c;索尼将正式推出次世代头显PS VR2&#xff0c;首发VR游戏将超过30款&#xff0c;其中包括热门游戏《GT赛车7 VR》。此外&#xff0c;PS5全球销量也已突破3000万。实际上距离索尼推出上一代PS VR&#xff0c;已经过去了6年时间&#xff0c;相比于Quest等…

M12269 支持PD3.1等快充协议、140W升降压3-8节多串锂电充放电移动电源管理IC

引言 在快充技术持续迭代升级的过程中&#xff0c;充电从小功率向中大功率的转变是最为明显的。支持的快充功率从最初的7.5W&#xff0c;已经向最高240W迈进。PD3.1协议的推出&#xff0c;进一步助力快充加速走向中大功率。新增三种固定电压档&#xff1a;28V&#xff08;100-1…

VS1053 MP3模块介绍

VS1053MP3模块简介ATK-VS1053 MP3 MODULE是ALIENTEK推出的一款高性能音频编解码模块&#xff0c;该模块采用VS1053B作为主芯片&#xff0c;支持&#xff1a;MP3/WMA/OGG/WAV/FLAC/MIDI/AAC等音频格式的解码&#xff0c;并支持&#xff1a;OGG/WAV音频格式的录音&#xff0c;支持…

Mask RCNN网络源码解读(Ⅱ) --- ResNet、ResNeXt网络结构、BN及迁移学习

目录 1.ResNet简介 2.residual结构和ResNet-34详解 2.1 residual结构 2.2 Batch Normalization 3.迁移学习 4.ResNeXt网络结构 1.ResNet简介 ResNet在2015年由微软实验室提出&#xff0c;斩获当年lmageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得coco数据…

信道模型:Rayleigh、Rician、卫星→地面

这里写目录标题比较C. Loo模型&#xff1a;直射阴影&#xff0c;多径不阴影Corazza模型&#xff1a;直射和多径都阴影Lutz模型&#xff1a;好坏2个状态Rayleigh and Rician 信道生成Shadowed-Rician 直射径 散射径[Secure Transmission in Cognitive Satellite Terrestrial Net…

Redis的String类型,原来这么占内存

Redis的String类型&#xff0c;原来这么占内存 存一个 Long 类型这么占内存&#xff0c;Redis 的内存开销都花在哪儿了&#xff1f; 1、场景介绍 假设现在我们要开发一个图片存储系统&#xff0c;要求这个系统能够根据图片 ID 快速查找到图片存储对象 ID。图片 ID 和图片存储对…

【Flink基础】-- 源码中的注解

1.Flink自定义注解级别在升级 Flink版本至 1.15.3时&#xff0c;偶然遇到了一个异常&#xff0c;然后就准备详细了解下源码中的注解。设计注解的初衷&#xff1a;为了更好地进行代码和版本管理&#xff0c;Flink使用了Java的注解特性自定义了注解&#xff0c;对代码进行增强说明…

Kubernetes安全扫描之kubescape

一 背景 Kubescape 是第一个用于测试 Kubernetes 是否按照 NSA 和 CISA 的 Kubernetes 强化指南中定义的安全部署的工具 使用 Kubescape 测试集群或扫描单个 YAML 文件并将其集成到您的流程中。 二 特性 功能&#xff1a;提供多云 K8s 集群检测&#xff0c;包括风险分析、安…

stack 中缀表达式求值

【解法一】双栈思路梳理 【解法二】利用逆波兰表达式求解&#xff08;中缀转后缀&#xff09; 这个有俩种方法&#xff0c;一是直接根据条件进行各种情况的推导直接由中缀表达式求解&#xff0c; 二就是将中缀表达式转化为后缀表达式&#xff0c;利用更容易的逆波兰表达式求解…

分享微信小程序开发详细步骤

1、梳理小程序开发功能需求自己可以用思维导图写出自己想要开发的小程序里面&#xff0c;需要设置哪些功能&#xff0c;这些功能帮助我解决什么问题。然后把想法用文字形式在思维导图中写出来。如果不知道如果梳理&#xff0c;也可以找专业的产品经理协助处理。如果不知道功能可…

Vector - VT System - CANCANFDLIN板卡_VT6104|6204

对于做车载开发或者测试的朋友来说&#xff0c;大部分对于CANoe&#xff08;VN1600系列&#xff09;是相当的熟悉&#xff0c;我们知道CANoe支持CAN&CANFD&LIN&#xff0c;都有对应的硬件来匹配&#xff1b;但是如果需要做台架测试&#xff0c;VN1600系列的硬件放在架子…

读书笔记:来自一个外企优秀销售的业务心法和秘籍(中)

01 普通销售能达到的三种境界第一 投其所好 &#xff08;110&#xff09;销售把自己的资源1奉献出去&#xff0c;控制不了对方的回报&#xff0c;新人都处在这个阶段。第二 互利互惠 &#xff08;1&#xff0b;1&#xff1d;1&#xff09;大家互相贡献自己的一部分&#xff0c;…

满足你一切需求的 MMYOLO/MMDet 可视化 (一)

可视化在深度学习时代算是核心需求&#xff0c;借助可视化功能&#xff0c;研究者可以快速定位分析模型以及排查问题。在 OpenMMLab 2.0 时代&#xff0c;MMEngine 对常用的可视化需求进行了设计和实现&#xff0c;其具备如下功能&#xff1a; 提供丰富的开箱即用可视化功能&a…

TP6队列与延时队列

安装在此我就不再略过TP6的项目创建过程了&#xff0c;大致就是安装composer工具&#xff0c;安装成功以后&#xff0c;再使用composer去创建项目即可。think-queue 安装composer require topthink/think-queue项目中添加驱动配置我们需要在安装好的config下找到 queue.php<…

Solon v1.12.1 发布,已累计 10000+ 次提交

一个更现代感的 Java 应用开发框架&#xff1a;更快、更小、更自由。没有 Spring&#xff0c;没有 Servlet&#xff0c;没有 JavaEE&#xff1b;独立的轻量生态。主框架仅 0.1 MB。 Controller public class App {public static void main(String[] args) {Solon.start(App.cl…

leetcode刷题精讲————17.电话号码的字母组合

力扣https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ 这道题要用到多叉树遍历、回溯、递归、排列组合等相关知识&#xff0c;算是比较经典的例题了&#xff0c;掌握它的核心思想就可以解决这一大类问题。 首先&#xff0c;2~9的数字对应不同…

JS 安全策略 101

依赖审计 依赖审计其实就是利用 npm 或是 yarn 自带的一个 audit 命令检测 node_module 里存在的一些具有安全隐患的依赖项。我习惯用yarn audit, 所以给大家放了张自己博客的 yarn 审计结果。这里显示&#xff1a;一个叫 trim 的包太老了&#xff0c;有很高的安全风险。 有风…

【数据结构初阶】5. 栈和队列

栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。**进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。**栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则…