优化点:获取锁的时候更方便。
如果支持偏向锁(没有计算hashcode),那么在分配对象时,会分配一个可偏向但未偏向的对象。
- 偏向锁处于未偏向状态,CAS将MarkWord中线程ID设置为自己线程的ID
- 成功。获取偏向锁成功。
- 失败。锁升级。
- 偏向锁处于已偏向状态
- MarkWord中线程ID是自己线程ID,成功获取锁
- 不是自己ID,锁升级
偏向锁的锁升级需要进行偏向锁的撤销。
- MarkWord指向线程不存活
- 允许重偏向:退回为可偏向但未偏向状态
- 不允许重偏向:变为无锁状态
- 指向线程存活
- 线程仍然拥有锁,升级为轻量级锁,将MarkWord复制到线程栈中
- 线程不再拥有锁,分为允许重偏向/不允许