zoukankan      html  css  js  c++  java
  • 理解类加载的双亲委派模型

    类加载器

    • 启动类加载器 BootstrapClassLoader
    • 扩展类加载器 ExtensionClassLoader
    • 系统类加载器(应用程序类加载器) AppClassLoader

    Java API doc 表述

    The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a "parent" class loader. When loading a class, a class loader first "delegates" the search for the class to its parent class loader before attempting to find the class itself.

    思考理解

    • 只有当父加载器在自己搜索范围内找不到特定的类时(即ClassNotFoundException), 子加载器才会尝试自己去加载

    • 双亲委派中的"双"并不特指父亲母亲, 而是泛指父辈, 即父类加载器(是不是叫父类/基类委派更贴切?或者干脆叫啃老委派?)

    • 设计缘由:

      • 避免类的重复加载, Java类随着它的类加载器一起具备了一种带有优先级的层次关系, 对于已被父加载器加载过的类, 子加载器没必要重新加载一次

      • 安全性, 最基础的类一定是由最上层的类加载器实现加载的, 不允许用户使用自定义加载器在加载基础类的时候扩展自定义的操作

    • 破坏双亲委派模型

      • SPI(Service Provider Interface) 接口是Java核心库的一部分, 是由启动类加载器来加载的, 提供"为某个接口寻找服务实现的机制"

      • 而SPI的实现是由各供应厂商来完成, 实现类是由系统类加载器来加载的, 按双亲委派模型, 启动类加载器无法委派系统类加载器去加载类

      • 线程上下文类加载器(Context class loader, JDK1.2), Java应用的线程上下文加载器默认就是系统类加载器AppClassLoader, 可通过 Thread 的 setContextClassLoader 方法设置线程的上下文类加载器

      • 案例: JDBC驱动注册

    资料参考

  • 相关阅读:
    Python——极限编程
    RPC是什么?科普一下
    缓存在高并发场景下的常见问题
    如何提高缓存命中率
    数据库性能优化的误区
    缓存在大型网站架构中的应用
    APP多版本共存,服务端如何兼容?
    水平分库分表的关键问题及解决思路
    分库分表的几种常见玩法及如何解决跨库查询等问题
    分布式系统事务一致性解决方案
  • 原文地址:https://www.cnblogs.com/peiqianggao/p/12665038.html
Copyright © 2011-2022 走看看