java 双亲委派机制

1、类加载器的种类

  • BootstrapClassLoader:启动类类加载器,由c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作,通常表示为null ,并且没有父null。它用来加载<JAVA_HOME>/jre/lib路径,-Xbootclasspath参数指定的路径以<JAVA_HOME>/jre/classes中的类。
  • ExtClassLoader:拓展类类加载器,加载扩展库,如classpath中的jre ,javax.*或者java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。它用来加载<JAVA_HOME>/jre/lib/ext路径以及java.ext.dirs系统变量指定的类路径下的类。
  • AppClassLoader:应用程序类类加载器,加载程序所在的目录,如user.dir所在的位置的class。它主要加载应用程序ClassPath下的类(包含jar包中的类)。它是java应用程序默认的类加载器。
  • 用户自定义类加载器:用户根据自定义需求,可加载指定路径的class文件。自由的定制加载的逻辑,继承AppClassLoader,仅仅覆盖findClass()即将继续遵守双亲委派模型。
  • *ThreadContextClassLoader:线程上下文加载器,它不是一个新的类型,更像一个类加载器的角色,ThreadContextClassLoader可以是上述类加载器的任意一种,但往往是AppClassLoader,作用我们后面再说。

2、双亲委派机制

当一个类需要被加载的时候, 首先不会直接从我们的自定义类加载器加载, 他会首先被应用程序类加载器加载, 应用程序类加载器判断它是否加载过这个类, 如果加载过,就不加载了, 否则的话就询问扩展类加载器是否加载过,一直重复此操作,直到询问到系统类加载器,如果都没有加载过, 就依次下沉加载此类。如果都不能加载此类就会抛出异常 ClassNotFoundException。

总结一下就是: 当一个类加载器受到加载类的请求之后, 它不会主动去加载这个类, 而是会向上询问更父类加载器能不能加载, 每一个层次的类加载器都是如此, 只有当父类加载器反馈自己不能加载这个类的时候,它才会去尝试自己完成加载!

3、双亲委派的好处是什么?

防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。也就是说,双亲委派模型能保证基础类仅加载一次,不会让jvm中存在重名的类。比如String.class,每次加载都委托给父加载器,最终都是BootstrapClassLoader,都保证java核心类都是BootstrapClassLoader加载的,保证了java的安全与稳定性。

参考链接1:jvm 探究之 双亲委派机制详解,双亲委派能干什么。_双亲委外派都能干什么-CSDN博客

参考链接2:好怕怕的类加载器 - 知乎


 

本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!

创作不易,如果对你有点帮助的话麻烦点个赞支持一下!

新手小白,欢迎留言指正!

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值