java多线程-线程上下文加载器
获取线程上下文加载器
public class App {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getContextClassLoader());
}
}
结果:
jdk.internal.loader.ClassLoaders$AppClassLoader@659e0bfd
为什么需要线程上下文加载器?
这与JVM类加载器双亲委托机制自身的缺陷有关。JDK的核心库存中提供了很多 SPI(Service Provider Interface), 常见的SPI 包括JDBC、JNDI…,但是没有提供具体的实现,具体的实现需要由第三方来提供。举例来说,JDBC的实现,JDK在 java.lang.sql
中的所有接口都是由JDK提供的,加载用品喜欢接口的类加载器是根加载器(BootClassLoader),第三方厂商提供的类库驱动则是由系统加载器(AppClassLoader)加载的。由于JVM加载器的双亲委托机制,第三方的JDBC驱动包的实现不会被加载。
所以解决这个问题的核心就是线程上下文加载器,有了线程上下文加载器,根加载器就可以依托子类加载器去加载厂商提供的SPI的具体实现, 线程上下文加载方式打破了双亲委托机制的模型