类加载锁(ClassLoadingLock),用于类加载的并发控制锁
最编程
2024-03-09 10:56:25
...
死锁
在JDK1.7以前,java.lang.ClassLoader的一些核心方法是被synchronized修饰的,比如loadClass,以下摘自JDK6下java.lang.ClassLoader的部分方法:
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {...}
private synchronized Class loadClassInternal(String name) throws ClassNotFoundException {...}
private synchronized void checkCerts(String name, CodeSource cs) {...}
private static synchronized void initSystemClassLoader() {...}
在传统的双亲委派模型下,使用synchronized来做并发控制是没有问题的,但是如果出现类加载相互依赖的情况,就容易出现死锁。一个典型的例子就是OSGI的多个模块相互依赖对方发布的package,当一个模块需要加载依赖的package时,需要委派给发布该package的模块类加载器加载。关于OSGI简介可以参考:《深入理解Java虚拟机》读书笔记(八)--类加载及执行子系统案例(Tomcat类加载、OSGI、动态代理)。如果出现以下情况