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