高频面试题请把Java的双亲委派机制说清楚
如果面试官问你,类加载过程是哪几步?
巴拉巴拉巴拉...(加载、验证、准备、解析、初始化)
见这小伙子面容惊奇,脸泛红光,不由自主地就问了一下双亲委派模型说一下吧;遇见没有准备充分的,瞬间懵逼。
下面我们就来说一下这个一个有意思的虚拟机类加载机制。
一说起双亲委派,就必然要先聊一下Java中的类加载器。Java中的类加载器Bootstrap ClassLoader (启动类加载器)
Bootstrap ClassLoader,启动类加载,默认加载的是jdklib目录下jar中诸多类;
这个路径可以使用 -Xbootclasspath参数指定。Extension ClassLoader (扩展类加载器)
Extension ClassLoader,扩展类加载器,默认加载jdklibext目录下jar中诸多类;
这个路径可以使用 java.ext.dirs系统变量来更改。Application ClassLoader (应用程序类加载器)
Application ClassLoader,应用程序类加载器,负责加载开发人员所编写的诸多类。User ClassLoader (自定义类加载器)
自定义类加载器,当存在上述类加载器解决不了的特殊情况,或存在特殊要求时,可以自行实现类加载逻辑。
关系如图所示:
双亲委派模型是什么?
说完了类加载器,下面我们就说一下什么是双亲委派模型吧。
其是在JDK1.2期间被引入的,而后陆续被推荐给开发者,到目前已经成为了最常用的类加载器实现方式了。
双亲委派整个过程分为以下几步:假设用户刚刚摸鱼写的Test类想进行加载,这个时候首先会发送给应用程序类加载器AppCloassLoader;然后AppClassLoader并不会直接去加载Test类,而是会委派于父类加载器完成此操作,也就是ExtClassLoader;ExtClassLoader同样也不会直接去加载Test类,而是会继续委派于父类加载器完成,也就是BootstrapClassLoader;BootstrapClassLoader这个时候已经到顶层了,没有父类加载器了,所以BootstrapClassLoader会在jdk/lib目录下去搜索是否存在,因为这里是用户自己写的Test类,是不会存在于jdk下的,所以这个时候会给子类加载器一个反馈。ExtClassLoader收到父类加载器发送的反馈,知道了父类加载器并没有找到对应的类,爸爸靠不住,就只能自己来加载了,结果显而易见,自己也不行,没办法,只能给更下面的子类加载器了。AppClassLoader收到父类加载器的反馈,顿时明白,原来爸爸虽然是爸爸,但是他终究不能管儿子的私事,所以这时候,AppClassLoader就自己尝试去加载。结果,就这样成功了,走了一大圈,兜兜转转还是自己干。
这个并没有那么复杂,我就不画图了哈,大家如果想看图,可以去网上再搜一下,我记得有个大佬画得就很形象。为什么要使用双亲委派模型?
使用双亲委派模型,有一个很大的好处,就是避免原始类被覆盖的问题。
比如,用户编写了一个Object类,放入程序中加载。
当没有双亲委派机制时,就会出现重复的Object类,会给开发人员造成很大的困扰,本来就只需要基于JDK开发就好了,现在还得把JDK中的类全记住,避免编写重复的类。
当存在双亲委派机制时呢,整个事情就不一样了,每次加载类时,都会遵循双亲委派机制,去问父类是否可以加载,如果可以呢,那就不需要再次加载了,这样事情就变得简单了。(老子走的路,小子不能走 》.《)如何打破双亲委派模型?
这个问题,其实就算是双亲委派模型中最深入的问题了,最起码中高级工程师面试,问到这也就下个话题了。
这里我也简单说一下吧,最常见的也是人们常说的有两种,分别是:在自定义类加载器中,重写loadClass方法。
为什么呢?因为如果你去看ClassLoader类的源码时,你会发现,双亲委派的核心代码就是在这个方法中的;试想,你如果重写了这个方法,自然而然地就打破了双亲委派机制了。
使用线程上下文类加载器
因为双亲委派机制不能支持SPI(Service Provider Interface), 所以才会引入线程上下文类加载器,有了它,就可以打通双亲委派模型的层次结构来反向使用类加载器来完成类加载。
这个目前也是没有办法的事,涉及到SPI的目前都在使用这种方式来完成类加载,其中就包括常用到的JNDI、JDBC、JAXB等。
这里其实还有一个可以打破双亲委派模型的情况,那就是OSGI,这个解释是在《深入理解 Java虚拟机》这本书中,可能是这本书的作者本身就对OSGI比较熟悉,而且看简介还出过一本OSGI的书。
在很多应用环境中,OSGI被当做模块化热部署实现的关键,所以,这样就说明了,OSGI一定会对类加载过程做相应的一些措施。
因为这个并不常碰到,还是大家自行去查看吧,我就不在这赘述了。
绿厂员工怒喷华为和鸿蒙操作系统最终无奈离职是为哪般?近段时间,随着华为自主研发的国产鸿蒙操作系统逐渐落地,各种有关鸿蒙的话题常常成为舆论中心。由于鸿蒙OS是国内第一款有望成为大规模商用的移动操作系统,许多热心网友希望这款操作系统能够
多杆合一优化城市空间,精细化城市管理有相关统计显示,目前全国范围内分布着数千万级的社会杆塔资源。这些杆塔种类繁杂功能单一数据孤岛现象严重,且因管理部门分散需求不同,重复开挖重复投资造成的浪费资源现象频出,亟需对城市道
新基建下智慧城市的改变和机遇近年来,智慧城市建设在全球范围内方兴未艾。在智慧城市的建设大潮中,中国的成绩格外耀眼。就在前不久,2020年世界智慧城市大奖(WSCA)正式公布获奖名单,上海荣膺世界智慧城市大奖,
备货三十万销量一万,炒作而已出自某个自媒体,具体来源不详。可信度不知,不过国产也就小米华为有万元机,本来以为是一加,一加销量确实不行,听说首发备了50万,不过价格差太多了。华为小米销量也都超过。不过大部分人都
为了子孙后代,请善待华为把善待说在开头,是希望大家不要谩骂华为即可!买不买产品都无所谓,理解万岁!理解什么呢?理解华为的生死和我们有啥关系!包括过去的我们,现在的我们,以及未来的孩子们!一过去华为成立在8
三星新平板,tabS8?三星的调研泄漏了下一代的平板,会是S8系列吗?配置图图中能看出大致配置,归纳如下中杯,大杯还是和s7一样的全面屏设计,超大杯采用了前置双摄,有了一个刘海,具体用途还不知(不好看)配
田梓枫5。30比特币以太坊再次经历黑色周末5月29日晚,新华社发布题为百倍杠杆!疯狂的币圈带来暴富还是爆仓?的文章,再次对虚拟货币表示关注。这是新华社在两天内第3次发问虚拟货币。文章表示,让众多投资者一夜之间账面清零的背后
5G泡沫严重,5G用户数竟然比5G手机累计销量多近1。5亿三大运营商都公布了截至4月份的数据,数据显示它们的5G用户数合计已达到4。2亿,然而根据信通院公布的中国市场累计5G手机销量却只有2。7亿台左右,这意味着其中有1。5亿或35。7的
还在纠结买哪款5G手机?不妨看看这三款旗舰,配置高又好用1小米11Ultra很多人了解小米11Ultra都会感到眼前一亮,被看作是当下辨识度最高的旗舰机。不妨先看看其外观,小米11Ultra选择的是6。81英寸的2KAMOLED的E4屏
高通888猛降K40Pro和realmeGT都是2499?今年都在跟风说高通888处理器功耗翻车了,但其实拿到的用户都觉得还好,压根没有网上说的那么恐怖,但即便是这样上半年的高通888手机的价格都高居不下,不过现在刚好卡在618这个节点,
进一步实锤用上120Hz屏?苹果13屏幕素质将有所升级安卓手机都用上高刷屏好久了,今年不仅旗舰都大部分普及,连中端入门机型用上高刷屏也屡见不见。对于这个更流畅的特性,前期苹果似乎不以为然,前代iPhone12系统遗憾鸽了高刷屏之后,下