一、锁升级过程
java
1、检测所对象的MarkWord里面,锁标志位01,无偏向。这是JVM给的初始值。
2、使用CAS将当前线程的ID替换MardWord的【锁线程ID】,如果成功则表示当前线程获得偏向锁,置偏向标志位01,
3、如果失败,则说明发生竞争,撤销偏向锁,进而升级为【轻量级锁】
4、多次尝试,通过当前线程使用CAS将对象头的MarkWord替换为锁记录指针,如果成功,当前线程获得锁,则依然处于轻量级状态。
5、如果自旋失败,并且超过自选次数5次,则升级为【重量级锁】。
二、Synchronized既是乐观也是悲观
java
偏向锁、轻量锁、自旋锁都属于乐观锁。
重量级锁-Synchronized属于悲观锁
自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,
且占用锁时间非常短的代码块来说性能能大幅度的提升,
因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,
JVM有个很重要的参数就是自旋次数。
锁的内存模型
HotSpot是java的虚拟机,对象在内存中的存储分为三块区域:
1、对象头
2、实例数据
3、对齐填充
其中对象头又分为三块:markword、Klass Pointer、ArrayLength(假如对象为数组)
1、markword中包含了和Java对象息息相关的一些信息,它的实际大小一般和CPU字长保持一致,如在32位CPU上markword的大小一般为32位,即4字节。而在64位CPU上markword的大小一般为64位,即8字节
2、Klass Pointer Class 对象的类型指针,它指向对象对应的Class对象的内存地址。大小占4字节
在面试中,关于Markword的问题是非常常见的。以下是一些可能问到的问题:
1、什么是Markword?它在内存分配和垃圾回收中的作用是什么?
对象在内存的结构主要是3大块,对象头,实例数据,对其填充,对象头主要包含两大块,markwork和kclass point
2、Markword的存储结构是什么?
HashCode+分代年龄+锁标识
3、Markword的大小通常是多少?
4、Markword的锁标志位有什么作用?
偏向锁01 轻量级00 重量锁10
marwork这个文档写的很细介绍marwork
关于MarkWord面试相关MarkWord面试