• 锁升级的整体过程(锁撤销)
  • hashCode在无锁的MarkWord中有记录,但是锁升级后存放在哪里了?
  • LockRecord中拷贝的MarkWord到底是什么样子的
  • 重量级锁拷贝的MarkWord是什么样子的

    锁升级的整体过程

    这块我用流程图也大致画了出来,但是有点地方还是不通。
  1. 偏向锁撤销
    1. 到底是哪个线程升级成了轻量级锁?是原持有偏向锁的线程,还是提出撤销偏向锁的线程,还是其他线程
    2. 偏向锁被撤销了,原持有偏向锁的线程是否必定能够先于其他竞争者获得轻量级锁
  2. 轻量级锁

    1. 偏向锁的话必没有Object那里继承的hashcode,但是轻量级锁是可以有,来自那里。轻量级复制MarkWord时,MarkWord是什么样子。如果是有 identified hash code 我认为必是复制的无锁状态的MarkWord。但是替换回去怎么替换。替换成无锁吗?那不就是降级了吗?

      hashCode在无锁的MarkWord中有记录,但是锁升级后存放在哪里了?

  3. 计算过hashCode的对象不会进入偏向锁状态,也就有要么轻量级锁或重量级锁

    1. 轻量级锁:带有hashCode的MarkWord存储在LockRecord
    2. 重量级:带有hashCode的MarkWord存储在Monitor对象中
  4. 处于偏向锁的对象,调用了hashCode计算,会立刻膨胀为轻量级锁
    1. 重量级锁的话,堆中的MarkWord是一成不变的了,所有的等待线程都在Monitor对象中玩
    2. 轻量级锁的话,我一直没搞懂居然记录有hashCode的MarkWord的话就是无锁的。那么CAS替换回去不就是无锁了吗??

LockRecord中拷贝的MarkWord到底是什么样子的

这个在《Java并发编程艺术》书中看到,是无锁状态的MarkWord。这样就能解释轻量级锁时也可以查看identified hash code了。但是解锁时CAS替换回去怎么说,那不就又成了无锁吗?不是说不可降级吗?

重量级锁拷贝的MarkWord是什么样子的

https://blog.sakuradon.com/archives/985/
热心网友说也是记录着无锁状态下的MarkWord
且这个Monitor对象,会记录着

  • 等待(sleep,wait)的线程
  • owner:正在执行线程
  • 阻塞线程:等待锁的线程