1)一图秒懂对象头
Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能,这些标记字段组成了对象头。
2)锁升级过程
markword里记录了锁信息,hashcode,gc的信息,所谓的synchronized就是修改了对象的markword。
JDK8 markword实现表(64位)
无锁 - 偏向锁 - 轻量级锁 (自旋锁,自适应自旋)- 重量级锁
synchronized优化的过程和markword息息相关
用markword中最低的三位代表锁状态 其中1位是偏向锁位,两位是普通锁位
如果有线程上锁:
上偏向锁,指的就是,把markword的线程ID改为自己线程ID的过程
偏向锁不可重偏向 批量偏向 批量撤销
如果有线程竞争:
撤销偏向锁,升级轻量级锁
线程在自己的线程栈生成LockRecord ,用CAS操作将markword设置为指向自己这个线程的LR的指针,设置成功者得到锁
如果竞争加剧(轻量级锁–>重量级锁)
竞争加剧:有线程超过10次自旋, 或者自旋线程数超过CPU核数的一半, JDK1.6之后,加入自适应自旋 Adapative Self Spinning , JVM自己控制。
升级重量级锁:-> 向操作系统申请资源,CPU从3级-0级系统调用,线程挂起,进入等待队列,等待操作系统的调度,然后再映射回用户空间
锁升级的过程
JDK较早的版本 OS的资源 互斥量 用户态 -> 内核态的转换 重量级 效率比较低
现代版本进行了优化
无锁 - 偏向锁 -轻量级锁(自旋锁)-重量级锁
参考B站马士兵:《Java多线程与高并发》