双亲委托机制

1. 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。

每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

2.  当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.

3.  当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

 

双亲委托机制_第1张图片

那么问题来了,jvm是怎么判断类是否被重复加载呢?

 

JVM除了比较类是否相等还要比较加载这两个类的类加载器是否相等,只有同时满足条件,两个类才能被认定是相等的。

 

另外,双亲委托机制为什么采用三层结构加载类呢,这样做的好处是什么呢?

实际上,三层类加载器代表了JVM对于待加载类的三个信任层次,当需要加载一个全限定名为java.lang.Object的类时,JVM会首先信任顶层的引导类加载器,即优先用这个加载器尝试加载,如果不行,JVM会选择继续信任第二层的拓展类加载器,往下,如果三层都无法加载,JVM才会选择信任开发者自己定义的加载器。这种”父类“优先的加载次序有效的防止了恶意代码的加载。

 

作用:每一个类都只会被加载一次,避免了重复加载每一个类都会被尽可能的加载,维护Java类加载的安全(从引导类加载器往下,每个加载器都可能会根据优先次序尝试加载它)有效避免了某些恶意类的加载(比如自定义了Java.lang.Object类,一般而言在双亲委托机制下会加载系统的Object类而不是用户自定义的Object类)。

 

父加载器中加载的类对于所有子加载器可见

 

子类之间各自加载的类对于各自是不可间的(达到隔离效果)

你可能感兴趣的:(双亲委托机制)