问题区
- 为什么多线程的模式下,单列模式变量会出现问题
- 类加载机制的过程
- 常用的加载器有那些
- 类加载机制
- GC算法和收集器
- 调优
一、线程并发情况下,单列模式存在问题
线程并发的时候,读取单列模式的对象,可能会存在数据未初始化完成的情况就被调用 原因有2
一,对象的加载顺序
对象的加载过程如下
1.加载 将.class文件从磁盘读到内存
2.连接
2.1 验证 验证字节码文件的正确性
2.2 准备 给类的静态变量分配内存,并赋予默认值
2.3 解析 类装载器装入类所引用的其它所有类
3.初始化 为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,
此处赋予的才是程序编写者为变量分配的真正的初始值,执行静态代码块
4.使用
5.卸载
并发的单列模式下,当对象已经不为null的时候,线程对对象进行调用,但是此时的对象属性还没有真正的进行赋值,只是有默认值
2 ,指令重排
程序的运行都是按照编译好的代码按照程序计数器的指针,逐行运行,并发情况下,出现运行行数的变换,解决方法是使用Java中的 volatile 关键字 对静态变量进行修饰,目的是使每个线程访问获取的值都是相同的
且对单列对象 类进行双重synchronized 加锁 null判断
后期补充一个完整的单列模式的代码
二、常用的加载器有那些
启动类加载器(Bootstrap ClassLoader)
负责加载JRE的核心类库,如JRE目标下的rt.jar,charsets.jar等
扩展类加载器(Extension ClassLoader)
负责加载JRE扩展目录ext中jar类包
系统类加载器(Application ClassLoader)
负责加载ClassPath路径下的类包
用户自定义加载器(User ClassLoader)
负责加载用户自定义路径下的类包