- 锁升级的整体过程(锁撤销)
- hashCode在无锁的MarkWord中有记录,但是锁升级后存放在哪里了?
- LockRecord中拷贝的MarkWord到底是什么样子的
- 重量级锁拷贝的MarkWord是什么样子的
锁升级的整体过程
这块我用流程图也大致画了出来,但是有点地方还是不通。
- 偏向锁撤销
- 到底是哪个线程升级成了轻量级锁?是原持有偏向锁的线程,还是提出撤销偏向锁的线程,还是其他线程
- 偏向锁被撤销了,原持有偏向锁的线程是否必定能够先于其他竞争者获得轻量级锁
轻量级锁
计算过hashCode的对象不会进入偏向锁状态,也就有要么轻量级锁或重量级锁
- 轻量级锁:带有hashCode的MarkWord存储在LockRecord
- 重量级:带有hashCode的MarkWord存储在Monitor对象中
- 处于偏向锁的对象,调用了hashCode计算,会立刻膨胀为轻量级锁
- 重量级锁的话,堆中的MarkWord是一成不变的了,所有的等待线程都在Monitor对象中玩
- 轻量级锁的话,我一直没搞懂居然记录有hashCode的MarkWord的话就是无锁的。那么CAS替换回去不就是无锁了吗??
LockRecord中拷贝的MarkWord到底是什么样子的
这个在《Java并发编程艺术》书中看到,是无锁状态的MarkWord。这样就能解释轻量级锁时也可以查看identified hash code了。但是解锁时CAS替换回去怎么说,那不就又成了无锁吗?不是说不可降级吗?
重量级锁拷贝的MarkWord是什么样子的
https://blog.sakuradon.com/archives/985/
热心网友说也是记录着无锁状态下的MarkWord
且这个Monitor对象,会记录着
- 等待(sleep,wait)的线程
- owner:正在执行线程
- 阻塞线程:等待锁的线程