在我们学习java语言的过程中,双亲委派机制这一知识点是无法避开的,首先就需要我们了解一下其优点在何处?了解之后我们才能清楚为什么要使用双亲委派机制呢。
在理解双亲委派模型之前呢,我们先来了解一下类加载器的种类都有哪些。
先从Java虚拟机的角度来讲,有两种不同的类加载器:启动类加载器和其它类加载器。启动类加载器呢是在HotSpot虚拟机里面去使用C++语言实现的,它是虚拟机的一部分了;除了启动类加载器之外的其它类加载器全部都是由Java语言实现的,并且全部继承自java.lang.ClassLoader类,所以它们是独立于虚拟机外部的。
再从程序开发人员的角度来讲,类加载器是分为四类的:启动类加载器、扩展类加载器、应用类加载器和自定义类加载器。
现在我们再来看看双亲委派模型。
其实所谓的类加载器的双亲委派模型指的就是类加载器之间的层次关系。该模型要求除了顶层的启动类加载器之外,其余的类加载器都是应该有自己的父类加载器的,然而这种父子关系一般通过组合关系来实现,不是通过继承实现的。
当某一个类加载器在接到加载类的请求的时候,首先会将加载任务委托给父类加载器,然后依次去递归,如果父类加载器可以完成类加载的任务,那么就成功返回;如果说父类加载器没有办法完成加载的任务,就会在抛出ClassNotFoundException异常后,再调用自己的findClass()方法去进行加载,依次去类推即可。
双亲委派模型的好处有哪些呢?
其实它的好处可以用一句话总结:防止内存里面出现多份同样的字节码。
我们可以从反向思考这个问题,如果说没有双亲委派模型而是由各个类加载器自行加载的话,例如用户编写了一个java.lang.Object的同名类并放在ClassPath里面,多个类加载器都要去加载这个类到内存中,那么系统中将会出现多个不同的Object类,类之间的比较结果及类的唯一性就将无法保证了,而且如果不使用这种双亲委派模型是将会给虚拟机的安全带来隐患的。所以说,要让类对象进行比较的有意义,前提就是他们要被同一个类加载器加载。
那么以上就有关双亲委派机制的所有内容了,还想了解更多java常见问答知识记得多多关注本站消息哦。
推荐阅读: