Skip to content

Latest commit

 

History

History
76 lines (19 loc) · 910 Bytes

偏向锁.md

File metadata and controls

76 lines (19 loc) · 910 Bytes

偏向锁

优化点:获取锁的时候更方便。

如果支持偏向锁(没有计算hashcode),那么在分配对象时,会分配一个可偏向但未偏向的对象。

加锁过程

  • 偏向锁处于未偏向状态,CAS将MarkWord中线程ID设置为自己线程的ID
    • 成功。获取偏向锁成功。
    • 失败。锁升级。
  • 偏向锁处于已偏向状态
    • MarkWord中线程ID是自己线程ID,成功获取锁
    • 不是自己ID,锁升级

锁升级

偏向锁的锁升级需要进行偏向锁的撤销。

锁撤销

  • MarkWord指向线程不存活
    • 允许重偏向:退回为可偏向但未偏向状态
    • 不允许重偏向:变为无锁状态
  • 指向线程存活
    • 线程仍然拥有锁,升级为轻量级锁,将MarkWord复制到线程栈中
    • 线程不再拥有锁,分为允许重偏向/不允许