Jvm 为什么偏锁使用不同的标记词和轻量级锁

Jvm 为什么偏锁使用不同的标记词和轻量级锁,jvm,locking,Jvm,Locking,当一根线保持一个固定的锁定。标记字是线程id。 但是对于轻量级锁定,标记字是指向线程的堆栈指针,为什么不仍然存储线程id?瘦锁模式假定锁定对象的标记字指向锁定此对象的帧的堆栈槽。此堆栈插槽存储原始对象标头(也称为置换标头) 显然,堆栈槽比线程ID携带更多的信息,因为您可以从堆栈槽派生线程ID,但反之亦然 与有偏见的模式不同,在模式中,解锁操作实际上是一个no-op,当对象被解锁时,瘦锁需要恢复原始头。这变得非常简单,因为标记字已经指向具有原始值的堆栈槽。查找线程id非常重要。您说过“显然堆栈槽携

当一根线保持一个固定的锁定。标记字是线程id。
但是对于轻量级锁定,标记字是指向线程的堆栈指针,为什么不仍然存储线程id?

瘦锁模式假定锁定对象的标记字指向锁定此对象的帧的堆栈槽。此堆栈插槽存储原始对象标头(也称为置换标头)

显然,堆栈槽比线程ID携带更多的信息,因为您可以从堆栈槽派生线程ID,但反之亦然


与有偏见的模式不同,在模式中,解锁操作实际上是一个no-op,当对象被解锁时,瘦锁需要恢复原始头。这变得非常简单,因为标记字已经指向具有原始值的堆栈槽。

查找线程id非常重要。您说过“显然堆栈槽携带的信息比线程id多”,但正如我所知,堆栈槽携带有关此对象的哈希代码和生成年龄的信息,此信息用于精简锁定的内容是什么?@user10570334我的意思是堆栈插槽允许您保存和还原以前的对象标头。当对象解锁时,精简锁定需要还原原始标头,那么精简锁定仍将保存以前的对象标头?这有什么用?@user10570334 Locking:mark word保存在堆栈上(以便稍后恢复),然后使用表示“对象已锁定”的位和堆栈指针进行修改,以了解哪个线程已锁定此对象。解锁:标记字将替换为堆栈上保存的上一个值。如果精简锁定存储线程id,则锁定:保存已锁定此对象的线程id。解锁:将螺纹id替换为-1。为什么不可以呢?
    Unlocked:
    [ orig_header | 001 ]       | Stack frame |
                                |             |
    Locked:                     |             |
    [ stack_ptr   | 000 ]       |             |
         |                      |-------------|
          --------------------->| orig_header |
                                |-------------|
                                |             |
                                |             |
                                 -------------