Java 面试题
目录

Java 中什么是双亲委派模型?

· 约 4 分钟读完 · 第 110 / 274 章

推荐答案

双亲委派模型(Parent Delegation Model)是 Java 类加载器(ClassLoader)的一种工作机制。它要求类加载器在加载类时,首先将加载请求委派给父类加载器去完成。只有当父类加载器无法完成加载请求时,子类加载器才会尝试自己加载类。

本题详细解读

1. 双亲委派模型的工作流程

双亲委派模型的工作流程如下:

  1. 委派给父类加载器:当一个类加载器收到加载类的请求时,它首先不会自己去加载这个类,而是将这个请求委派给父类加载器去完成。

  2. 父类加载器尝试加载:父类加载器会按照同样的逻辑,继续将请求委派给自己的父类加载器,直到达到顶层的启动类加载器(Bootstrap ClassLoader)。

  3. 启动类加载器尝试加载:如果启动类加载器无法加载该类(例如,该类不在其加载路径中),则请求会逐级向下传递,直到某个类加载器能够加载该类。

  4. 子类加载器加载:如果所有的父类加载器都无法加载该类,最终会由发起请求的子类加载器尝试加载。

2. 双亲委派模型的优点

  • 避免重复加载:通过双亲委派模型,可以确保一个类在 JVM 中只会被加载一次,避免了类的重复加载。

  • 安全性:由于类加载器总是先委派给父类加载器,可以防止用户自定义的类替换核心类库中的类,从而保证了 Java 核心类库的安全性。

  • 类的唯一性:双亲委派模型确保了类的唯一性,同一个类在不同的类加载器环境中会被认为是不同的类,从而避免了类冲突。

3. 双亲委派模型的实现

在 Java 中,ClassLoader 类的 loadClass 方法实现了双亲委派模型。以下是 loadClass 方法的简化逻辑:

4. 双亲委派模型的破坏

在某些情况下,双亲委派模型可能会被破坏。例如:

  • SPI(Service Provider Interface)机制:Java 的 SPI 机制允许第三方实现核心类库中的接口,这时需要打破双亲委派模型,使用线程上下文类加载器(Thread Context ClassLoader)来加载实现类。

  • 热部署:在某些应用服务器中,为了实现热部署功能,可能会打破双亲委派模型,允许重新加载类。

5. 总结

双亲委派模型是 Java 类加载机制的核心设计之一,它通过委派机制确保了类的唯一性和安全性。理解双亲委派模型对于深入理解 Java 类加载机制和解决类加载相关的问题非常重要。