首先跟大家介绍一下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已生成过
相对于重量级锁来说,未获取到锁的线程处于自旋状态,不需要进入阻塞队列中,也不需要操作系统互斥量的参与,所以,锁释放时,未获取到锁的线程一般能更快的感知到
存在两条以上的线程竞争锁
在锁释放时需要主动去唤醒未获取到锁的线程
因篇幅问题不能全部显示,请点此查看更多更全内容