java 虚拟机知识记录

问题区

  1. 为什么多线程的模式下,单列模式变量会出现问题
  2. 类加载机制的过程
  3. 常用的加载器有那些
  4. 类加载机制
  5. GC算法和收集器
  6. 调优

一、线程并发情况下,单列模式存在问题
线程并发的时候,读取单列模式的对象,可能会存在数据未初始化完成的情况就被调用 原因有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)

负责加载用户自定义路径下的类包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值