Java双亲委派模型

介绍

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。一般使用组合(Copmposition)关系来服用父类加载的代


1.png

工作过程

如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的加载请求最终都应该传到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成加载请求时,子加载器才会尝试自己去加载。

源码分析

protected Class<?> loadClass(String name, boolean resolve)
       throws ClassNotFoundException
   {
       synchronized (getClassLoadingLock(name)) {
           
           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) {
                   
                   
               }

               if (c == null) {
                   
                   // 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;
       }
   }

双亲委派模型对于保证Java进程的稳定运作很重要,但它的实现却非常简单,源代码都集中在java.lang.ClassLoader的loadClass()方法中,逻辑清晰易懂:先检查是否已经被加载过,若没有加载则调用父加载器的loadClass方法,若父加载器为空则默认使用启动类加载作为父加载器。如果父类加载失败,抛出ClassNotFoundException异常后,在调用自己的findzClass()方法进行加载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。