一、为什么会有这种机制?
类加载器将.class类加载到内存中时,为了避免重复加载(确保Class对象的唯一性)以及JVM的安全性,需要使用某一种方式来实现只加载一次,加载过就不能被修改或再次加载。
二、什么是双亲委派机制?
(1)当加载一个类时,先判断此类是否已经被加载,如果类已经被加载则返回;
(2)如果类没有被加载,则先委托父类加载(父类加载时会判断该类有没有被自己加载过),如果父类加载过则返回;如果没被加载过则继续向上委托;
(3)如果一直委托都无法加载,子类加载器才会尝试自己加载。
三、如何理解双亲委派机制?
假设有一个村子,所有人都有一个独立的名字,不允许重复。
这一天赵四生了个大儿子,想叫他王二麻子(包名类型都相同),赵四不知道王二麻子这个名字是否重复,但是看看自己同辈的里面没有重名的(在这一级别类加载中没有同包同类的),赵四又问他爹赵老三,赵老三看了看同辈中人说,你隔壁王叔叔不就叫王二麻子嘛(此时出现了同包同类名的人),然后说不能叫,已经有人叫了,如果村里有人提王二麻子都认你王叔,你儿子就成了隐形人了。
如何理解Tomcat会打破双亲委派机制?
赵四第二年又喜得双胞胎,这次是他跟另外一个媳妇(Tomcat)生的,赵四虽然是个比较保守但是也很创新,考虑在给孩子起名字的时候打破常规一下,在不予上辈祖宗重名的基础上(java中的基类还是遵循双亲委派机制),给两个孩子取名狗儿,虽然两个孩子几乎一模一样(有大量的包类名相同),但赵四做了一下区分,分为大狗和小狗(一人一个类加载器,互不干涉),虽然大狗小狗很像,但是是两个独立的个体