基于《深刻理解java虚拟机》类加载过程整理java
注意:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。 数据结构
动态加载?spa
类加载器线程
1 启动类加载器(Bootstrap ClassLoader):有C++语言实现,负责加载AVA_HOME/lib文件夹的类,或者被Xbootclasspath参数指定的路径中的类指针
2 扩展类加载器(Extension ClassLoader),java语言实现,负责加载JAVA_HOME/lib/ext文件夹下的类对象
3 应用程序加载器(Application ClassLoader):sun.misc.Launcher$AppClassLoader,负责加载classpath路径的类继承
双亲委派模型接口
双亲委派模型是每一个类加载器(除了顶级加载器--启动类加载器)收到类的加载请求,首先不是本身去查找加载该类,而是委派给父类,每一层的类加载器都是如此,知道顶级类加载器,只有当顶级类加载器反馈本身也找不到该类,子类才尝试本身加载该类内存
内存模型同步
分主内存和线程的工做内存
1 线程先从内存复制一份变量的副本,而后变量的写操做在线程的工做内存中完成,当线程执行完毕则将内存中变量副本的值更新下到主内存中
注意:线程与线程是互相独立,线程不能直接访问其余线程工做内存的变量
volatile是保证内存的可见性在于两点
①线程每次使用该变量前都是去主内存刷新一次
② 线程每次修改变量,都会当即同步到主内存