从之前的文章我们体会到,不同的类加载器对于类和路径的加载方式是有所不同的,并且各自负责各自的区块,使得逻辑更加的明确,但是这相互的协调工作,如果我们没有一定的方法,就会造成一定的问题,于是就有了双亲委派机制,能够让这些类加载器各司其职,互不干扰。
首先我们可以来看看双亲委派机制的原理框图
然后我来解释一下这张图,
- 在类被加载的时候,是自底向上去执行的,考量是否以前被加载过,如果加载过,直接返回,反之就进行第二步。
- 如果没有加载过,就交给AppClassLoader,也就是Custom ClassLoader的父类,看看AppClassLoader有没有加载过。
- 循环一直到Bootstrap ClassLoader,如果都没有加载过,就会自顶向下,去加载类。
- 首先来到的是rt.jar或者看看是否是自己导入进来的jar包,去加载一下
- 如果没有,就会依次按照所给路径,按照Bootstrap ClassLoader->ExtClassLoader->AppClassLoader->CustomClassLoader去负责寻找他们对应所管辖的加载类的路径去负责加载对应的类文件。
- 需要注意的是,类加载器本身都是用同步锁包裹着的,防止多线程同步加载类。
从逻辑上讲,是很有意思的,可以看看源代码: