MARK WORD
首先跟大家介绍一下mark word,它是对象头的一部分。其内部存储了hash code,gc分代年龄,标志位,偏向模式,偏向线程ID,指向栈空间的指针
hash code:通过调用Object的hashCode()方法才会把这个值存储到mark word中,重写的不会
标志位:主要用来标志锁的状态(当前是什么级别的锁)以及是否处于GC中
偏向模式:当前对象是否可偏向,如果mark word里已经保存了hash code,由于此时Mark word中没有足够的空间去存储线程id,那么此时就是不可偏向的状态
偏向线程id:如果可偏向,那么此时mark word中就会记录持有偏向锁的线程id
指向栈空间的指针:当锁升级成轻量级锁时,虚拟机会将Mark Word里的数据拷贝到获取到锁的线程栈里去,并把这块栈空间的指针保存到Mark word中
偏向锁
场景
不存在锁竞争,并且对象的Object::hashCode()方法未被调用时
加锁过程
当线程尝试去获取锁时,首先会检查mark word是否可偏向,如果是,则使用CAS操作把当前的线程id记录到Mark word中
优势
重入的时候不需要进行任何同步操作
轻量级锁
场景
存在两条线程竞争锁或者对象的hash code已生成过
加锁过程
- 当有线程尝试获取一个已被占用的偏向锁时,虚拟机在获取到锁的线程栈中开辟一个名为Lock Record的空间,然后会将Mark Word里的数据拷贝到获取到锁的线程栈里去,并把指向Lock Record的指针保存到Mark word中,同时未获取到锁的线程进入自旋
- 当有线程尝试去获取一个未被占用但已经生成过hash code的锁对象时,虚拟机会通过CAS尝试将对象的Mark word更新为指向Lock Recod的指针,更新成功即可进入同步块执行
优势
相对于重量级锁来说,未获取到锁的线程处于自旋状态,不需要进入阻塞队列中,也不需要操作系统互斥量的参与,所以,锁释放时,未获取到锁的线程一般能更快的感知到
重量级锁
场景
存在两条以上的线程竞争锁
特点
在锁释放时需要主动去唤醒未获取到锁的线程
1764

被折叠的 条评论
为什么被折叠?



