欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

类加载锁(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、动态代理)。如果出现以下情况