一、调用对象 hashCode

调用了对象的 hashCode,但偏向锁的对象 MarkWord 中存储的是线程 id,如果调用 hashCode 会导致偏向锁被撤销。
此时如果发生锁升级,会直接是轻量级锁

  • 轻量级锁会在锁记录中记录 hashCode
  • 重量级锁会在 Monitor 中记录 hashCode
  • 而如果是偏向锁在markWord中记录了hashcode后,就没有位置再去记录线程id了,所以就直接由无锁升级为轻量级锁

二、其它线程使用对象

  • 当有其它线程使用偏向锁对象时,会将偏向锁升级为轻量级锁

三、调用 wait/notify

会直接关联monitor对象,升级为重量级锁