搜索
您的当前位置:首页java里的锁机制(偏向锁,轻量级锁,重量级锁)

java里的锁机制(偏向锁,轻量级锁,重量级锁)

来源:乌哈旅游

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的指针,更新成功即可进入同步块执行

优势

相对于重量级锁来说,未获取到锁的线程处于自旋状态,不需要进入阻塞队列中,也不需要操作系统互斥量的参与,所以,锁释放时,未获取到锁的线程一般能更快的感知到

重量级锁

场景

存在两条以上的线程竞争锁

特点

在锁释放时需要主动去唤醒未获取到锁的线程

因篇幅问题不能全部显示,请点此查看更多更全内容

Top