关于类加载的并发控制锁(ClassLoadingLock)

本文探讨了在JDK1.7之前,由于类加载器的synchronized修饰可能导致的死锁问题,特别是在OSGI环境中。在JDK1.7之后,通过引入并行加载能力注册和类文件全路径名对应的锁对象来优化并发控制,避免了死锁,提高了类加载的效率。
摘要由CSDN通过智能技术生成

死锁

在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、动态代理)。如果出现以下情况

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值