问题:对象调用hashCode方法后,还会开启偏向锁模式吗

HotSpot 虚拟机在启动后有个 4s 的延迟才会对每个新建的对象开启偏向锁模式。
偏向锁会撤销
调用锁对象的obj.hashCode()或System.identityHashCode(obj)方法会导致该对象的偏向锁被撤销。因为对于一个对象,其HashCode只会生成一次并保存,偏向锁是没有地方保存hashcode的

  • 轻量级锁会在栈中记录中记录 hashCode
  • 重量级锁会在 Monitor 中记录 hashCode

当对象处于可偏向(也就是线程ID为0)和已偏向的状态下,调用HashCode计算将会使对象再也无法偏向:

  • 当对象可偏向时,MarkWord将变成未锁定状态,并只能升级成轻量锁;
  • 当对象正处于偏向锁时,调用HashCode将使偏向锁强制升级成重量锁。

    问题:调用wait/notify会导致偏向锁撤销

    调用obj.wait(timeout) 会升级为重量级锁;
    偏向锁状态执行obj.notify() 会升级为轻量级锁。

    问题: 轻量级锁是否可以降级为偏向锁?

    不可以
    锁获取与释放过程
    无锁—>轻量级。
    锁释放:轻(重)锁—>无锁