面试官:什么是双亲委派模型

科技资讯 投稿 6800 0 评论

面试官:什么是双亲委派模型

1.类加载器

双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是:

    启动类加载器(Bootstrap ClassLoader)
  1. 扩展类加载器(Extension ClassLoader)
  2. 应用程序类加载器(Application ClassLoader)

这 3 个类加载器的作用如下。

1.1 启动类加载器

接下来我们写个代码测试一下 rt 类加载器的打印:

public class ClassLoaderExample {
    public static void main(String[] args {
        // rt 类下的 ClassLoader 打印
        System.out.println("rt classloader:" + String.class.getClassLoader(;
    }
}

以上程序的执行结果如下图所示:
问题来了,为什么打印的不是“Bootstrap ClassLoader”而是 null 呢?
这是因为启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,而这个 C++ 实现的类加载器在 Java 中是没有与之对应的类的,所以拿到的结果是 null。

1.2 扩展类加载器

接下来我们使用代码来演示一下 ext 类加载器,示例代码如下:

public class ClassLoaderExample {
    public static void main(String[] args {
        // ext 类下 classloader 打印
        System.out.println("ext classloader:" +
                sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader(;
    }
}

以上程序的执行结果如下图所示:

1.3 应用程序类加载器

public class ClassLoaderExample {
    public static void main(String[] args {
        System.out.println("application classloader:" +
                ClassLoaderExample.class.getClassLoader(;
    }
}

以上程序的执行结果如下图所示:

2.双亲委派模型

1、当加载一个类时,会先从应用程序类加载器的缓存里查找相应的类,如果能找到就返回对象,如果找不到就执行下面流程;

3、在启动类加载器中查询相应的类,如果找到就返回对象,如果找不到就继续下面流程;

5、在应用程序类加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就返回 ClassNotFound 异常。

一般“双亲”指的是“父亲”和“母亲”,而在这里“双亲”指的是类加载类先向上找,再向下找的流程就叫做双亲委派模型。

3.优缺点分析

3.1 优点

1、安全。
2、避免重复加载。

3.1.1 安全

3.1.2 避免重复加载

使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。

3.2 缺点

总结

双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如 JNDI 和 JDBC 不能通过这个规则进行加载,它需要通过打破双亲委派的模型的方式来加载。

https://gitee.com/mydb/interview

编程笔记 » 面试官:什么是双亲委派模型

赞同 (31) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽