双亲委派模型有感(深入理解jvm)

痴心易碎 提交于 2020-04-12 18:08:54

类加载的双亲委派模型

从顶向底依次的类加载器为:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器。

原理:当执行一个类加载请求时,类加载器自底向顶委派加载任务,委派失败再自己搞定,这一思想真是智慧,实现简单又能解决程序中各种混乱同名类的问题,很好地对基础类进行了统一的管理。当然,没有完美的设计,文中列举的三次模型被破坏,都是人们对更优秀程序需求导致的,而每次的解决方案也都很有意思。
第一次:为了兼容在引入双亲委派模型之前就存在的用户自定义类,设计出重写findClass()方法,自定义的类加载逻辑在这里面实现,而双亲委派思想在loadClass()中实现,再由它调findClass()。这里就体现了一个公用不变逻辑抽象抽离的思想。
第二次:该模型有一个核心就是最基础的先加载,以供用户代码使用。然而引入JNDI后,却出现了需要在基础类中调用用户代码的场景。于是有了线程上下文类加载器,虽然文中说是不太优雅的设计,但我觉得还是挺聪明的,对于需要加载SPI具体实现的场景,系统加载器够不着用户代码,就委托给线程上下文类加载器,而这个加载器默认情况返回的就是应用程序类加载器,由此实现父到子的逆向调用。也可以自己设置线程上下文类加载器。
第三次:由于对程序热部署模块化即插即用的需求,每次用户代码改变,类加载都走一套自底向顶委派的模型显然无法满足。所以结合原有树状模型再拓展出其余网状结构,委派的动作可以在同级同层传递,就无需重启程序一层一层向上禀报。OSGI就是这一思想的实现。

总之,感慨下人们的智慧是无穷的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!