- BootStrapClassLoader,这是根类加载器,是由C++语言实现的,java语言是获取不到这个类加载器的。这个类加载器一般加载核心类库,比如rt.jar
- ExtClassLoader,父类加载器是BootStrapClassLoader。这个类加载器一般加载一些扩展类
- AppClassLoader,父类加载器是ExtClassLoader。这个类加载器也被叫做系统类加载器,用于加载我们自己写的代码和添加的jar包中的代码。
扩展
这里有个精彩的点,Unsafe类中有个getUnsafe方法,这个方法就巧妙用到了这个类加载器。
- 逻辑:如果由方法调用getUnsafe方法,就会通过反射获取调用类的类加载器,如果为空,则调用成功。如果不为空,则抛出异常。
- 原理:这个利用的就是BootStrapClassLoader加载器获取不到,必然返回Null。我们代码的类加载器是AppClassLoader,能加载到这个类加载器,所以不返回null。
这就是源码可以用getUnsafe方法获取Unsafe的实例,但是我们不能用的原因。
Unsafe类里面有个CAS,这个是乐观锁,源码中用的比较多