1. 什么是双亲委托机制
双亲委托的含义:
1) 加载的顺序固定---引导类加载器--》扩展类加载器--》应用类加载器---》自定义类加载器
2) 当我们使用扩展类加载器加载某个类的时候,若引导类加载器已经加载的该类,就不会继续加载过程
3) 下一级类加载器的加载过程依赖上一级类加载器
4)jdk核心class只能被加载一次
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个请求时,子加载器才会尝试自己去加载。
2. tomcat的类加载机制
3. 双亲委托能否满足tomcat的业务需求
1) tomcat需要保证各个web项目的类独立加载,不同项目的相同jar可能版本不一致,需要保持依赖Jar相互独立
2) web容器依赖的类库与web项目依赖的类库隔离
3)jsp热部署的实现
默认的类加载机制需要保证class的唯一性,不能满足上述需求,也不能实现热部署。需要自定义类加载器。
4. tomcat如何解决class隔离问题
线程上下文加载器: 父类加载器请求子类加载器去完成类加载的动作,完成逆向双亲委托加载流程。
线程上下文类加载器(Thread Context ClassLoader):这个类加载器可以通过java.lang.Thread类的setContextClassLoader方法进行设置。如果创建线程时还未设置,它将会从父线程中继承一个,如果在应用程序的全局范围内都没有设置过的话,那这个类加载器默认即使应用程序类加载器。