一篇文章带你吃透,Java界最神秘技术ClassLoader( 四 )


其次线程的 contextClassLoader 默认是从父线程那里继承过来的,所谓父线程就是创建了当前线程的线程 。程序启动时的 main 线程的 contextClassLoader 就是 AppClassLoader 。这意味着如果没有人工去设置,那么所有的线程的 contextClassLoader 都是 AppClassLoader 。
那这个 contextClassLoader 究竟是做什么用的?我们要使用前面提到了类加载器分工与合作的原理来解释它的用途 。
它可以做到跨线程共享类,只要它们共享同一个 contextClassLoader 。父子线程之间会自动传递 contextClassLoader,所以共享起来将是自动化的 。
如果不同的线程使用不同的 contextClassLoader,那么不同的线程使用的类就可以隔离开来 。
如果我们对业务进行划分,不同的业务使用不同的线程池,线程池内部共享同一个 contextClassLoader,线程池之间使用不同的 contextClassLoader,就可以很好的起到隔离保护的作用,避免类版本冲突 。
如果我们不去定制 contextClassLoader,那么所有的线程将会默认使用 AppClassLoader,所有的类都将会是共享的 。
线程的 contextClassLoader 使用场合比较罕见,如果上面的逻辑晦涩难懂也不必过于计较 。
JDK9 增加了模块功能之后对类加载器的结构设计做了一定程度的修改,不过类加载器的原理还是类似的,作为类的容器,它起到类隔离的作用,同时还需要依靠双亲委派机制来建立不同的类加载器之间的合作关系 。
喜欢对你有帮助的话记得加个关注不迷路哦




推荐阅读